1. 程式人生 > >過TesSafe反WinDbg雙機除錯

過TesSafe反WinDbg雙機除錯

貌似論壇裡面有關遊戲的貼子都很火,所以發篇帖子漲點人氣。

正文:
在論壇搜尋了下發現去年的時候有人發過一篇過TesSafe反雙機除錯的帖子,但是現在已經過時了,並且帖子裡面也沒提到怎麼處理被IAT HOOK的兩個函式。在這裡呢,我就給大家徹底的講明白吧。

先開ARK工具看看遊戲幹了什麼。

點選圖片以檢視大圖圖片名稱: 1.jpg檢視次數: 6檔案大小: 36.1 KB檔案 ID : 78490

從圖片可以看到遊戲啟動的時候對ntkrnlmp.exe中的kdcom.KdSendPacket和kdcom.KdReceivePacket兩個函式進行了HOOK,通過函式名稱就能猜測到函式的用途,一個發包,一個收包,都是com口用來通訊的。

怎樣恢復這兩個函式呢,方面有很多種,列舉兩個。

1、自己對映核心檔案ntkrnlmp.exe,然後通過PE結構遍歷ntkrnlmp.exe的匯入表,獲取匯入表中KdSendPacket、 KdReceivePacket兩個函式的地址在ntkrnlmp.exe中的偏移,然後利用這個偏移修改系統正常執行的ntkrnlmp.exe匯入表 中的兩個函式地址。


但是這裡還有一個問題就是,匯入表中KdReceivePacket這個位置有程式碼校驗,只要被修改就會重啟,所以還得繞過程式碼校驗。所以不推薦這種方法。

2、通過圖片可以看到被IATHOOK的兩個函式被掛鉤後的新地址分別為0xB07920E6,0xB07920F6,相差16個位元組。既然不想直接去恢 復匯入表,那麼我們可以在這兩個被掛鉤後的地址中再跳回正常的KdSendPacket、KdReceivePacket。或許有人又有疑問,這兩個掛鉤 地址處沒有程式碼校驗嗎,答案是也有校驗,只要修改前面幾個位元組,同樣會重啟。但是遊戲只檢測了前面的幾個位元組,所以只要在靠後一點的地方修改就不會被檢測 到。

名稱:  2.jpg檢視次數: 0檔案大小:  35.6 KB

修改後
名稱:  3.jpg檢視次數: 1檔案大小:  38.3 KB

另外一個也是同樣處理函式

名稱:  4.jpg檢視次數: 0檔案大小:  36.9 KB

這樣兩個被IATHOOK的函式就相當於被恢復了。

但是上面我們是用工具進行恢復的,而TP啟動的時候就已經呼叫了KdDisableDebugger禁止了WinDbg雙機除錯,這時候就算恢復了上面的兩個函式,同樣也無法雙機除錯。


之所以先講怎樣處理上面的兩個函式是因為在TP驅動載入的時候首先進行了IATHOOK,然後呼叫KdDisableDebugger,如果你先處理KdDisableDebugger,而沒有恢復上面兩個函式的話,系統會直接重啟。



因為要趕在TP呼叫KdDisableDebugger之前恢復IATHOOK,那麼就需要設定一個系統回撥函式,然後在載入TP驅動的時候進入我們的回 調函式,這時TP已經載入完成,但是還沒有開始執行,所以我們可以直接定位到 掛鉤地址 處 寫入跳轉程式碼到正常的函式。


程式碼:
//恢復兩個被iat hook的函式

VOID RenewIATHook(ULONG ImageBase)      
{
  // 模組:KDCOM.dll,函式名稱:KdSendPacket,函式地址:ba5a91b2,Hint:0007
  //模組:KDCOM.dll,函式名稱:KdReceivePacket,函式地址:ba5a8f4c,Hint:0004

  ULONG uKdSend = 0xba5a91b2;     //KdSendPacket的地址硬編碼
  ULONG uKdReceive = 0xba5a8f4c;  //KeReceivePacket地址 

  //因為這兩個函式不是匯出的,所以我為了省事,就直接這樣寫了

  ULONG uJmpKdSend = ImageBase + 0x20EE;
  //KdSendPacket掛鉤函式地址 = ImageBase + 0x20EE; 硬編碼 :o:

  ULONG uJmpKdReceive = ImageBase + 0x20FE;

  ULONG jmpAddr1 = uKdSend - uJmpKdSend - 5;
  ULONG jmpAddr2 = uKdReceive - uJmpKdReceive - 5;

  __asm
  {  
    cli
      pushad
      mov    eax,uJmpKdSend
      mov    byte ptr [eax],0xE9
      mov    ebx,jmpAddr1
      mov    dword ptr [eax+1],ebx

      mov    eax,uJmpKdReceive
      mov    byte ptr [eax],0xE9
      mov    ebx,jmpAddr2
      mov    dword ptr [eax+1],ebx

      popad
      sti
  }
}


