temtriss Опубликовано 20 октября, 2022 Поделиться Опубликовано 20 октября, 2022 (изменено) Привет всем, столкнулся с некой странностью, возможно я что-то делаю не правильно?! Я как всегда нашел своё костыльное решение, но хочется знать, возможно ли решить поставленную задачу иначе. Собственно вот костыльный вариант: Спойлер g_count = 0; g_Addr = 0; function debugger_onBreakpoint() -- Have call this one at loop -- will finish breaking after 10k times if(g_count > 10000) then debug_removeBreakpoint(0x00401E45); debug_removeBreakpoint(0x00401E48); end g_count = g_count + 1; if(EIP == 0x00401E78) then if(EBX == 0) then debug_continueFromBreakpoint(co_run); return 1; end print(string.format("%d, 0x%08x", g_count, EBX)); elseif(EIP == 0x00401E45) then g_Addr = readInteger(EAX + 0x40); debug_continueFromBreakpoint("co_run"); return 1; -- Ignore message box elseif(EIP == 0x00401E48) then if(EAX ~= 0) then print(string.format("0x%08x", g_Addr)); end debug_continueFromBreakpoint("co_run"); return 1; -- Ignore message box end end debug_setBreakpoint(0x00401E45); debug_setBreakpoint(0x00401E48); Я ставлю бряк на 0x00401E45(след инструкция +3 байта) проверяю текущий адреса в onBreakpoint функции. Цель, остановится на инструкции получить значение eax+40 и вывести его в том случае, если после выполнения инструкции EAX не стал 0. То как я себе это представлял: Проверяем в onBreakpoint адрес, если наш, то читаем значение, делаем один шаг в отладчике, сравниваем ЕАХ и выводим в лог. Судя по CE wiki функция debug_continueFromBreakpoint принимает в себя параметр: "co_stepover", "co_stepinto", "co_run", "co_runtill" но при попытке передать co_stepover нечего не происходит. По этому я сделал костыль в виде второго бряка) P.S. параметр пробовал передать как в ковычках, так и без. Результат тот же, при передаче co_run так же работают оба варианта. Изменено 20 октября, 2022 пользователем temtriss Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 20 октября, 2022 Поделиться Опубликовано 20 октября, 2022 Проверить, чтобы переменные были без кавычек. Т.е. debug_continueFromBreakpoint(co_stepover), а не debug_continueFromBreakpoint('co_stepover'). Функция debug_continueFromBreakpoint(co_stepover) делает шаг на следующую инструкцию не заходя в call. Далее прочитать регистры и далее вызывать debug_continueFromBreakpoint(co_run) чтобы отпустить отладку. Если этого не сделать, то ничего и не произойдёт — висит в отладке. Учитывать нахождение на EIP при брейкпоинте на адресе брейкпоинта или на адресе следующем за адресом брейкпоинта. Например, это позволит прочитать eax из mov eax, [eax] двумя способами. 1 способ до перезаписи eax (EIP на инструкции брейкпоинта). Это software-брейкпоинт. Способ2 после перезаписи (EIP на инструкции следующей за инструкцией, на которой сработал брейкпоинт). Это hardware-брейкпоинт(он же по умолчанию). Оба режима, можно ставить вручную или программно. debug_setBreakpoint(address, size OPTIONAL, trigger OPTIONAL, breakpointmethod OPTIONAL, functiontocall() OPTIONAL) -- Где на EIP повлияет --Breakpoint methods: bpmInt3=0 --- software breakpoint bpmDebugRegister=1 -- hardwarebreakpoint bpmException=2 -- ну, это не нужно(медленный), на регион памяти (где здесь EIP будет, уже не помню) 2 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения