REVERSE——反调试

xuanbin 188 次阅读 发布于 2025-09-03


也算是一个整理吧,经常被反调试搞红温,决定从现在起遇到一个收集一个。

调试器隐藏

隐藏PEB

因为操作系统会为每一个进程创建PEB,而进程在被调试状态下会修改PEB的某些值,从而可以通过自身的PEB的某些关键值来判断是否处于调试状态。

  • BeingDebugged

表示进程当前是否处于调试状态,通过IsDebuggerPresent()返回PEB中的BeingDebugged。

if (IsDebuggerPresent())
{
	//anti-debug
}

对象句柄

  • CloseHandle()/NtClose()

CloseHandle()在接收一个无效句柄后返回False并引发异常ERROR_INVALID_HANDLE,在调试状态下异常会被调试器所处理而非进程本身,这时通过GetLastError()获取最后一次异常类型可判断进程当前是否处于调试状态。

if (CloseHandle((HANDLE)0xABCD)||GetLastError()!= 6)//ERROR_INVALID_HANDLE值对应6
{
	//anti-debug
}

NtClose()的原理与CloseHandle()基本相同,甚至于CloseHandle()的实现就调用了NtClose()并通过SetLastError()将STATUS_INVALID_HANDLE(NtClose()释放无效句柄抛出的异常C0000008H)转换为ERROR_INVALID_HANDLE。