ULONG strEnd(PWCHAR dest,PWCHAR sub)
{
  if (dest == NULL && sub == NULL)
    return 0;
  int ulDest = wcslen(dest);
  int ulSub = wcslen(sub);

  if (ulSub == 0 || ulSub > ulDest)
    return 0;
  return !wcscmp(&dest[ulDest - ulSub],sub);
}

VOID NotifyRoutine(IN PUNICODE_STRING  FullImageName,
  IN HANDLE  ProcessId, // where image is mapped
  IN PIMAGE_INFO  ImageInfo)
{
              //這個strEnd是一個判斷字串是不是以***結束
         //我記得wdk中有一個函式可以判斷的,但是記不起來了,知道的回覆下啊:eek:
  if (strEnd(FullImageName->Buffer,L"TesSafe.sys"))
  {
                                 //判斷載入的驅動是不是TP
    KdPrint(("TesSafe.sys:ImageBase:x \t size: x\n",
ImageInfo->ImageBase,ImageInfo->ImageSize));
    RenewIATHook((ULONG)ImageInfo->ImageBase);  
  }
}


#pragma alloc_text("INIT")
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegPath){
  NTSTATUS status;
  UNREFERENCED_PARAMETER(RegPath);

  DriverObject->DriverUnload = DriverUnload;
  for (int i=0;i<IRP_MJ_MAXIMUM_FUNCTION;i++)
    DriverObject->MajorFunction[i] = DriverDispatch;


  KdPrint(("Init\n"));
  PsSetLoadImageNotifyRoutine(NotifyRoutine);

  return STATUS_SUCCESS;
}

通過上面的程式碼就可以對IATHOOK的兩個函式進行恢復

編譯上面的程式碼,然後重啟虛擬機器,載入編譯好的驅動執行。

下面就來處理TP呼叫KdDisableDebugger函式來禁止除錯

WinDbg中輸入bp KdDisableDebugger

啟動DNF登陸器,然後WinDbg斷下,

點選圖片以檢視大圖圖片名稱: 5.jpg檢視次數: 3檔案大小: 132.2 KB檔案 ID : 78489

直接修改首行程式碼 ret 返回即可。

eb 804f8886 0xC3

單步走一下,返回上層函式。

程式碼:
b094dfd9 57              push    edi
b094dfda 8b782c          mov     edi,dword ptr [eax+2Ch]
b094dfdd 33f1            xor     esi,ecx
b094dfdf 33f9            xor     edi,ecx
b094dfe1 eb4b            jmp     TesSafe+0x702e (b094e02e)
b094dfe3 803d6da295b000  cmp     byte ptr [TesSafe+0x1326d (b095a26d)],0
b094dfea 7516            jne     TesSafe+0x7002 (b094e002)
b094dfec 688a4d6e43      push    436E4D8Ah
b094dff1 6876426e57      push    576E4276h
b094dff6 e873caffff      call    TesSafe+0x3a6e (b094aa6e)
b094dffb c6056da295b001  mov     byte ptr [TesSafe+0x1326d (b095a26d)],1
b094e002 85ff            test    edi,edi
b094e004 7404            je      TesSafe+0x700a (b094e00a)
b094e006 ffd7            call    edi           //call KdDisableDebugger
b094e008 eb24            jmp     TesSafe+0x702e (b094e02e)
b094e00a 803d6ea295b000  cmp     byte ptr [TesSafe+0x1326e (b095a26e)],0
b094e011 751b            jne     TesSafe+0x702e (b094e02e)
b094e013 6812010000      push    112h
b094e018 68e64d6e43      push    436E4DE6h
b094e01d 6873426e57      push    576E4273h
b094e022 e865caffff      call    TesSafe+0x3a8c (b094aa8c)
b094e027 c6056ea295b001  mov     byte ptr [TesSafe+0x1326e (b095a26e)],1
b094e02e 803e00          cmp     byte ptr [esi],0
b094e031 75b0            jne     TesSafe+0x6fe3 (b094dfe3) 

