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

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

debugport和哪些函数相关

1.首先打开一个calc.exe:
[cpp]  view plain  copy
  1. kd> !process 0 0 calc.exe  
  2. PROCESS 861a9020  SessionId: 0  Cid: 068c    Peb: 7ffdb000  ParentCid: 05c8  
  3.     DirBase: 0c9801a0  ObjectTable: e21cdd28  HandleCount:  44.  
  4.     Image: calc.exe  
查看下debugport的位置
[cpp]  view plain  copy
  1. kd> dt _EPROCESS -y DebugPort  861a9020    
  2. nt!_EPROCESS  
  3.    +0x0bc DebugPort : (null)   

这里看到偏移是0xbc

对它下内存读写断点:(r是表示读或写)

[cpp]  view plain  copy
  1. kd> ba r4 861a9020+0xbc  
  2. kd> bl  
  3.  0 e 861a90dc r 4 0001 (0001)   
2.g运行系统,虚拟机本地打开一个windbg,附加上calc.exe,这时系统肯定会断下来

[cpp]  view plain  copy
  1. kd> g  
  2. Breakpoint 0 hit  
  3. nt!DbgkpSetProcessDebugObject+0x5c:  
  4. 8063a8b2 7573            jne     nt!DbgkpSetProcessDebugObject+0xd1 (8063a927)  

第一个函数:DbgkpSetProcessDebugObject(注意edi+0BCh即debugport的位置,前面说了位置是0xbc),当调试器附加进程时设置DebugPort

[cpp]  view plain  copy
  1. kd> # bch nt!DbgkpSetProcessDebugObject   
  2. nt!DbgkpSetProcessDebugObject+0x56:  
  3. 8063a8ac 399fbc000000    cmp     dword ptr [edi+0BCh],ebx  

还有一处:

[cpp]  view plain  copy
  1. kd> # bch   
  2. nt!DbgkpSetProcessDebugObject+0x64:  
  3. 8063a8ba 8987bc000000    mov     dword ptr [edi+0BCh],eax  
第二个函数:DbgkpMarkProcessPeb (注意+0BCh即debugport的位置,前面说了位置是0xbc),当调试器附加进程时设置DebugPort

[cpp]  view plain  copy
  1. kd> # bch nt!DbgkpMarkProcessPeb  
  2. nt!DbgkpMarkProcessPeb+0x42:  
  3. 80639862 39bebc000000    cmp     dword ptr [esi+0BCh],edi  
第三个函数:DbgkCreateThread(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送线程或者进程创建的调试信息
[cpp]  view plain  copy
  1. kd> # bch nt!DbgkCreateThread   
  2. nt!DbgkCreateThread+0x125:  
  3. 8063b0d7 399ebc000000    cmp     dword ptr [esi+0BCh],ebx  
第四个函数:DbgkpQueueMessage(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送异常调试信息

[cpp]  view plain  copy
  1. kd> # bch nt!DbgkpQueueMessage   
  2. nt!DbgkpQueueMessage+0x7b:  
  3. 80639b8d 8b80bc000000    mov     eax,dword ptr [eax+0BCh]  
第五个函数:KiDispatchException(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送异常调试信息

[cpp]  view plain  copy
  1. kd> # bch nt!KiDispatchException   
  2. nt!KiDispatchException+0x187:  
  3. 804fdac5 39b8bc000000    cmp     dword ptr [eax+0BCh],edi  
第六个函数:DbgkForwardException(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送异常调试信息

[cpp]  view plain  copy
  1. kd> # bch nt!KiDispatchException   
  2. nt!KiDispatchException+0x187:  
  3. 804fdac5 39b8bc000000    cmp     dword ptr [eax+0BCh],edi  
第七个函数:PspExitThread(注意+0BCh即debugport的位置,前面说了位置是0xbc), 发送线程退出、进程退出的调试信息

[cpp]  view plain  copy
  1. kd> # bch nt!PspExitThread   
  2. nt!PspExitThread+0x286:  
  3. 805c9554 399fbc000000    cmp     dword ptr [edi+0BCh],ebx  
第八个函数:DbgkExitThread(注意+0BCh即debugport的位置,前面说了位置是0xbc), 发送线程退出、进程退出的调试信息

[cpp]  view plain  copy
  1. kd> # bch nt!DbgkExitThread   
  2. nt!DbgkExitThread+0x20:  
  3. 8063b370 8b89bc000000    mov     ecx,dword ptr [ecx+0BCh]  
第九个函数:PspCreateProcess(注意+0BCh即debugport的位置,前面说了位置是0xbc),进程创建,设置DebugPort

[cpp]  view plain  copy
  1. kd> # bch nt!PspCreateProcess  
  2. nt!PspCreateProcess+0x1a9:  
  3. 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已经被移到这里
     只需要修改一个字节,非常简单

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值