CheckRemoteDebuggerPresent

Материал из Справочник исследователя программ
Определяет, находится ли указанный процесс под отладкой
BOOL CheckRemoteDebuggerPresent( HANDLE hProcess, PBOOL pbDebuggerPresent );
Содержание |
Параметры
hProcess [in] хэндл процесса. pbDebuggerPresent [in, out] Указатель на переменную, куда устанавливается TRUE, если процесс отлаживается или FALSE в противном случае.
Возвращаемое значение
Если функция завершается успешно, возвращаемое значение не равно нулю. Если функция завершается с ошибкой, возвращаемое значение равно нулю. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.
Внутреннее устройство
7C85AAF2 > 8BFF MOV EDI,EDI ; ntdll.7C910228 7C85AAF4 55 PUSH EBP 7C85AAF5 8BEC MOV EBP,ESP 7C85AAF7 837D 08 00 CMP DWORD PTR SS:[EBP+8],0 7C85AAFB 56 PUSH ESI 7C85AAFC 74 35 JE SHORT 7C85AB33 7C85AAFE 8B75 0C MOV ESI,DWORD PTR SS:[EBP+C] 7C85AB01 85F6 TEST ESI,ESI 7C85AB03 74 2E JE SHORT 7C85AB33 7C85AB05 6A 00 PUSH 0 7C85AB07 6A 04 PUSH 4 7C85AB09 8D45 08 LEA EAX,DWORD PTR SS:[EBP+8] 7C85AB0C 50 PUSH EAX 7C85AB0D 6A 07 PUSH 7 7C85AB0F FF75 08 PUSH DWORD PTR SS:[EBP+8] 7C85AB12 FF15 AC10807C CALL DWORD PTR DS:[ntdll.ZwQueryInformationProcess] 7C85AB18 85C0 TEST EAX,EAX 7C85AB1A 7D 08 JGE SHORT 7C85AB24 7C85AB1C 50 PUSH EAX 7C85AB1D E8 F7E8FAFF CALL 7C809419 7C85AB22 EB 16 JMP SHORT 7C85AB3A 7C85AB24 33C0 XOR EAX,EAX 7C85AB26 3945 08 CMP DWORD PTR SS:[EBP+8],EAX 7C85AB29 0F95C0 SETNE AL 7C85AB2C 8906 MOV DWORD PTR DS:[ESI],EAX 7C85AB2E 33C0 XOR EAX,EAX 7C85AB30 40 INC EAX 7C85AB31 EB 09 JMP SHORT 7C85AB3C 7C85AB33 6A 57 PUSH 57 7C85AB35 E8 24E8FAFF CALL 7C80935E 7C85AB3A 33C0 XOR EAX,EAX 7C85AB3C 5E POP ESI 7C85AB3D 5D POP EBP 7C85AB3E C2 0800 RETN 8
Требования
Клиент Требуется Windows Vista или Windows XP SP1. Сервер Требуется Windows Server "Longhorn" или Windows Server 2003. Заголовок Объявлен Winbase.h; включает Windows.h. Библиотека Использует Kernel32.lib. DLL Требуется Kernel32.dll.
Примеры
Delphi
procedure TForm1.FormCreate(Sender: TObject); var Debug : LongBool; begin Debug := False; if CheckRemoteDebuggerPresent(GetCurrentProcess(), Debug) then if Debug then begin ShowMessage('Debugger Present'); Application.Terminate; end end;
Обход проверки
004B32BE 833C24 00 CMP DWORD PTR SS:[ESP],0 <--------- должен быть 0 004B32C2 74 16 JE SHORT 004B32DA 004B32C4 B8 E8324B00 MOV EAX,004B32E8 004B32C9 E8 524EFBFF CALL 00468120 004B32CE A1 8CB34B00 MOV EAX,DWORD PTR DS:[4BB38C] 004B32D3 8B00 MOV EAX,DWORD PTR DS:[EAX] 004B32D5 E8 BADEFFFF CALL 004B1194 004B32DA 5A POP EDX 004B32DB C3 RETN
0012FEE4 01 00 00 00 6B 6B 4A 00 �...kkJ. <----------меняем 01 на 00 0012FEEC 1C FF 12 00 75 6B 4A 00 �я�.ukJ. 0012FEF4 08 FF 12 00 28 02 91 7C �я�.(�‘|
Также обходится перехватом и последующей правкой результирующего значения функции ZwQueryInformationProcess.