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这条路走不通,但是显然NativeAPI中存在着一些接近内核态的东西
ZwSetInformationThread这个API可以设置一个线程相关的信息,而ThreadInformationClass的最后一项就是ThreadHideFromDebugger
当该值被设置为True时,会禁止进程产生调试事件。
原理是
如果当前进程成功映射了一个映像,并跟一个调试端口关联起来,就会通知调试器发生了LOAD_DLL_DEBUG_EVENT事件。但是如果线程的HideFromDebugger为TRUE,那么在通知之前就会返回,使得调试器对进程一无所知
C. 明日计划
反调试技术(3)
本文介绍了Windows系统的两种反调试技术:CheckRemoteDebuggerPresent和ThreadHideFromDebugger。CheckRemoteDebuggerPresent通过NtQueryInformationProcess检测调试器,而ThreadHideFromDebugger利用ZwSetInformationThread来隐藏线程,防止调试事件的发生。
1323

被折叠的 条评论
为什么被折叠?



