- 注册时间
- 2021-4-16
- 最后登录
- 2024-3-7
- 在线时间
- 2 小时
编程入门
- 龙马币
- 40
|
网上很多代码,自建调试系统,都是基于WRK修改的方法,随便打开一份带有自建调试系统的源码,都能看到M$程序猪的代码,所以,这就是为什麽大部分写驱动的人都把调试系统固定在XP上(因为win7以上没有WRK作为参考)
观察一下网上的代码,我们大可得到一个规律:
凡是有对于DBGPort判断的地方,都把自己从其他地方得到的DEBUG_OBJECT替换掉,大家可以去对比他们的代码。
那麽我们纵观全系统,对于DBGPort清零,我们可以使用HOOK模型。这种HOOK模式是我第一次在AGP高级班的7.1.1上第一次出现。大家可以去网上找,一堆盗版。那麽我们怎麽样的思路来兼容WIN7呢?我们查看IDA,随便找一个访问到DBGPort的代码:
- _DbgkMapViewOfSection@20 proc near ; CODE XREF: NtMapViewOfSection(x,x,x,x,x,x,x,x,x,x)+223p
- PAGE:0065733E
- PAGE:0065733E var_C0 = dword ptr -0C0h
- PAGE:0065733E var_BC = dword ptr -0BCh
- PAGE:0065733E var_A8 = dword ptr -0A8h
- PAGE:0065733E var_A0 = dword ptr -0A0h
- PAGE:0065733E var_9C = dword ptr -9Ch
- PAGE:0065733E var_98 = dword ptr -98h
- PAGE:0065733E var_94 = dword ptr -94h
- PAGE:0065733E var_90 = dword ptr -90h
- PAGE:0065733E ms_exc = CPPEH_RECORD ptr -18h
- PAGE:0065733E arg_0 = dword ptr 8
- PAGE:0065733E
- PAGE:0065733E push 0B0h
- PAGE:00657343 push offset stru_455C98
- PAGE:00657348 call __SEH_prolog4
- PAGE:0065734D mov edi, edx
- PAGE:0065734F mov eax, large fs:124h
- PAGE:00657355 mov al, [eax+13Ah]
- PAGE:0065735B xor ebx, ebx
- PAGE:0065735D cmp al, bl
- PAGE:0065735F jz loc_657482
- PAGE:00657365 mov edx, large fs:124h
- PAGE:0065736C test byte ptr [edx+280h], 4
- PAGE:00657373 jnz loc_657482
- PAGE:00657379 cmp [ecx+0ECh], ebx
复制代码
那麽我们怎麽让这裡的DBGPort是有效的呢?首先,我们通过Hook
NtCreateDebugObject 得到OD创建的DEBUG_OBJECT对象,保存到我们驱动的全局变量:
- PDEBUG_OBJECT g_DebugPort;
- g_DebugPort = ReferencedObject;
复制代码
这个时候我们已经拥有了DBGPort了,那麽剩下遵守这个规则:
JNZ的,就hook这个地方,把0x0EC设置为g_DebugPort让判断通过
需要DBGPort的地方,就把g_DebugPort给它。
给出一个典型的处理例子:
- __declspec(naked) VOID NewDbgkMapViewOfSection()
- {
- __asm
- {
- //如果不是游戏进程,则直接返回
- cmp ecx,eprocess_gameprocess
- jnz _ret
-
- //如果游戏进程为0,也直接返回
- cmp eprocess_gameprocess,0
- jz _ret
-
- //debugport为0,也要返回了
- cmp g_DebugPort,0
- jz _ret
-
- /*
- 8408f379 3999ec000000 cmp dword ptr [ecx+0ECh],ebx
- 8408f37f 0f84fd000000 je nt!DbgkMapViewOfSection+0x144 (8408f482)
- */
- push eax
- mov eax,g_DebugPort
- mov dword ptr[ecx+0ECh],eax //修改,让ec偏移有值绕过判断
- pop eax
- _ret:
- jmp [DbgkMapViewOfSectionHookZone]
- }
- }
复制代码
|
|