Как обойти IsDebuggerPresent с OllyDbg?

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

3 ответов


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

1) Найдите IsDebuggerPresent

OllyDbg 1

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

2) Патч это

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

OllyDbg 2

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

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


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

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 вы можете запустить .


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

  • пресс Alt + e или открыть