正方案:
把 EPROCESS->DebugPort = NULL清零,这样调试器就无法接受到消息了,也就无法调试了
反方案:
以下的操作都可以写成一个script来操作.
kd> !process 0 0 calc.exe PROCESS 861a9020 SessionId: 0 Cid: 068c Peb: 7ffdb000 ParentCid: 05c8 DirBase: 0c9801a0 ObjectTable: e21cdd28 HandleCount: 44. Image: calc.exe查看下debugport的位置
kd> dt _EPROCESS -y DebugPort 861a9020 nt!_EPROCESS +0x0bc DebugPort : (null)
这里看到偏移是0xbc
对它下内存读写断点:(r是表示读或写)
kd> ba r4 861a9020+0xbc kd> bl 0 e 861a90dc r 4 0001 (0001)2.g运行系统,虚拟机本地打开一个windbg,附加上calc.exe,这时系统肯定会断下来
kd> g Breakpoint 0 hit nt!DbgkpSetProcessDebugObject+0x5c: 8063a8b2 7573 jne nt!DbgkpSetProcessDebugObject+0xd1 (8063a927)
第一个函数:DbgkpSetProcessDebugObject(注意edi+0BCh即debugport的位置,前面说了位置是0xbc),当调试器附加进程时设置DebugPort
kd> # bch nt!DbgkpSetProcessDebugObject nt!DbgkpSetProcessDebugObject+0x56: 8063a8ac 399fbc000000 cmp dword ptr [edi+0BCh],ebx
kd> # bch nt!DbgkpSetProcessDebugObject+0x64: 8063a8ba 8987bc000000 mov dword ptr [edi+0BCh],eax第二个函数:DbgkpMarkProcessPeb (注意+0BCh即debugport的位置,前面说了位置是0xbc),当调试器附加进程时设置DebugPort
kd> # bch nt!DbgkpMarkProcessPeb nt!DbgkpMarkProcessPeb+0x42: 80639862 39bebc000000 cmp dword ptr [esi+0BCh],edi第三个函数:DbgkCreateThread(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送线程或者进程创建的调试信息
kd> # bch nt!DbgkCreateThread nt!DbgkCreateThread+0x125: 8063b0d7 399ebc000000 cmp dword ptr [esi+0BCh],ebx第四个函数:DbgkpQueueMessage(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送异常调试信息
kd> # bch nt!DbgkpQueueMessage nt!DbgkpQueueMessage+0x7b: 80639b8d 8b80bc000000 mov eax,dword ptr [eax+0BCh]第五个函数:KiDispatchException(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送异常调试信息
kd> # bch nt!KiDispatchException nt!KiDispatchException+0x187: 804fdac5 39b8bc000000 cmp dword ptr [eax+0BCh],edi第六个函数:DbgkForwardException(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送异常调试信息
kd> # bch nt!KiDispatchException nt!KiDispatchException+0x187: 804fdac5 39b8bc000000 cmp dword ptr [eax+0BCh],edi第七个函数:PspExitThread(注意+0BCh即debugport的位置,前面说了位置是0xbc), 发送线程退出、进程退出的调试信息
kd> # bch nt!PspExitThread nt!PspExitThread+0x286: 805c9554 399fbc000000 cmp dword ptr [edi+0BCh],ebx第八个函数:DbgkExitThread(注意+0BCh即debugport的位置,前面说了位置是0xbc), 发送线程退出、进程退出的调试信息
kd> # bch nt!DbgkExitThread nt!DbgkExitThread+0x20: 8063b370 8b89bc000000 mov ecx,dword ptr [ecx+0BCh]第九个函数:PspCreateProcess(注意+0BCh即debugport的位置,前面说了位置是0xbc),进程创建,设置DebugPort
kd> # bch nt!PspCreateProcess nt!PspCreateProcess+0x1a9: 805c7c35 8983bc000000 mov dword ptr [ebx+0BCh],eax
统计了下:
函数如下:
PspCreateProcess、MmCreatePeb 进程创建,设置DebugPort
DbgkCreateThread 发送线程或者进程创建的调试信息
KiDispatchException、DbgkForwardException和DbgkpQueueMessage 发送异常调试信息
PspExitThread、DbgkExitThread和DbgkExitProcess 发送线程退出、进程退出的调试信息
DbgkMapViewOfSection和DbgkUnMapViewOfSection 发送映像装载卸载调试信息
DbgkpSetProcessDebugObject和DbgkpMarkProcessPeb 当调试器附加进程时设置DebugPort