看流星社区

 找回密码
 注册账号
查看: 2027|回复: 0

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

[复制链接]

该用户从未签到

发表于 2017-6-1 17:21:00 | 显示全部楼层 |阅读模式
正方案:[/code]
把 EPROCESS->DebugPort = NULL清零,这样调试器就无法接受到消息了,也就无法调试了
[/code]
反方案:[/code]
以下的操作都可以写成一个script来操作.[/code]

debugport和哪些函数相关

1.首先打开一个calc.exe:






[cpp]view
plaincopy






kd>!process00calc.exe
PROCESS861a9020SessionId:0Cid:068cPeb:7ffdb000ParentCid:05c8
DirBase:0c9801a0ObjectTable:e21cdd28HandleCount:44.
Image:calc.exe

查看下debugport的位置





[cpp]view
plaincopy






kd>dt_EPROCESS-yDebugPort861a9020
nt!_EPROCESS
+0x0bcDebugPortnull)


这里看到偏移是0xbc

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





[cpp]view
plaincopy






kd>bar4861a9020+0xbc
kd>bl
0e861a90dcr40001(0001)

2.g运行系统,虚拟机本地打开一个windbg,附加上calc.exe,这时系统肯定会断下来






[cpp]view
plaincopy






kd>g
Breakpoint0hit
nt!DbgkpSetProcessDebugObject+0x5c:
8063a8b27573jnent!DbgkpSetProcessDebugObject+0xd1(8063a927)



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






[cpp]view
plaincopy






kd>#bchnt!DbgkpSetProcessDebugObject
nt!DbgkpSetProcessDebugObject+0x56:
8063a8ac399fbc000000cmpdwordptr[edi+0BCh],ebx


还有一处:






[cpp]view
plaincopy






kd>#bch
nt!DbgkpSetProcessDebugObject+0x64:
8063a8ba8987bc000000movdwordptr[edi+0BCh],eax

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






[cpp]view
plaincopy






kd>#bchnt!DbgkpMarkProcessPeb
nt!DbgkpMarkProcessPeb+0x42:
8063986239bebc000000cmpdwordptr[esi+0BCh],edi

第三个函数:DbgkCreateThread(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送线程或者进程创建的调试信息



[cpp]view
plaincopy






kd>#bchnt!DbgkCreateThread
nt!DbgkCreateThread+0x125:
8063b0d7399ebc000000cmpdwordptr[esi+0BCh],ebx

第四个函数:DbgkpQueueMessage(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送异常调试信息






[cpp]view
plaincopy






kd>#bchnt!DbgkpQueueMessage
nt!DbgkpQueueMessage+0x7b:
80639b8d8b80bc000000moveax,dwordptr[eax+0BCh]

第五个函数:KiDispatchException(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送异常调试信息






[cpp]view
plaincopy






kd>#bchnt!KiDispatchException
nt!KiDispatchException+0x187:
804fdac539b8bc000000cmpdwordptr[eax+0BCh],edi

第六个函数:DbgkForwardException(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送异常调试信息






[cpp]view
plaincopy






kd>#bchnt!KiDispatchException
nt!KiDispatchException+0x187:
804fdac539b8bc000000cmpdwordptr[eax+0BCh],edi

第七个函数:PspExitThread(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送线程退出、进程退出的调试信息






[cpp]view
plaincopy






kd>#bchnt!PspExitThread
nt!PspExitThread+0x286:
805c9554399fbc000000cmpdwordptr[edi+0BCh],ebx

第八个函数:DbgkExitThread(注意+0BCh即debugport的位置,前面说了位置是0xbc),发送线程退出、进程退出的调试信息






[cpp]view
plaincopy






kd>#bchnt!DbgkExitThread
nt!DbgkExitThread+0x20:
8063b3708b89bc000000movecx,dwordptr[ecx+0BCh]

第九个函数:PspCreateProcess(注意+0BCh即debugport的位置,前面说了位置是0xbc),进程创建,设置DebugPort






[cpp]view
plaincopy






kd>#bchnt!PspCreateProcess
nt!PspCreateProcess+0x1a9:
805c7c358983bc000000movdwordptr[ebx+0BCh],eax




统计了下:

函数如下:

PspCreateProcess、MmCreatePeb进程创建,设置DebugPort
DbgkCreateThread发送线程或者进程创建的调试信息
KiDispatchException、DbgkForwardException和DbgkpQueueMessage发送异常调试信息
PspExitThread、DbgkExitThread和DbgkExitProcess发送线程退出、进程退出的调试信息
DbgkMapViewOfSection和DbgkUnMapViewOfSection发送映像装载卸载调试信息
DbgkpSetProcessDebugObject和DbgkpMarkProcessPeb当调试器附加进程时设置DebugPort
2.替换地址
     movecx,dwordptr[ecx+0BCh]//0xBCh就是DebugPort的偏移
     我们可以把DebugPort转移到_EPROCESS的另外一个地方使用+0×070CreateTime,它是纪录进程创建时间的,进程创建之后,在进程退出前系统不会对它进行任何修改,而且我们修改后对系统或进程没有任何影响。我们可以把上面的所有的代码改成这样
     movecx,dwordptr[ecx+070h]//指向CreateTime,实际的DebugPort已经被移到这里
只需要修改一个字节,非常简单
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-3-19 19:55

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表