Сейчас на форуме: -Sanchez-, morgot, sashalogout (+3 невидимых)

 eXeL@B —› Софт, инструменты —› x64dbg отладчик
<< 1 ... 18 . 19 . 20 . 21 . 22 . 23 . >>
Посл.ответ Сообщение

Ранг: 7.7 (гость), 51thx
Активность: 0.010
Статус: Участник

Создано: 11 декабря 2013 11:49 · Поправил: Ra1n0
· Личное сообщение · #1

Актуальные ссылки:

sourceforge.net
http://x64dbg.com
https://github.com/x64dbg/x64dbg
scyllahide

Документациия по отладчику - --> Link <--

Новый проект от Mr.eXoDia и др.

Features:

Open-source
Intuitive and familiar, yet new user interface
C-like expression parser
Full-featured debugging of DLL and EXE files (TitanEngine)
IDA-like sidebar with jump arrows
IDA-like instruction token highlighter (highlight registers etc.)
Memory map
Symbol view
Thread view
Content-sensitive register view
Fully customizable color scheme
Dynamically recognize modules and strings
Import reconstructor integrated (Scylla)
Fast disassembler (BeaEngine)
User database (JSON) for comments, labels, bookmarks etc.
Plugin support with growing API
Extendable, debuggable scripting language for automation
Multi-datatype memory dump
Basic debug symbol (PDB) support
Dynamic stack view
Built-in assembler (XEDParse)
View your patches and save them to disk
Built-in hex editor
Find patterns in memory






| Сообщение посчитали полезным: ff0h, Gideon Vi, nick8606, Artem_N, JKornev, DimitarSerg, daFix, Rio, n0x90, DenCoder, Maximus, ELF_7719116, exprxp, Error13Tracer, Gerpes, SDFnik, VanHelsing, marius, jangle, hello, Bronco, mushr00m, HandMill, Johnatalbi, kassane, BAHEK, zNob, mkdev, Haoose-GP, HAOSov, mr qubo, Tyrus, kurorolucifer, Relax_, esa_r, Styx, Creckerhack, RootKey, RoKZaR, CKAP, Cigan, tRuNKator, Wargrinder, morgot, BiteMoon, mak, Illuzion

Ранг: 62.5 (постоянный), 34thx
Активность: 0.280.96
Статус: Участник

Создано: 15 апреля 2020 12:40 · Поправил: _MBK_
· Личное сообщение · #2

Снова ужасно извиняюсь перед сообществом за следующий ламерский вопрос
Есть конструкция вида
Code:
  1. bt dword ptr [6884868],eax
  2. jae ...

По идее, должна проверять состояние бита eax в переменной 6884868 и в зависимости от его состояния переход или делать или нет - так?
По факту [6884868]=0x7DFE0298
Подставляю разные eax и пробую
eax=0 переход есть
eax=1 переход есть
eax=2 перехода нет
eax=3 перехода нет
eax=4 переход есть
eax=5 переход есть
eax=6 перехода нет
eax=7 перехода нет
...
то есть явно битовой карте не соответствует
хорошо, же, ставлю [6884868]=0xFFFFFFFF
И, о чудо, логика не меняется!
Кто тупит - я, отладчик или мне морочит голову какая то замаскированная ловушка?



Ранг: 43.1 (посетитель), 20thx
Активность: 0.160.29
Статус: Участник

Создано: 15 апреля 2020 12:53 · Поправил: user99
· Личное сообщение · #3

у меня работает в соответствии с маской



Ранг: 62.5 (постоянный), 34thx
Активность: 0.280.96
Статус: Участник

Создано: 15 апреля 2020 13:38
· Личное сообщение · #4

Забыл добавить, видимо, важную деталь
6884868 - это в сегменте кода
Поменял этот адрес на стек - логика переходов стала правильной
То есть, мне все таки морочит голову некая невидимая хрень? Какие вообще могут быть идеи на этот счет?




Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 16 апреля 2020 01:06 · Поправил: Bronco
· Личное сообщение · #5