//跳回去,繼續call KdDisableDebugger  ,應該是個while迴圈,所以把這裡nop掉
//ew b094e031 0x9090

b094e033 5f              pop     edi
b094e034 5e              pop     esi
b094e035 c3              ret
輸入g,繼續執行,WinDbg再次斷下。

檢視呼叫堆疊:TesSafe+0x7124

程式碼:
b094e112 a16ceb95b0      mov     eax,dword ptr [TesSafe+0x17b6c (b095eb6c)]
b094e117 8b402c          mov     eax,dword ptr [eax+2Ch]
b094e11a 330568eb95b0    xor     eax,dword ptr [TesSafe+0x17b68 (b095eb68)]
b094e120 7404            je      TesSafe+0x7126 (b094e126)
b094e122 ffd0            call    eax         //call KdDisableDebugger 
b094e124 eb24            jmp     TesSafe+0x714a (b094e14a)
b094e126 803d72a295b000  cmp     byte ptr [TesSafe+0x13272 (b095a272)],0
b094e12d 751b            jne     TesSafe+0x714a (b094e14a)
b094e12f 6882010000      push    182h
b094e134 68e64d6e43      push    436E4DE6h
b094e139 6873426e57      push    576E4273h
b094e13e e849c9ffff      call    TesSafe+0x3a8c (b094aa8c)
b094e143 c60572a295b001  mov     byte ptr [TesSafe+0x13272 (b095a272)],1
b094e14a 8b0d64a295b0    mov     ecx,dword ptr [TesSafe+0x13264 (b095a264)]
//跳到這裡,dd b095a264的值是8055d664 
//kd> u 8055d664 
//nt!KiDebugRoutine:             

b094e150 85c9            test    ecx,ecx
b094e152 740f            je      TesSafe+0x7163 (b094e163)
b094e154 a168a295b0      mov     eax,dword ptr [TesSafe+0x13268 (b095a268)]
//這裡eax = nt!KdpStub:

b094e159 85c0            test    eax,eax
b094e15b 7406            je      TesSafe+0x7163 (b094e163)
b094e15d 3901            cmp     dword ptr [ecx],eax
b094e15f 7402            je      TesSafe+0x7163 (b094e163)
b094e161 8901            mov     dword ptr [ecx],eax
//根據上面的ecx,跟eax的值來看 應該是設定debug函式之類的。
//測試後,發現這條程式碼執行後,windbg失去通訊。所以直接nop掉


b094e163 c3              ret
b094e164 cc              int     3
b094e165 cc              int     3
輸入g,繼續執行,這時WinDbg輸出
Shutdown occurred at (Wed Apr 24 11:59:41.193 2013 (UTC + 8:00))...unloading all symbol tables.
Waiting to reconnect...

看樣子好像是重啟了? 在切換到虛擬機發現並沒有重啟。

這個地方經過測試發現如果沒有恢復上面的兩個IATHOOK,系統就直接死掉了,如果恢復了,雖然windbg輸出了上面的資訊,但切換到虛擬機器之後發現遊戲已經到了 輸入賬號密碼 介面。


到了這一步,仍然沒完,將虛擬機器斷下來,再次下bp KdDisableDebugger斷點。

發現系統再次斷下,因為我們已經在KdDisableDebugger的第一行程式碼ret了。所以不用擔心WinDbg會斷開,輸入g,再次執行,再次斷下。

發現這裡應該有一個定時器在不斷的呼叫KdDisableDebugger。



