- 注册时间
 - 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]
 
 -           }
 
 -   }
 
  复制代码 
 
 |   
 
 
 
 |