来自看雪的手把手调试DebugPort清零
来源:互联网 发布:qq三国79js 79xs 编辑:程序博客网 时间:2024/06/04 23:36
现在多数程序为了防止调试。基本上都用到了驱动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->!process0 0 LoadSys.exe
得到LoadSys.exe的EPROCESS地址如。0x87654321
lkd->bar4 0x87654321+0xec (WIN7上DebugPort 偏移为 0xec,可以通过lkd->dt nt!_eprocess,查看。)
上一句下了访问断点。。之后进入虚拟机,打开一个OD。附加LoadSys.exe..这时虚拟机就会断下来。我们来看看调用了哪些函数。。
以上为读断点部分。。
记下函数+偏移,进入虚拟机,退出OD和LoadSys.exe...
重新打开LoadSys.exe
之后回到Windbg
lkd->!process0 0 LoadSys.exe
重新获得LoadSys.exe 的EPROCESS地址,如:0x88776655
lkd->baw4 0x88776655+0xec
给LoadSys.exe的DebugPort下写入断点
再进入虚拟机,开OD,附加LoadSys.exe..之后就会断下。。。
至此我们就找到了WIN7下 调试写入DebugPort的内核相关函数。
剩下的事情,我们只需要编写驱动将每个函数偏移下的 ec 改写成 其它EPROCESS中成员 偏移。。。如WIN7下的 CREATE_TIME成员 为 a0。。。EXIT_TIME成员为a8...
改写完后。。。用OD随便附加一个程序。查看其EPROCESS中你改写的那个偏移,如我改写的是a0。。a0中就存有一个 ??对象句柄??。。就证明改写成功。。。
然后打开有保护驱动的XX程序。。。用OD附加。OD创建线程完后。加载DLL的时候。。直接蓝屏。。。
至于绕过那些HOOK,基本上大家应该已经是没有什么问题了。
估计像我这样的菜鸟也不算多了。研究DebugPort
所谓DebugPort
现在能找到的资料也不算多。。。也许是因为解决方法一旦公布出来,从而导致程序升级。
就现在能找到的资料来谈谈;
1:通过修改调试相关函数,修改DebugPort端口,指向EPROCESS结构中的其它成员,大多数驱动已经有监视了。
2:NOP掉程序驱动中清0函数和监视函数,需要分析程序驱动。
3:修改EThread->Process
4:HOOK
5:用WRK自己编译内核ntoskrnl.exe,改造EPROCESS结构。。。此法只能用于
暂时本菜只了解到这些方法,本菜才疏学浅,至今自己也没想出别的解决思路。。。
下面说下本菜用第一种方法在
因为网上资料大多数为XP系统的。所以自己分析了一下WIN7
本菜用的双机调试,至于如何双机调试网上资料很多。就不在赘诉。
打开虚拟机,打开一个程序。如
之后本机打开Windbg通过串行端口连接虚拟机。
lkd->!process
得到LoadSys.exe
lkd->ba
上一句下了访问断点。。之后进入虚拟机,打开一个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
记下函数+偏移,进入虚拟机,退出OD和LoadSys.exe...
重新打开LoadSys.exe
之后回到Windbg
lkd->!process
重新获得
lkd->ba
给LoadSys.exe的DebugPort下写入断点
再进入虚拟机,开OD,附加LoadSys.exe..之后就会断下。。。
代码:
写: nt!DbgkpSetProcessDebugObject+0xa3 //和读其中一个重复 nt!DbgkClearProcessDebugObject+0x41: 856d3e84 05ec000000 add eax,0ECh nt!DbgkpCloseObject+0x128 ////和读其中一个重复
剩下的事情,我们只需要编写驱动将每个函数偏移下的
改写完后。。。用OD随便附加一个程序。查看其EPROCESS中
然后打开有保护驱动的XX程序。。。用OD附加。OD创建线程完后。加载DLL的时候。。直接蓝屏。。。
代码:
a5f3334e 894dfc mov dword ptr [ebp-4],ecx a5f33351 eb27 jmp EagleNT+0xa37a (a5f3337a) a5f33353 833d5833f4a506 cmp dword ptr [EagleNT+0x1a358 (a5f43358)],6 a5f3335a 7517 jne EagleNT+0xa373 (a5f33373) a5f3335c 833d5c33f4a501 cmp dword ptr [EagleNT+0x1a35c (a5f4335c)],1 a5f33363 750e jne EagleNT+0xa373 (a5f33373) a5f33365 8b5508 mov edx,dword ptr [ebp+8] a5f33368 81c22c020000 add edx,22Ch a5f3336e 8955fc mov dword ptr [ebp-4],edx a5f33371 eb07 jmp EagleNT+0xa37a (a5f3337a) a5f33373 c745fc00000000 mov dword ptr [ebp-4],0 a5f3337a 837dfc00 cmp dword ptr [ebp-4],0 a5f3337e 7415 je EagleNT+0xa395 (a5f33395) a5f33380 6a10 push 10h a5f33382 8b45fc mov eax,dword ptr [ebp-4] a5f33385 8b08