程式碼:
b0965112 a16c5b97b0      mov     eax,dword ptr ds:[B0975B6Ch]
b0965117 8b402c          mov     eax,dword ptr [eax+2Ch]
b096511a 3305685b97b0    xor     eax,dword ptr ds:[0B0975B68h]
b0965120 7404            je      b0965126
b0965122 ffd0            call    eax           //call KdDisableDebugger
b0965124 eb24            jmp     b096514a
b0965126 803d721297b000  cmp     byte ptr ds:[0B0971272h],0
b096512d 751b            jne     b096514a
b096512f 6882010000      push    182h
b0965134 68e64d6e43      push    436E4DE6h
b0965139 6873426e57      push    576E4273h
b096513e e849c9ffff      call    b0961a8c
b0965143 c605721297b001  mov     byte ptr ds:[0B0971272h],1
b096514a 8b0d641297b0    mov     ecx,dword ptr ds:[0B0971264h]
b0965150 85c9            test    ecx,ecx
b0965152 740f            je      b0965163
b0965154 a1681297b0      mov     eax,dword ptr ds:[B0971268h]
b0965159 85c0            test    eax,eax
b096515b 7406            je      b0965163
b096515d 3901            cmp     dword ptr [ecx],eax
b096515f 7402            je      b0965163
b0965161 90              nop
b0965162 90              nop
b0965163 c3              ret


這裡怎麼處理,直接把call eax nop掉嗎,很不幸,哪條程式碼也有校驗,一改就重啟了。不過哪個位置不能改,我們可以改別的位置。在這個函式頭部b0965112 的位置直接 jmp b0965124 跳過call eax即可。

這樣就可以完全的解決了TP的反雙機除錯。

以前的那篇文章裡面提到在登陸游戲過程中還會呼叫KdDisableDebugger,但我測試之後發現直到進入遊戲裡面也沒有再斷下來過。。。

點選圖片以檢視大圖圖片名稱: 6.jpg檢視次數: 1檔案大小: 121.2 KB檔案 ID : 78494

然後,可以去邪惡了。。。。


原始碼也貼上吧,都是用硬編碼寫的,自己修改修改就可以了。

過雙機除錯.rar.

相關推薦

TesSafeWinDbg除錯

貌似論壇裡面有關遊戲的貼子都很火,所以發篇帖子漲點人氣。正文:在論壇搜尋了下發現去年的時候有人發過一篇過TesSafe反雙機除錯的帖子,但是現在已經過時了,並且帖子裡面也沒提到怎麼處理被IAT HOOK的兩個函式。在這裡呢,我就給大家徹底的講明白吧。先開ARK工具看看遊戲幹了什麼。從圖片可以看到遊戲啟動的時

windbg 除錯配置(xp)系統

