原理:查询进程环境块(PEB)中的IsDebugged标志。
如果进程没有运行在调试器环境中,函数返回0;如果调试附加了进程,函数返回一个非零值。
直接调用实现样例:
BOOL CheckDebug()
{
return IsDebuggerPresent();
}
看到过的一种函数动态调用实现:
BOOL CheckDebug()
{
HANDLE hKernel32 = NULL;
DWORD dwCallResult = 0;
char szModuleName[MAX_PATH] = { 0 };
PVOID pIsDebuggerPresent = NULL;
lstrcpy(szModuleName, "kernel32.dll");
hKernel32 = GetModuleHandleA(szModuleName);
if (hKernel32)
{
char szTempBuffer[40] = { 0 };
szTempBuffer[0] = 'I';
szTempBuffer[1] = 's';
szTempBuffer[2] = 'D';
szTempBuffer[3] = 'e';
szTempBuffer[4] = 'b';
szTempBuffer[5] = 'u';
szTempBuffer[6] = 'g';
szTempBuffer[7] = 'g';
szTempBuffer[8] = 'e';
szTempBuffer[9] = 'r';
szTempBuffer[10] = 'P';
szTempBuffer[11] = 'r';
szTempBuffer[12] = 'e';
szTempBuffer[13] = 's';
szTempBuffer[14] = 'e';
szTempBuffer[15] = 'n';
szTempBuffer[16] = 't';
szTempBuffer[17] = '\0';
lstrcpy(szModuleName, szTempBuffer);
pIsDebuggerPresent = GetProcAddress((HMODULE)hKernel32, szModuleName);
if (pIsDebuggerPresent)
{
__asm
{
mov eax, pIsDebuggerPresent
call eax
mov dwCallResult, eax
}
}
}
return dwCallResult;
}
欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。