возник вопрос по
BRIDGE_IMPEXP void GuiAddStatusBarMessage(const char* msg);
точнее как в кьюте устроен статус бар.
по идее данные должны просто обновляться,
но тут фуйня какая то, если в конце const char* не переноса строки(\n),
созерцаем накопление данных в статус баре. х с ним, переносом строки как бы решается.
но возникает другой вопрос, а что с прежней строкой?
пытаюсь найти утечку,и не могу вкурить, асмджит на старте асмит просто в режиме турбо, пох лям, два, или три, инструкций.
а со вторым заходом, такого турбо нет.
в джите есть только резет и де_аттач, да и не думается, что если не сбрасывать CodeHolder, в нём будет накапливаться прежний поток.

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 16 апреля 2020 08:58 · Поправил: Vamit
· Личное сообщение · #6

Bronco
StatusBar однострочный и не имеет строкового буфера, поэтому если туда пишешь быстрее чем можешь прочитать взглядом, то новая строка затирает предыдущую. Чтобы увидеть все строки пиши в окно лога, а в статус только стадии обработки (их можно продублировать и в лог для ориентации).
Есть ещё момент, окна гуи отрисовываются функой синхронизации, которая периодически вызывается потоком, если до момента отрисовки записать несколько строк в одно место, то при отрисовке увидишь только последнюю строку.

-----
Everything is relative...





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 16 апреля 2020 09:38
· Личное сообщение · #7

Vamit, но тогда получается что в конце мсг, символ переноса строки не нужен.
а у меня без него длинная борода в статус баре.
если это не статус_бар, тогда хз что делать с асмджитом,
с каждым новым проходом он асмит медленней.
по обновлению инфы в статус баре, это очень заметно.
проверил патчер, он в зеро, выделенная память на выходе из цикла, меньше чем на старте.
млять загадка.

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 16 апреля 2020 10:26
· Личное сообщение · #8

но тогда получается что в конце мсг, символ переноса строки не нужен.
В статусе нужен, если его нет то новая строка пристыковывается к старой, иначе затирает старую.
с каждым новым проходом он асмит медленней
чтобы скорость твоей обработки была максимальной нужно запускать её отдельным потоком и синхронизовать его вывод с гуи, тогда всё будет работать очень быстро - гуи отдельно, твой обработчик отдельно.
Данный метод обкатан на свипере, быстродействие выросло почти в 30 раз.

-----
Everything is relative...


| Сообщение посчитали полезным: Bronco


Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 16 апреля 2020 11:22 · Поправил: Bronco
· Личное сообщение · #9

Vamit, на быстродействие особо не жалуюсь.
и не уверен что будет быстрее, stl контейнер имеет свои пределы скорости обхода узлов.
кол-во имеет значение.
хотя на самом деле и сравнить то не с чем.
если у тебя в отдельном потоке, включая диз_парс_асм, получается обработать минимум миллион инструкций, быстрее чем за 30 - 40 сек.
я готов изменить мнение, и глянуть на твой вариант много поточности. с семплом мистера эксодиа, ещё медленей.
но за советы спасибо.

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 16 апреля 2020 12:07 · Поправил: ClockMan
· Личное сообщение · #10

Bronco пишет:
с семплом мистера эксодиа

библиотека asmjit.dll 2017 года подпись, и она не обрабатывает некоторые инструкции типа instr xmm2, xmm2
во вторых он переводит стороку кода в опкод, который может быть длинее оригинального на 3-5 байт, или вообще укорачивает его
Code:
  1. 48:83C8 FF         or rax, 0xFFFFFFFFFFFFFFFF
  2. 48:0D FFFFFFFF  or rax, 0xFFFFFFFFFFFFFFFF


-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 16 апреля 2020 12:27 · Поправил: Bronco
· Личное сообщение · #11

ClockMan пишет:
библиотека asmjit.dll 2017 года подпись

на паблике не так уже и много доступных асмдвигов.
джит сапортится, ну и посвежее кейстоуна и ксед_парсе будет.
у меня нареканий, кроме как к двойным нопам нет. ну из них он какие то асмит
если атач не прицепился, могу залить обновлённые библы для дбг отдельно.//не приципился
ну у меня со своими патчами--> Link <----> Link <--
проверил твой семпл

