首页
社区
课程
招聘
[讨论]白菜 DebugPort 全分析收集 加研究日记
发表于: 2011-4-14 10:34 25047

[讨论]白菜 DebugPort 全分析收集 加研究日记

2011-4-14 10:34
25047

现在多数程序为了防止调试。基本上都用到了驱动HOOK 内核API。
至于绕过那些HOOK,基本上大家应该已经是没有什么问题了。

估计像我这样的菜鸟也不算多了。研究DebugPort 清0,倒是难倒了我。。。

所谓DebugPort 清0,就是向 EPROCESS->DebugPort  不停写入 NULL(0)值。。让调试器无法收到调试信息。。。

现在能找到的资料也不算多。。。也许是因为解决方法一旦公布出来,从而导致程序升级。

就现在能找到的资料来谈谈;

1:通过修改调试相关函数,修改DebugPort端口,指向EPROCESS结构中的其它成员,大多数驱动已经有监视了。

2:NOP掉程序驱动中清0函数和监视函数,需要分析程序驱动。

3:修改EThread->Process 指向自定义结构,程序驱动如果也是这样访问的DebugPort此方法都无效了。

4:HOOK 缺页异常然后把eprocess弄成invalid然后自己处理,此方法本菜鸟没试过,因为本菜鸟还不知如果HOOK 缺页异常,能找到的资料甚少。也希望有大牛们能指点一二。

5:用WRK自己编译内核ntoskrnl.exe,改造EPROCESS结构。。。此法只能用于 XP64和2003SP1.

暂时本菜只了解到这些方法,本菜才疏学浅,至今自己也没想出别的解决思路。。。

下面说下本菜用第一种方法在 WIN7下的研究。。

因为网上资料大多数为XP系统的。所以自己分析了一下WIN7 调试相关函数。

本菜用的双机调试,至于如何双机调试网上资料很多。就不在赘诉。

打开虚拟机,打开一个程序。如 LoadSys.exe

之后本机打开Windbg通过串行端口连接虚拟机。

lkd->!process 0 0 LoadSys.exe

得到LoadSys.exe 的EPROCESS地址如。0x87654321

lkd->ba r4 0x87654321+0xec (WIN7上DebugPort 偏移为 0xec,可以通过lkd->dt nt!_eprocess,查看。)

上一句下了访问断点。。之后进入虚拟机,打开一个OD。附加LoadSys.exe..这时虚拟机就会断下来。我们来看看调用了哪些函数。。

读:
nt!DbgkCreateThread+0x22a:
856ab86a 399eec000000    cmp     dword ptr [esi+0ECh],ebx

nt!PsGetProcessDebugPort+0x8:
85514130 8b80ec000000    mov     eax,dword ptr [eax+0ECh]

nt!DbgkpSetProcessDebugObject+0x8d:
856f7959 83beec00000000  cmp     dword ptr [esi+0ECh],0

nt!DbgkpSetProcessDebugObject+0x9d:
856f7969 89beec000000    mov     dword ptr [esi+0ECh],edi

nt!DbgkpMarkProcessPeb+0x85:
856f6e90 3987ec000000    cmp     dword ptr [edi+0ECh],eax

nt!DbgkpQueueMessage+0xad:
856f74a7 8b80ec000000    mov     eax,dword ptr [eax+0ECh]

nt!KiDispatchException+0x1d8:
8550539f 39b0ec000000    cmp     dword ptr [eax+0ECh],esi

nt!DbgkForwardException+0x49:
8565deac 8b98ec000000    mov     ebx,dword ptr [eax+0ECh]

nt!PspExitThread+0x2ad:
8569094c 83bfec00000000  cmp     dword ptr [edi+0ECh],0

nt!DbgkExitThread+0x28:
856f8cf1 83b9ec00000000  cmp     dword ptr [ecx+0ECh],0

nt!PspTerminateAllThreads+0x1dd:
856a7ff4 83bfec00000000  cmp     dword ptr [edi+0ECh],0

nt!DbgkExitProcess+0x28:
856f8d63 83b9ec00000000  cmp     dword ptr [ecx+0ECh],0

nt!DbgkpCloseObject+0xd6:
856f707f 3998ec000000    cmp     dword ptr [eax+0ECh],ebx

nt!DbgkpCloseObject+0x119:
856f70c2 3998ec000000    cmp     dword ptr [eax+0ECh],ebx

