您好,登錄后才能下訂單哦!
差異分析定位Ring 3保護模塊
由于保護模塊通常會Hook操作系統的原生DLL接口來進行保護,所以可以采用差異比較原生DLL文件和加載到內存中的原生DLL直接的差別來定位Ring 3模塊。
在分析的過程中,為了防止被Ring 3保護模塊發現,暫時可以先把除了自己線程外的其他線程暫停,如圖8-14所示。
圖8-14 懸掛除自己線程外的其他線程
從圖8-14中可以看出,除自己線程外,該游戲有58個線程,可以通過SuspendThread()函數懸掛這些線程以便后續的分析(GS的命令就是ste序號)。
下面,我們再對3個常用原生DLL——ntdll.dll、kernel32.dll和user32.dll進行文件和內存的比較,如圖8-15所示。
圖8-15 差異分析原生DLL的變化
從圖8-15中可以看出,ntdll.dll有3處地址發生了變化,分別是0x7c921230、0x7c92DEB6和0x7c97077B。下面讓我們看看這3處地址目前的指令是什么,如圖8-16所示。
圖8-16 兩處地址jmp指令
在圖8-16中,有一處jmp指令是跳入地址0x45320F0。讓我們看看它屬于哪個模塊,如圖8-17所示。
圖8-17 模塊節信息
從圖8-17的地址區間來看,是包含0x45320F0的,所以,在ntdll.dll中地址0x7c92deb6會跳入X.dll模塊。到目前為止,我們基本可以判斷ring 3下的游戲保護模塊是X.dll。
為了能更準確地判斷X.dll是否是真的保護模塊,下面讓我們看看ntdll.dll中3處發生變化的地址在原生ntdll.dll中的作用。
可以用IDA對ntdll.dll進行分析,然后定位地址0x7c921230、0x7c92DEB6和0x7c97077B。
如圖8-18所示,原來此處地址是DbgBreakPoint函數。這個函數是供調試器下軟件斷點用的,而在游戲中卻被改成了ret指令,這樣做能起到防止下軟件斷點的作用。
圖8-18 0x7c921230地址所處函數
如圖8-19所示,0x7c97077B地址是屬于DbgUiRemoteBreakin函數的,這個函數的詳細介紹可以參見張銀奎老師的《軟件調試》一書的第10.6.4節。這里還是簡單說明一下這個函數的作用,以便讀者能了解。
圖8-19 0x7c97077B地址所處函數
DbgUiRemoteBreakin是ntdll提供的用于在目標進程中創建遠線程下軟件斷點的函數,其偽代碼如下。
DWORD WINAPI DbgUiRemoteBreakin( LPVOID lpParameter)
{
__try
{
if(NtCurrentPeb->BeingDebugged)
DbgBreakPoint();
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
Return 1;
}
RtlExitUserThread(0);
}
當調試器通過CreateRemoteThread函數在目標程序中創建DbgUiRemoteBreakin線程的時候,從代碼上來看是下了int 3軟件斷點。由于在被調試狀態,所以調試器可以捕獲這個異常。如果目標程序沒有被調試的話,DbgUiRemoteBreakin中的S.H.E顯然可以捕獲并處理它。
所以,游戲保護系統在對DbgUiRemoteBreakin進行jmp操作,很明顯是為了防止被調試。下面再看看保護系統從DbgUiRemoteBreakin跳到了哪里。
如圖8-20所示是保護系統從DbgUiRemoteBreakin跳入執行的函數,很明顯,LdrShutdownProcess是一個關閉進程的函數。
圖8-20 0x7C943DEF地址所處函數
下面再讓我們看看地址0x7c92DEB6處的含義。
如圖8-21所示,保護模塊對ZwProtectVirtualMemory函數進行了Hook,以防止虛擬內存所在頁面的保護屬性被改變。
圖8-21 0x7c92DEB6地址所處函數
關于更多分析游戲保護方案的思路見<<游戲外掛***藝術>>第8章。
作者簡介
徐勝,2009年于電子科技大學獲得計算機科學與工程碩士學位,現就職于阿里巴巴,從事移動安全的研究和移動產品的研發,主要研究方向包括:Windows平臺下的***、外掛、Rootkit、防火墻和二進制逆向分析,Android和iOS客戶端軟件安全,以及Web和WAP安全。
本文節選自《游戲外掛***藝術》一書。徐勝 著,由電子工業出版社出版。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。