Code:
  1. джит:
  2. 00000001518F7064 | 48 83 C8 FF                 | OR RAX, 0xFFFFFFFFFFFFFFFF
  3. ксед_парсе
  4. 00000001518F7068 | 48 0D FF FF FF FF           | OR RAX, 0xFFFFFFFFFFFFFFFF  
  5. кейстоун
  6. 00000001518F706E | 48 83 C8 FF                 | OR RAX, 0xFFFFFFFFFFFFFFFF 

что то ты попутал, это ксед таким грешит, добавляя к знаку ещё один знак..

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 16 апреля 2020 12:55 · Поправил: ClockMan
· Личное сообщение · #12

Bronco
Просто не тот пример привёл во
Code:
  1. оригинал
  2. 48:8B05 F2E0ADF4        mov rax,qword ptr [1442C0130]
  3. копия
  4. 48:A1 30012C4401000000  mov rax,qword ptr [1442C0130]


-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 16 апреля 2020 13:12 · Поправил: Bronco
· Личное сообщение · #13

ClockMan пишет:
во......

дык....тут Питер упрямится, считает что movabs имеет право быть с указателем.
и для операнд RAX, у него такой вздроч есть.
ну там делов 2 кейса поправить...и пересобрать...по линкам выше как раз тёрки шли.

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 17 апреля 2020 10:48 · Поправил: Vamit
· Личное сообщение · #14

Общий принцип создания поточных пользовательских задач, работающих синхронно с ГУИ дебагера простой:
- Создается поток менеджера задач, его назначение запустить задачу, если она имеется.
- В любом месте плагина (например, меню, исполняемая задача), где необходимо выполнить длительную обработку данных без блокировки ГУИ дебагера, создается пользовательская задача.
В итоге может быть последовательность задач, выполняющихся одна за другой или между ними можно стартовать задачи дебагера (например, запуск кода на исполнение, при достижении Breakpoint в плагин придет его колбэк, в котором может быть запущена очередная задача).
Так как в конкретный момент времени у нас работает только одна задача, то мультипоточная синхронизация данных плагина не нужна.

Используемые структуры и определения:
Code:
  1. typedef unsigned (WINAPI *ThreadRoutine)(void*);
  2.  
  3. // Представление потока
  4. class vThread
  5. {
  6.          HANDLE   m_hThread; // хендл потока
  7.  
  8. public:
  9.          // Конструктор
  10.          vThread() { m_hThread = NULL; }
  11.  
  12.          // Деструктор
  13.          virtual ~vThread() { Close(); }
  14.  
  15.          // Получить хендл потока
  16.          HANDLE GetHandle() const { return m_hThread; }
  17.  
  18.          // Создать и запустить поток
  19.          bool Begin(ThreadRoutine pfnStart, void* pArgList, unsigned int stackSize = 0x100000)
  20.          {
  21.                  if (IsRunning())
  22.                         return false;
  23.                  unsigned int threadId = 0;
  24.                  m_hThread = (HANDLE)_beginthreadex(nullptr, stackSize, pfnStart, pArgList, STACK_SIZE_PARAM_IS_A_RESERVATION, &threadId);
  25.                  return m_hThread != NULL;
  26.          }
  27.  
  28.          // Закрыть поток
  29.          void Close()
  30.          {
  31.                  if (!m_hThread)
  32.                         return;
  33.                  ::WaitForSingleObject(m_hThread, INFINITE);
  34.                  if (!m_hThread)
  35.                         return;
  36.                  CloseHandle(m_hThread);
  37.                  m_hThread = NULL;
  38.          }
  39.  
  40.          // Терминировать поток
  41.          void Terminate()
  42.          {
  43.                  if (!m_hThread)
  44.                         return;
  45.                  DWORD exitCode = 0;
  46.                  GetExitCodeThread(m_hThread, &exitCode);
  47.                  if (exitCode == STILL_ACTIVE)
  48.                         TerminateThread(m_hThread, 0);
  49.                  CloseHandle(m_hThread);
  50.                  m_hThread = NULL;
  51.          }
  52.  
  53.          // Проверить, что поток работает
  54.          bool IsRunning()
  55.          {
  56.                  if (!m_hThread)
  57.                         return false;
  58.                  DWORD exitCode = 0;
  59.                  GetExitCodeThread(m_hThread, &exitCode);
  60.                  if (exitCode == STILL_ACTIVE)
  61.                         return true;
  62.                  CloseHandle(m_hThread);
  63.                  m_hThread = NULL;
  64.                  return false;
  65.          }
  66.  
  67.          // Ждать реакции
  68.          bool WaitForSingleObject(DWORD dwMilliseconds)
  69.          {
  70.                  if (!m_hThread)
  71.                         return true;
  72.                  return ::WaitForSingleObject(m_hThread, dwMilliseconds) == WAIT_OBJECT_0;
  73.          }
  74. };

