0.ring0-更改dbgport地址偏移过掉dbgport清0

正方案:
把 EPROCESS->DebugPort = NULL清零,这样调试器就无法接受到消息了,也就无法调试了 
反方案:
以下的操作都可以写成一个script来操作.

debugport和哪些函数相关

1.首先打开一个calc.exe:
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   

 2.替换地址
           mov     ecx,dword ptr [ecx+0BCh] //0xBCh就是DebugPort的偏移
          我们可以把DebugPort转移到_EPROCESS的另外一个地方使用+0×070 CreateTime,它是纪录进程创建时间的,进程创建之后,在进程退出前系统不会对它进行任何修改,而且我们修改后对系统或进程没有任何影响。我们可以把上面的所有的代码改成这样
          mov     ecx,dword ptr [ecx+070h] //指向CreateTime,实际的DebugPort已经被移到这里
     只需要修改一个字节,非常简单

















你可能感兴趣的:(编程,windows,汇编,null,fun)