Перейти к содержанию

CE Scripting(debug_continueFromBreakpoint)


temtriss

Рекомендуемые сообщения

Привет всем, столкнулся с некой странностью, возможно я что-то делаю не правильно?! 

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

Собственно вот костыльный вариант:

 

Спойлер
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 так же работают оба варианта.

Изменено пользователем temtriss
Ссылка на комментарий
Поделиться на другие сайты

  • Проверить, чтобы переменные были без кавычек. Т.е. 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
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.