Code:
  1. // Вызываемая задача 
  2. typedef int (*tTask)();
  3.  
  4. // Параметры вызываемой задачи в потоке плагина
  5. struct vTask
  6. {
  7.          tTask     m_pfnTask; // вызываемая задача
  8.          string   m_sName; // имя задачи
  9.          //...                                         // параметры задачи, если нужны
  10. };
  11.  
  12. // Менеджер вызываемых задач
  13. struct vTaskManager
  14. {
  15.          vTask     m_RunTask; // исполняемая задача
  16.          vThread          m_Thread; // поток исполнения задачи
  17.          vTask     m_Task; // следующая задача
  18.          vThread          m_Manager; // поток менеджера задач
  19.  
  20.          // Проверить, возможен ли вызов задачи
  21.          bool IsBusy()
  22.          {
  23.                  if (!m_Thread.IsRunning())
  24.                         return false;
  25.                  Info("Plugin is busy, executing %s\n", m_RunTask.m_sName);
  26.                  return true;
  27.          }
  28.  
  29.          // Остановить обработку задач
  30.          void Stop()
  31.          {
  32.                  m_Thread.Terminate();
  33.                  m_Manager.Terminate();
  34.          }
  35. };
  36.  
  37. // Выполнить вызываемую задачу
  38. void RunTask(tTask pTask);

Здесь и далее string и Info(...), Error(...) любая строковая переменная и её вывод куда вам необходимо.

Код функций:
Code:
  1. vTaskManager      s_TaskMan; // менеджер задач
  2.  
  3. // Поток менеджера вызываемых задач
  4. unsigned WINAPI ManagerRoutine(void* pParams)
  5. {
  6.          vTaskManager* pTaskMan = (vTaskManager*)pParams;
  7.          while (true)
  8.          {
  9.                  // если имеется задача для исполнения и предыдущая задача завершила работу, то стартуем задачу
  10.                  if (pTaskMan->m_Task.m_pfnTask && !pTaskMan->m_Thread.IsRunning())
  11.                         RunTask(pTaskMan->m_Task.m_pfnTask);
  12.                  Sleep(100);
  13.          }
  14.          return 0;
  15. }
  16.  
  17. // Поток вызываемой задачи
  18. unsigned WINAPI TaskRoutine(void* pParams)
  19. {
  20.          vTask* pTask = (vTask*)pParams;
  21.          // выполняем задачу
  22. //       Log("Execute: %s\n", pTask->m_sName);
  23.          int res = pTask->m_pfnTask();
  24.          // обработка результата, если нужна
  25.          return 0;
  26. }
  27.  
  28. // Создание потока вызываемой задачи
  29. void CreateTaskThread()
  30. {
  31.          // Создаем поток обработки задач и стартуем его
  32.          if (!s_TaskMan.m_Thread.Begin(TaskRoutine, &s_TaskMan.m_RunTask))
  33.                  Error("Failed to start thread of task: %s", s_TaskMan.m_RunTask.m_sName);
  34. }
  35.  
  36. // Выполнить вызываемую задачу
  37. void RunTask(tTask pTask)
  38. {
  39.          s_TaskMan.m_Task.m_pfnTask = pTask;
  40.          // Обработчик задач свободен
  41.          if (!s_TaskMan.m_Thread.IsRunning())
  42.          {
  43.                  s_TaskMan.m_RunTask = s_TaskMan.m_Task;
  44.                  s_TaskMan.m_Task.m_pfnTask = nullptr;
  45.                  // Создание потока и синхронизация с дебагером
  46.                  GuiExecuteOnGuiThread(CreateTaskThread);
  47.                  return;
  48.          }
  49.          // Стартуем менеджер вызываемых задач, если он не запущен
  50.          if (s_TaskMan.m_Manager.IsRunning())
  51.                  return;
  52.          if (!s_TaskMan.m_Manager.Begin(ManagerRoutine, &s_TaskMan))
  53.                  Error("Failed to start thread of manager");
  54. }