nt!DbgkpCloseObject+0x121:
856f70ca 83a0ec00000000  and     dword ptr [eax+0ECh],0
写:
nt!DbgkpSetProcessDebugObject+0xa3   //和读其中一个重复

nt!DbgkClearProcessDebugObject+0x41:
856d3e84 05ec000000      add     eax,0ECh

nt!DbgkpCloseObject+0x128            ////和读其中一个重复


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (21)
雪    币: 656
活跃值: (448)
能力值: ( LV12,RANK:360 )
在线值:
发帖
回帖
粉丝
2
对内核不懂,但不知道可不可以在系统读取EPROCESS->DebugPort的地方做手脚呢?
2011-4-14 12:24
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mark

ready for myself
2011-4-15 10:52
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
4
自己建立调试机制~无敌于此类**的小技巧~
2011-4-15 21:25
0
雪    币: 3227
活跃值: (2908)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
在哪有关此类的问题都会有此人的这样的回帖,但从不见放代码或者实际东西(虽然是有),确实无敌。
2011-4-16 02:53
0
雪    币: 1022
活跃值: (31)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
CREATE_TIME成员 为 a0 -----启动时蓝屏
EXIT_TIME成员为a8------退出蓝屏
因为写入的时间会覆盖调试对象,引起异常
另外你找的函数不全
注意有两个函数有多处便宜需要修改
2011-4-16 07:48
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
修改的函数不够多,而且不见你如何修改,怎知哪里出的问题。哈哈
2011-4-16 08:45
0
雪    币: 251
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
请问如何自己建立调试机制呢?所有调试相关的函数自己写?
能给个思路?
2011-4-16 13:06
0
雪    币: 251
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
我找的函数是用WINDBG 下断一个一个跟的。。只断下了这些函数。。

请问还有哪些函数。望指点!
2011-4-16 13:07
0
雪    币: 251
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
我只断下了这些函数啊。好像调试的时候就访问了这些函数。请问还有哪些函数要改啊?
最好能指点下如何查找这些函数?
2011-4-16 13:10
0
雪    币: 217
活跃值: (68)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
11
2:NOP掉程序驱动中清0函数和监视函数,需要分析程序驱动

为什么不这样呢
2011-4-16 17:24
0
雪    币: 251
活跃值: (26)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
也许是我比较菜吧。。。至今还没能在虚拟机里面运行那个游戏。
驱动也就不能加载,分析不了。求指点。
2011-4-18 13:51
0
雪    币: 152
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
讲的很深,看不太懂。
2011-4-19 11:42
0
雪    币: 27
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
SIP
14
cvcvxk  放点思路给我们菜鸟学习呀!
2011-4-19 22:10
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
老V已经说了  自己建立调试机制。。
2011-4-23 01:50
0
雪    币: 284
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
写个search kernel memory的所有偏移有ec的 func
自然就知道了嘛
反正你列出的这些比我找到的少很多
2011-4-23 08:31
0
雪    币: 154
活跃值: (560)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
17
Create_Time 你直接引用当然要出错的,在PspCreateProcess的那句话抹掉
ExitTime 同样在进程退出的时候PspExitProcess会操作你的DebugPort,处理下就不蓝啦。

不过还是相信老v吧,自己搞调试机制
2011-4-30 20:02
0
雪    币: 193
活跃值: (64)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
18
对于清零这个问题的处理很简单,调试一下它的驱动,改改几处代码就行了,简洁又快速,不用去想别的方法,只要你会调试程序,慢慢搞搞就出来了,即使你不懂驱动,懂得汇编就行了,如果不能去掉双机调试的限制,单机也可以!
2011-5-28 16:26
0
雪    币: 71
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
请举个例子·,3q
2011-5-28 19:40
0
雪    币: 278
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
做个标记,以后来看看
2012-1-20 15:07
0
雪    币: 4741
活跃值: (4291)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
Create_Time和ExitTime 都会引发蓝屏,改成1F0就可以了xp下这个值是空的。
2018-10-31 17:53
0
雪    币: 4741
活跃值: (4291)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
cvcvxk 自己建立调试机制~无敌于此类**的小技巧~
这样的方法也适用于Win7 x64的系统吗??
2018-10-31 17:53
0
游客
登录 | 注册 方可回帖
返回
//