Я действительно не понимаю, как обойти IsDebuggerPresent. Я думаю, что я должен найти регистры, используемые для отладки, а затем установить его в 0, чтобы обмануть IsDebuggerPresent, но я не знаю, как это сделать. Я пробовал искать в Google и даже пробовал несколько решений, но на самом деле это не работало для меня. Может ли кто-нибудь объяснить мне, как это должно работать и как я могу обойти это?
Как обойти IsDebuggerPresent с помощью OllyDbg?
Ответ 1
Есть много способов сделать это. Как вы сказали, возможно исправление блока потока программ. Вот учебник, как обойти IsDebuggerPresent, просто исправив эту функцию, чтобы она всегда возвращала 0.
1) найдите IsDebuggerPresent
В моей ситуации это на 7664EFF7 и состоит всего из трех инструкций + один RET. Он читает блок потока (адрес находится в FS: 18), а затем находит байт, который говорит "я отлаживаюсь" и возвращает его. Возвращаемое значение сохраняется в EAX (как для большинства функций WINAPI). Если я изменю функцию так, что в конце она будет иметь EAX = 0, я успешно обойду IsDebuggerPresent.
2) исправить его
Теперь самый простой способ сделать это - просто сделать функцию просто командой MOV EAX, 0
, а затем RETN
:
Обратите внимание, что я также заполнил остальную часть функции 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 просто его искать.