Пример запуска первоначальной или последующей задачи:
Code:
  1.          // если задача первоначальная, но менеджер исполняет другую задачу
  2.          if (s_TaskMan.IsBusy())
  3.          {
  4.                  // сообщение об ошибке
  5.                  return;
  6.          }
  7.          s_TaskMan.m_Task.m_sName = "UserTask";
  8.          RunTask(UserTask);
  9.          // UserTask - любая ваша задача


Добавлю, если задача одна, то она стартует без менеджера, если во время исполнения задачи вызывается новая задача, то она будет запущена менеджером после окончания текущей.

-----
Everything is relative...


| Сообщение посчитали полезным: Bronco, Illuzion


Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 17 апреля 2020 15:35
· Личное сообщение · #15

Vamit, грамотно. ща с гуляющим дитейлом капса разберусь, и обязательно попробую.
Очень даже интересно, как это гуй живёт без родного GuiProcessEvents();

Добавлено спустя 5 часов 40 минут
Vamit, вроде калбеков нет, куда всунуть задачу нифуя не поятно.
И что значит задача, это юзер_код?
есть семпл для теста?

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 17 апреля 2020 21:28 · Поправил: Vamit
· Личное сообщение · #16

И что значит задача, это юзер_код?
Задача - это любая твоя функа типа int FuncName();, выполняющая длительную обработку кода с выводом инфы в окна дебагера, во время исполнения кода функи гуи дебагера не блокируется, можно давить любые кнопки, ходить по окнам, а плагин будет параллельно выполнять свою задачу. Она может вызывать любые функции дебагера (асм, дизасм и т.д.). Например, деобфускация/девиртуализация защищенного протектором кода и т.д. - любая задача которую только можно придумать. Я же не знаю что у тебя за плагин, если есть меню, то каждый его пункт может быть задачей.

-----
Everything is relative...





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 17 апреля 2020 21:56 · Поправил: Bronco
· Личное сообщение · #17

Vamit пишет:
асм, дизасм и т.д.

я стараюсь по минимуму юзать апи отладчика, иначе там прицепом лезут патчер и скриптовой двиг.
в основном селект_рид_врайт, ну что там ищё из титана, ну и без лога никуда.))
меню конечно есть, но судя по интам для вызова, у тебя похоже что надстройка над ним, и как это увязать с тем что уже есть хз.
если не трудно сделай семпл, с хидерами и неймспейсами.
хоть помсмотреть как оно в работе, и можно ли переделать под обычный калбек для войда.
и что этот синхрон - GuiExecuteOnGuiThread(CreateTaskThread);, реально помогает?

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 18 апреля 2020 09:23 · Поправил: Vamit
· Личное сообщение · #18

Bronco
Если делать семпл, то в нем будет кода намного больше, чем я привел для синхронизации с гуи. Ты же сам знаешь как организовано меню в плагине, основная функа
_plugin_registercallback(s_hPluginHandle, CB_MENUENTRY, (CBPLUGIN)MenuCallback);
где MenuCallback - твоя функа обработки пунктов меню.
Вот пример, как из неё вызвать задачу:
Code:
  1. // Обработчик нажатий меню
  2. void MenuCallback(CBTYPE nType, PLUG_CB_MENUENTRY* pInfo)
  3. {
  4.          switch (pInfo->hEntry)
  5.          {
  6.          case Task1:
  7.                  RunTask1();
  8.                  break;
  9.          case Task2:
  10.                  RunTask2();
  11.                  break;
  12.          }
  13.          GuiUpdateAllViews();
  14. }
  15.  
  16. void RunTask1()
  17. {
  18.          if (s_TaskMan.IsBusy())
  19.          {
  20.                  Info("Task %s is running.", s_TaskMan.m_RunTask.m_sName);
  21.                  return;
  22.          }
  23.          s_TaskMan.m_Task.m_sName = "MyTask1";
  24.          RunTask(MyTask1);
  25. }
  26.  
  27. void RunTask2()
  28. {
  29.          if (s_TaskMan.IsBusy())
  30.          {
  31.                  Info("Task %s is running.", s_TaskMan.m_RunTask.m_sName);
  32.                  return;
  33.          }
  34.          s_TaskMan.m_Task.m_sName = "MyTask2";
  35.          RunTask(MyTask2);
  36. }


