在前面我的博文一步一步简单的保护我们的代码中 http://blog.csdn.net/lixiangminghate/article/details/43153263 提到了动态监测进程是否被调试。此间用到了Win Api IsDebuggerPresent。很可惜,某些系统没有导出该函数,因此,在那篇博文中用汇编模拟了这个API的实现。
今天看reactos033异常处理相关的源码,在异常处理开始部分,无意中看到了reactos监测进程调试状态的实现,代码如下:
[ntoskrnl\include\internal\i386\asmmarco.S]
mov ecx, fs:[KPCR_CURRENT_THREAD]
cld
/* Flush DR7 */
and dword ptr [ebp+KTRAP_FRAME_DR7], 0
/* Check if the thread was being debugged */
test byte ptr [ecx+KTHREAD_DEBUG_ACTIVE], 0xFF
jnz Dr_&Label
ifdef PcPrcbData
mov ecx,PCR[PcPrcbData+PbCurrentThread] ; get current thread address
else
mov ecx,PCR[PcPrcb]
mov ecx,[ecx].PbCurrentThread ; get current thread address
endif
cld
and dword ptr [ebp].TsDr7, 0
test byte ptr [ecx].ThDebugActive, 0ffh ; See if debug registers need saving
jnz Dr_&AssistLabel