fjx16852318 发表于 2018-3-4 10:54:57

通用的自建调试系统模型


        网上很多代码,自建调试系统,都是基于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 ptr8
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,
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 , 4
PAGE:00657373               jnz   loc_657482
PAGE:00657379               cmp   , 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 ,ebx
                          8408f37f 0f84fd000000    je      nt!DbgkMapViewOfSection+0x144 (8408f482)
                          */
                          push eax
                          mov eax,g_DebugPort
                          mov dword ptr,eax //修改,让ec偏移有值绕过判断
                          pop eax
  _ret:
                          jmp
        }
  }
页: [1]
查看完整版本: 通用的自建调试系统模型