где MyTask1, MyTask2 - твои функции обработки пунктов меню.

Да, ещё забыл сказать, что в extern "C" DLL_EXPORT bool plugstop() необходимо добавить терминацию потоков s_TaskMan.Stop();

Добавлено спустя 16 минут
Если пункт меню About или любой простой, то понятно что его не нужно запускать на исполнение отдельным потоком. Отдельным потоком (задачей) запускаются процессы блокирующие гуи или вызывающие внутри себя гуи для отрисовки, в этом случае процесс запускается как поточная задача, а все вызовы отрисовки/синхронизации с гуи из неё удаляются.

-----
Everything is relative...





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 18 апреля 2020 10:11 · Поправил: Bronco
· Личное сообщение · #19

Vamit, в самих в свитчах проблем не вижу. зарегить ещё один калбек то же не проблема.
хотя мне казалось что функи надо на экспорт вешать,
потому что я не понимаю, как из энума меню , здесь "RunTask(MyTask1)" адрес(ptr) вызова метода появится.
--------
чтобы гуй не фризил, или не залипал, я с интервалом по таймингу,
юзаю перед принтами GuiProcessEvents(), чтобы было понятно, что процесс идёт.
теряю на этом конечно скорость, но в пределах разумного меня это устраивало.
Хочется быстрее, потому что на входе до 100 лямов строк гавнокода,
а быстрее чем 3 ляма за 1.5 минуты у меня не выходит.
---------
Bronco пишет:
потому что я не понимаю, как из энума меню , здесь "RunTask(MyTask1)" адрес(ptr) вызова метода появится.

кажется вкурил, как это работает, завелось через преобразование типов "RunTask((tTask)MyTask1)".
ща погоняем...))

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 18 апреля 2020 11:23
· Личное сообщение · #20

чтобы гуй не фризил, или не залипал, я с интервалом по таймингу,
юзаю перед принтами GuiProcessEvents(), чтобы было понятно, что процесс идёт.
теряю на этом конечно скорость, но в пределах разумного меня это устраивало.

Вот именно, что теряешь скорость, у меня ранее было аналогично, перешел на потоки и получил выигрыш в быстродействии почти в 30 раз.
потому что я не понимаю, как из энума меню , здесь "RunTask(MyTask1)" адрес(ptr) вызова метода появится.
Я всё же расписал, у тебя из енума меню, например, вызывалась функа void FuncName(); делаешь из неё int FuncName(); или исправь возвращаемый тип в typedef int (*tTask)(); на void, если не нужно значение возврата и передавай на неё указатель параметром в функцию RunTask, а её имя пиши сюда s_TaskMan.m_Task.m_sName - всё, более ничего и не нужно.
А все вызовы GuiProcessEvents() вызываемые внутри твоей FuncName удали.
Я уже всё расжевал, не знаю что ещё может быть непонятно...

-----
Everything is relative...





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 18 апреля 2020 12:25
· Личное сообщение · #21

Vamit пишет:
и получил выигрыш в быстродействии почти в 30 раз.

респект. отличный код. гуй очень бодренький с ним.
взял на вооружение. в 30 раз может позже, надо ещё вывод поскипать, но по таймигам на порядок быстрее сейчас.
прирост больше чем в 2 раза.

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




Ранг: 17.6 (новичок), 118thx
Активность: 0.02=0.02
Статус: Участник

Создано: 19 апреля 2020 14:07
· Личное сообщение · #22

