欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]水貼:通用的自建調試系統模型

[原创]水貼:通用的自建調試系統模型

網上很多代碼,自建調試系統,都是基於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]
          }
  }
最後我想對QQ群里的這位同學說:
自己只有一個蛋蛋,見到有兩個蛋蛋的人,自然會很驚呆。

上传的附件 AGP_TP_WIN7.png
QQ Photo20140612230440.jpg

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功