标 题: 【讨论】白菜 DebugPort 全分析收集 加研究日记 作 者: 紫雨心梦 时 间: 2011-04-14,10:34:00 链 接: http://bbs.pediy.com/showthread.php?t=132340 现在多数程序为了防止调试。基本上都用到了驱动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 以上为读断点部分。。 记下函数+偏移,进入虚拟机,退出OD和LoadSys.exe... 重新打开LoadSys.exe 之后回到Windbg lkd->!process 0 0 LoadSys.exe 重新获得 LoadSys.exe 的EPROCESS地址,如:0x88776655 lkd->ba w4 0x88776655+0xec 给LoadSys.exe的DebugPort下写入断点 再进入虚拟机,开OD,附加LoadSys.exe..之后就会断下。。。 代码: 写: nt!DbgkpSetProcessDebugObject+0xa3 //和读其中一个重复 nt!DbgkClearProcessDebugObject+0x41: 856d3e84 05ec000000 add eax,0ECh nt!DbgkpCloseObject+0x128 和读其中一个重复 至此我们就找到了WIN7下 调试写入DebugPort的内核相关函数。 剩下的事情,我们只需要编写驱动将每个函数偏移下的 ec 改写成 其它EPROCESS中成员 偏移。。。如WIN7下的 CREATE_TIME成员 为 a0。。。EXIT_TIME成员为a8... 改写完后。。。用OD随便附加一个程序。查看其EPROCESS中 你改写的那个偏移,如我改写的是a0。。a0中就存有一个 ??对象句柄??。。就证明改写成功。。。 然后打开有保护驱动的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 mov ecx,dword ptr [eax] ds:0023:0000022a=???????? a5f33387 51 push ecx a5f33388 6820bdf4a5 push offset EagleNT+0x22d20 (a5f4bd20) a5f3338d e89ea1ffff call EagleNT+0x4530 (a5f2d530) a5f33392 8845fb mov byte ptr [ebp-5],al a5f33395 8a45fb mov al,byte ptr [ebp-5] a5f33398 8be5 mov esp,ebp a5f3339a 5d pop ebp a5f3339b c20400 ret 4 分析DUMP文件蓝在这句。。。应该是游戏有检测。。。 a5f33385 8b08 mov ecx,dword ptr [eax] ds:0023:0000022a=???????? 于是HOOK 程序驱动跳过这里。。。 仍然蓝屏,分析DUMP文件蓝在 ntkrnlpa.exe ( nt+2af571 ) 代码: 856c054a 33ff xor edi,edi 856c054c 894b1c mov dword ptr [ebx+1Ch],ecx 856c054f 3bc7 cmp eax,edi 856c0551 750d jne nt+0x2af560 (856c0560) 856c0553 c7442414530300c0 mov dword ptr [esp+14h],0C0000353h 856c055b e9ad000000 jmp nt+0x2af60d (856c060d) 856c0560 b101 mov cl,1 856c0562 8d7010 lea esi,[eax+10h] 856c0565 ff155c214185 call dword ptr [nt+0x115c (8541215c)] 856c056b 88442413 mov byte ptr [esp+13h],al 856c056f 8bc6 mov eax,esi 856c0571 f00fba3000 lock btr dword ptr [eax],0 ds:0023:4d5d748c=???????? 856c0576 7205 jb nt+0x2af57d (856c057d) 856c0578 e886c7d7ff call nt+0x2bd03 (8543cd03) 856c057d 64a124010000 mov eax,dword ptr fs:[00000124h] 856c0583 8b542414 mov edx,dword ptr [esp+14h] 856c0587 894604 mov dword ptr [esi+4],eax 856c058a 0fb6442413 movzx eax,byte ptr [esp+13h] 856c058f 89461c mov dword ptr [esi+1Ch],eax 856c0592 f6423801 test byte ptr [edx+38h],1 蓝在这里 856c0571 f00fba3000 lock btr dword ptr [eax],0 ds:0023:4d5d748c=???????? 由于本菜才疏学浅,于是本菜到此不知道如何再分析下去。。。 希望有大牛们,指点一二。。除上述5种方法以外,还有哪些方法能够绕过DebugPort 清0. 再就是 本菜的分析如何才能继续。。。。 只要思路,方法。。。不要代码结果。。。本菜虽菜,但会以学习为目的提升自身能力,不愿直接拿到那代码而不明其中原理。。。 同时也欢迎有研究精神的同等菜鸟加我一起交流,QQ:495998。。不欢迎找我要代码,结果的人。。。 加我时请注明:看雪-某某... 完毕。。
【讨论】白菜 DebugPort 全分析收集 加研究日记
最新推荐文章于 2023-01-11 15:00:16 发布