1625-5 王子昂 总结《2018年3月7日》 【连续第522天总结】
A. 反调试技术(2)
B.
CheckRemoteDebuggerPresent
BOOL CheckRemoteDebuggerPresent(
HANDL hProcess,
PBOOL pbDebuggerPresent
);
这是另外一个MSDN上提供的检测调试器的函数,测试发现及时修改BeingDebugged标志也会被检测到
这个函数的核心代码只有一句话,就是对NtQueryInformationProcess的调用。
NtQueryInformationProcess不是Win32API,而是NativeAPI。
大多NativeAPI都是未文档化的,因此没有源码和使用说明。不过GaryNebbett写了一本参考手册《Windows NT 2000 Native API Reference》
手册中写着CheckRemoteDebuggerPresent调用了NtQueryInformationProcess的第7个值ProcessDebugPort
这个值是系统用来与调试器通信的端口句柄,若将其设为0,系统就不会向用户态
调试器发送调试事件通知,调试器当然就无法工作了
到了这一步,自然想到通过NtSetInformationProcess函数将DebugPort设为0。不过可惜的是说明中写明了“调试端口仅能在初始状态(即为0)时设置”,因此无法在调试器启动进程后修改Port
ThreadHideFromDebugger
虽然NtSetInformationProcess这条路