Подтвердить что ты не робот

Как обойти IsDebuggerPresent с помощью OllyDbg?

Я действительно не понимаю, как обойти IsDebuggerPresent. Я думаю, что я должен найти регистры, используемые для отладки, а затем установить его в 0, чтобы обмануть IsDebuggerPresent, но я не знаю, как это сделать. Я пробовал искать в Google и даже пробовал несколько решений, но на самом деле это не работало для меня. Может ли кто-нибудь объяснить мне, как это должно работать и как я могу обойти это?

4b9b3361

Ответ 1

Есть много способов сделать это. Как вы сказали, возможно исправление блока потока программ. Вот учебник, как обойти IsDebuggerPresent, просто исправив эту функцию, чтобы она всегда возвращала 0.

1) найдите IsDebuggerPresent

OllyDbg 1

В моей ситуации это на 7664EFF7 и состоит всего из трех инструкций + один RET. Он читает блок потока (адрес находится в FS: 18), а затем находит байт, который говорит "я отлаживаюсь" и возвращает его. Возвращаемое значение сохраняется в EAX (как для большинства функций WINAPI). Если я изменю функцию так, что в конце она будет иметь EAX = 0, я успешно обойду IsDebuggerPresent.

2) исправить его

Теперь самый простой способ сделать это - просто сделать функцию просто командой MOV EAX, 0, а затем RETN:

OllyDbg 2

Обратите внимание, что я также заполнил остальную часть функции NOP, чтобы избежать изменения ее размера. Вероятно, это необязательно, вы также можете просто сделать MOV EAX, 0, а затем просто RETN.

Также вы должны знать, что модификация действительна только для одного запуска программы. Когда вы перезапустите его, он загрузит новую копию kernel32.dll(где IsDebuggerPresent находится) с исходной функцией, и вам придется снова применить патч. Если вы хотите, чтобы патч был постоянным, вам нужно изменить запуск двоичного файла и изменить/удалить вызов этой функции. Но прежде чем вы это сделаете, вам также необходимо убедиться, что двоичный файл не проверяет себя на наличие изменений.

Ответ 2

Внесите этот код в свой процесс:

mov eax,dword ptr fs:[18]
mov eax,dword ptr ds:[eax+30]
mov byte ptr ds:[eax+2],0

Это приведет к исправлению флага PEB.BeingDebugged гарантируя, что IsDebuggerPresent всегда возвращает 0

При использовании x64dbg вы можете запустить команду dbh.

Ответ 3

если вы хотите, чтобы ваше приложение никогда не проверяло это:

  • Нажмите Alt + e или откройте окно Executable modules.
  • Выберите C:\WINDOWS\system32\kernel32.dll и нажмите ctrl + N
  • выберите IsDebuggerPresent и нажмите клавишу ввода.
  • нажмите f2
  • запустите программу и подождите, пока ваша программа не будет разорвана на этом op-коде.
  • нажмите несколько f8, пока не вернетесь к своему коду.
  • подыскивая что-то вроде TEST EAX,EAX и после чего-то вроде je jnz и т.д., будьте осторожны, вывод IsDebuggerPresent сохраняется в EAX.
  • Если при этом op-code произойдет переход, замените его на nop, и если он не будет произойти, измените его на jmp.
  • сохраните свою программу. если вы не знаете, как сохранить измененный код в ollyDBG просто его искать.