進入虛擬機器C盤 修改boot.ini檔案屬性,然後 開啟boot.ini檔案,複製一下內容到boot.ini檔案 [boot loader] timeout=5 default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS [operating syst

搭建VS2017+WDK10+WinDBG除錯Win7環境過程遇到的坑與解決(WinDBG找不到串列埠、security_cookie導致的藍屏、看不到除錯訊息等)

一直使用Visual Studio + WDK的方式開發Windows驅動,最近想在VS2017下安裝WDK10開發驅動,結果遇到問題了,首先是沒法實現雙機除錯,然後是編譯出來的驅動在Win7平臺下一載入就藍屏,定位到是security_cookie的問題,緊接

Windbg除錯

by zxy,Java/C++程式設計交流群:168424095      時隔兩年再次觸電Windows核心程式設計,肯定是把之前的先回憶一遍再進行程式設計了。看的還是那本書《寒江獨釣Windo

windbg除錯(本和VM虛擬機器)驅動程式

本文為在學習過程中的筆記,寫的不好請見諒. 在除錯核心驅動程式時,驅動程式被作業系統載入.而作業系統無法自己除錯自己.所以要用一臺計算機除錯另一臺計算機的作業系統,進而除錯核心驅動. 使用windbg對虛擬機器中的作業系統進行除錯之前,要先配置windbg和

windbg除錯時對R3函式下斷

對於剛接觸windbg的童鞋可能想在雙機除錯的環境下檢視某個使用者態函式的反彙編,可能會直接下直接斷點,這是會產生如下提示的錯誤 Bp expression ‘*******’ could not be resolved, adding deferred bp這是因為沒有切

之二:Win7-x64 + VMWare (Win7-x64) + WinDbg 除錯環境搭建

驅動開發入門 - 之二Win7-x64 + VMWare (Win7-x64) + WinDbg雙機除錯環境搭建 —— By EXP 2017-10-08 完整原文下載(轉載請註明出處,僅供分享學習,嚴禁用於商業用途) 1. 概述

ida藉助windbg 除錯核心

用windbg雙機除錯的話,因為是命令列類似於以程式設計來代替手工跟蹤的方式。習慣了用OD+ida分析的,肯定會不適應,於是就有ida的除錯方式可以代替它,我使用的是ida 5.5,可能有一些區別,希望碰到問題的朋友能夠一起解決,交流才能進步。 把配置檔案配置好的話,會

Win7除錯環境搭建之配置WinDbg

  轉:http://www.16boke.com/article/detail/173 環境:   主機:Win7 虛擬機器:VMware 11.1.0 build-2496824 虛擬機器內作業系統(又稱GuestOS):Win7 WinDbg:適

搭建Windbg和Hyper-V第二代虛擬機器,除錯核心環境

VMware太重了,4G記憶體筆記本跑起來好吃力,我的另外一臺E3+16G電腦,裝上VMware開機速度變得很慢,於是研究下,用windows原生的虛擬機器配合Windbg雙機除錯 系統最低win10,記得開啟bios上的虛擬化支援 第一步: 首先需要安裝Windbg執行環

win10中 “windbg+vmware+win10除錯” 設定

 本文主要介紹在win10下如何設定windbg+vmware,以進行雙機除錯。 一、安裝環境 1,主機(Host OS): win10 X64 2,Windbg:10.0.10586.567 ADM64 3,VMWare:12.0.0 4,Guest OS:w

WinDBG+VmWare除錯連線不上的一個原因

這兩天搭建VmWare+WinDBG的雙機除錯環境,Server OS是Win7,Guest OS是Win XP SP3.按照網上的教程安裝後之後,啟動虛擬機器,選擇除錯系統,開啟WinDBG,系統啟動之後總是連線不上。後來找到一個原因,如下:        按照網上的說法

WinDbg+VMWare除錯環境搭建

因為要學習一下驅動開發,需要搭建一個除錯環境,我按照《寒江獨釣——windows核心安全程式設計》一書搭建了一個WinDbg+VMWare的雙機除錯環境,這其中遇到了一些小問題,雖然只是一些細節問題,但是如果初次遇到的話還是讓人有點抓狂的,我記錄下來,希望幫到和我遇到一樣問

windbg遠端除錯

 1. 拷貝要除錯的可執行檔案和對應的PDB符號到虛擬機器。  2. 在虛擬機器中啟動服務端,有2種方式。`windbg.exe -server tcp:port=8888 C:\Test.exe` 這種方式可以除錯main函式和程式的啟動過程。  `windbg.exe

33.Windbg-VMware+windbg搭建除錯(增加virtualKD)

虛擬機器環境 1.xp 虛擬機器用的是XP系統,找到XP系統開啟系統盤(比如C盤),找到Boot.ini,去掉這個檔案的只讀屬性,用記事本開啟Boot.ini [boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)p

除錯windbg的命令

各位大牛以及和我一樣還是菜鳥的朋友們,大家好,今天在除錯驅動程式時,由於要做雙機除錯,所以順便再論壇發給以後需要的朋友,相對網上其他教程我的這個 算是比較詳細了,因為我是看了網上很多相關文章,他們多多少少都還是存在一些問題,可能導致我們無法正常除錯。 我通過結合自己的實踐,

VirtualBox+Windbg 進行除錯的方法

以前見他們除錯驅動程式之類的都是使用的VMWare, 我沒怎麼用這軟體, 感覺這軟體有點臃腫, 後臺服務掛得太多了, 感覺不爽, 於是就沒搞它. 加上電腦上很早就裝有Oracle的Virtual Box, 於是就看了下, 其實Virtual Box也有支援串列埠裝置,

windows除錯

目標計算機(windows 7 串列埠除錯): 1. 管理員帳號登陸 2.設定除錯方式 串列埠引數bcdedit /dbgsettings serial baudrate:115200 debugport:1 網路除錯(僅限於win7以上)bcdedit /dbgsettings net hostip

Win7除錯環境搭建之常見問題

轉:http://www.16boke.com/article/detail/175 環境:   主機:Win7 虛擬機器:VMware 11.1.0 build-2496824 虛擬機器內作業系統(又稱GuestOS):Win7 WinDbg:適合除錯機的相應位數

Win7除錯環境搭建之除錯

  轉:http://www.16boke.com/article/detail/174 環境:   主機:Win7 虛擬機器:VMware 11.1.0 build-2496824 虛擬機器內作業系統(又稱GuestOS):Win7 WinDbg:適