Bronco пишет:
In fresh builds, I wait 3 years until the binary search window settings are saved.


Will be added soon

Bronco пишет:
They also removed the restart as admin, this is the same reason to stay on the old build ..)


Maybe the translation is not working but this option is still here: https://i.imgur.com/MniNJrx.png

Bronco пишет:
for a log of 10k lines this is the limit, beyond the brakes, it is better not to go into the bookmark until the task is completed.


Recently someone made some nice updates that should improve the log performance a lot. It's not perfect and I need to rewrite the log view to a table view to get good performance.

Anyway that still doesn't answer the question why you use some super old version from 2018 :D

Also you can try https://mega.nz/file/XpoH2Q4B#mY5FvCVakbQaNveHD_HbBf-jpdnCDyThtAvSGdkhzSQ (or compile from https://github.com/x64dbg/asmjit_xedparse) maybe it will be better...

| Сообщение посчитали полезным: ClockMan, mak

Ранг: -13.0 (нарушитель), 8thx
Активность: 0.24=0.24
Статус: Участник

Создано: 19 апреля 2020 15:42
· Личное сообщение · #23

mrexodia пишет:
Maybe the translation is not working but this option is still here: https://i.imgur.com/MniNJrx.png


Thank you for not forgetting our forum. Not to offend you, just to let you know.



| Сообщение посчитали полезным: Bronco


Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 19 апреля 2020 20:31 · Поправил: Bronco
· Личное сообщение · #24

mrexodia пишет:
Anyway that still doesn't answer the question why you use some super old version from 2018

in fact, I rarely miss updates, always waiting for a new one.
it is clear that the above is just excuses, well, yes, there is one reason, but better not say anything.
I’m sitting calmly on this version of the solution, and slowly repairing the Primus.
mrexodia пишет:
maybe it will be better...

fixed "movabs rax, mem&movabs mem, rax" on "mov rax, mem&mov mem, rax"

-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 26 апреля 2020 15:28 · Поправил: ClockMan
· Личное сообщение · #25

"nop dword ptr ds:[rax], eax" (invalid instruction)


может кому будет интересно у меня отладчик тупо вис при частом обращении типа
Code:
  1. asm $_restore_code,{i:($_stolen_code)}

добавление после него команды
zzz 5 аналог sleep
всё стало работать намного лучше

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 26 апреля 2020 16:26 · Поправил: Bronco
· Личное сообщение · #26

ClockMan пишет:
"nop dword ptr ds:[rax], eax" (invalid instruction)

это ксед выё..живается со своим личным API для нопов, ...и зудис в туда же)))
двойные нопы(с двумя операндами) джиту не скормишь.
а вот так nop dword ptr ds:[rax], он понимает, байткод на выходе тот же самый.
остальное так же
Code:
  1. const char* nop6 = "NOP WORD ptr CS:[RAX+RAX]";
  2. unsigned char nop_6[6] = { 0x2e, 0x66, 0x0F, 0x1F, 0x04, 0x00 };
  3. const char* nop5 = "NOP DWORD ptr GS:[RAX + RAX]";
  4. unsigned char nop_5[5] = { 0x65, 0x0F, 0x1F, 0x04, 0x00 };
  5. const char* nop4 = "NOP DWORD ptr GS:[RAX]";
  6. unsigned char nop_4[4] = { 0x65, 0x0F, 0x1F,0x00 };
  7. const char* nop3 = "NOP DWORD ptr DS:[RAX]";

а вот капс по старинке.
Code:
  1.    NOP DWORD PTR [RAX]
  2.    insn->id: 494
  3.    insn->size : 0x03 byte
  4.    CS_AC_READ  ( 1 )
  5.    x86->operands[0].type: X86_OP_MEM 
  6.    x86->operands[0].size: 0x04 byte
  7.    x86->operands[0].mem.base: X86_REG_RAX

и хз где правильно
ClockMan пишет:
у меня отладчик тупо вис при частом обращении типа

встроенный асм менеджер ещё то горе.
sleep не нужен, теряешь в скорости.
Code:
  1. guiupdatedisable
  2. ....
  3. exit:
  4. guiupdateenable
  5. ret


-----
Чтобы юзер в нэте не делал,его всё равно жалко..





Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 27 апреля 2020 12:03 · Поправил: ClockMan
· Личное сообщение · #27

Bronco пишет:
а вот так nop dword ptr ds:[rax], он понимает, байткод на выходе тот же самый.
остальное так же

ни хера он не понимает
0F1F00 == nop dword ptr ds:[rax], eax
0F1F nop opcode standart(unstandart 0F19,0F1C,0F1D,0F1E)
00 mod R/M в данном случае [eax]eax а может я так захочу NOP DWORD PTR DS:[RSP], ESP
кому интересно маны на интел --> Link <--
таблица по опкодам ищем раздел one,two,and three-byte opcode maps

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 1.2 (гость), 14thx
Активность: 0.020.03
Статус: Участник

Создано: 27 апреля 2020 14:03 · Поправил: Keksov
· Личное сообщение · #28

Очень хороший отладчик но тормозит когда большое количество брейкпоинтов!
Больше тысячи(было 1332)и тогда и x64dbg зависал на несколько минут после
установки брейкпоинтов.




Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 27 апреля 2020 18:37 · Поправил: Bronco
· Личное сообщение · #29

ClockMan пишет:
ни хера он не понимает

ну так значит есть повод обновить библиотеку.
За талмуд интела феньк, кста по нопам там так и написано, только с одним операндом.ModRM:r/m (r)
самый длинный 9 байт 66 NOP DWORD ptr [EAX + EAX*1 + 00000000H], но вживую мне встречались все, от 3 до 15 байт.
-----------------
вопрос по структурам бриджа или титана. как освободить память в куче от этих данных?

-----
Чтобы юзер в нэте не делал,его всё равно жалко..




Ранг: 173.8 (ветеран), 208thx
Активность: 0.120.36
Статус: Участник

Создано: 27 апреля 2020 21:40 · Поправил: VOLKOFF
· Личное сообщение · #30

Bronco пишет:
вживую мне встречались все, от 3 до 15 байт


Фог кстати в --> гайде <-- по оптимизации ассемблерного кода прямо намекает что предпочтительно юзать именно нопы (современные компиляторы используют "псевдо-нопы").
Док уже много лет постоянно обновляется, последний апдейт от 2020-03-04

10.7 Using multi-byte NOPs for alignment
The multi-byte NOP instruction has the opcode 0F 1F + a dummy memory operand. The
length of the multi-byte NOP instruction can be adjusted by optionally adding 1 or 4 bytes of
displacement and a SIB byte to the dummy memory operand and by adding one or more
66H prefixes. An excessive number of prefixes can cause delay on older microprocessors,
but at least two prefixes is acceptable on most processors. NOPs of any length up to 10
bytes can be constructed in this way with no more than two prefixes. If the processor can
handle multiple prefixes
without penalty then the length can be up to 15 bytes.
The multi-byte NOP is more efficient than the commonly used pseudo-NOPs such as MOV
EAX,EAX or LEA RAX,[RAX+0] . The multi-byte NOP instruction is supported on all Intel P6
family processors and later, as well as AMD Athlon, K7 and later, i.e. almost all processors
that support conditional moves.


Если интересно у него и по cpp аналог есть и отдельные доки по "латенси" инструкций на разных семействах камней.




Ранг: 312.0 (мудрец), 349thx
Активность: 0.460.65
Статус: Участник
Advisor

Создано: 28 апреля 2020 10:29 · Поправил: Bronco
· Личное сообщение · #31

VOLKOFF пишет:
An excessive number of prefixes can cause delay on older microprocessors,
but at least two prefixes is acceptable on most processors.

хз...ни один асм двиг, кроме кседа, не кодирует нопы длиннее 6 байт.
всё что больше 9 байтового, идёт с префиксами, а пеньки рекомендуют не больше двух.
и кому это нужно, кроме как компиляторам..

-----
Чтобы юзер в нэте не делал,его всё равно жалко..



<< 1 ... 18 . 19 . 20 . 21 . 22 . 23 . >>
 eXeL@B —› Софт, инструменты —› x64dbg отладчик
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати