反作弊遊戲如何破解,看看《黑色沙漠》逆向分析過程

《黑色沙漠》是PearlAbyss Corp開發的一款 MMOARPG 網絡遊戲,是款在電玩遊戲中的動作和戰鬥的基礎上添加大規模攻城戰,不動產使用、交易和僱傭等模擬要素的MMORPG。於2013年10月17開啟第一次測試。

在這篇文章開始之前,你有必要先看一下如何使用Scylla和x64dbg轉儲黑色沙漠(BlackDesert64.exe)的過程。我們將在這篇文章中看到我為了簡化靜態逆向分析而轉儲過程時所做的一些事情。

黑色沙漠二進制文件的開發者很早就預料到了,會有人對他們的遊戲進行逆向分析,因此早已經使用了Themida進行了預防。Themida是一個強勁的保護系統, 專為了那些想保護自己的軟件不被先進的逆向工程和黑客軟件破解的軟件開發者而開發的。開發者不需要更改任何的原代碼,和不需要程式編制的經驗使用WinLicense。通常,當你從內存中轉儲一個進程時,特別是如果該進程已封裝,則有很多事情會被破壞或正確地說,不會像預期的那樣轉儲。

反作弊遊戲如何破解,看看《黑色沙漠》逆向分析過程

RDB Packer檢測器的輸出結果

其中之一就是IAT(我們將要了解IAT是什麼以及如何識別它們),如果我們轉儲一個進程,並且由於某種原因而沒有IAT表,則逆向分析將會非常困難,並且將看到調用諸如qword_1419FB008之類的函數而不是GetProcAddress的函數。如果我們能夠看到IAT表,逆向分析會變得容易得多。

另一個有趣的事情是應用來自IDA的FLIRT簽名,這些簽名是IDA附帶的,你可以在互聯網上找到許多公共集合,將這些公共集合裝入二進制文件後,它們將嘗試從多個庫中識別出眾所周知的函數。

導入地址表(IAT)

通常,來自dll的函數地址不是靜態的,因此,導入地址表用於存儲進程使用的已加載dll中的所有函數指針。基本上,它是內存的一部分,你可以在其中找到指向程序所使用的每個函數的指針列表。每當進程需要訪問來自kernel32.dll的WriteFile時,程序便會指向IAT表以獲取所加載dll中函數的真實地址。

反作弊遊戲如何破解,看看《黑色沙漠》逆向分析過程

在該圖中,我們可以看到IAT從正在運行的進程中轉儲出來的數據。可以理解為兩個主要的列:第一個列屬於內存中每個IAT條目的地址;第二個是從加載的dll指向每個函數的真實地址的指針。這樣,每當程序要從dll訪問任何函數時,它將指向該表以檢索該函數的動態地址。

第三列是x64dbg添加的註釋,它根據調試器在內存中加載的符號從每個指針解析函數的名稱。當我們從內存中轉儲進程時,由於所有指針將不再存在於靜態轉儲中,因此我們將無法看到最後的信息,而且我們使用的任何工具都不能像這裡的x64dbg那樣解析這些指針。

有沒有一種方法可以還原此信息以進行靜態分析?

當然有,如果我們使用Scylla轉儲進程,則此工具將自動嘗試識別內存中的IAT,但是封裝程序很討厭,通常它們會在解壓縮實際二進制文件後刪除原始IAT並在內存中分配一個新表。此工具可能無法識別內存中的實際IAT,實際上,如果我們嘗試這樣做,Sylla會告訴我們IAT表的大小為8字節(一個條目),這是不可能的。

IAT通常是一組指針組成的數組,用一個空指針將每個DLL與另一個DLL分開。在內存中識別它們對於兩種情況(靜態地使用IDA和動態地使用x64dbg)都是非常簡單的。對於x64dbg,你可以簡單地尋找任何一塊程序集,使調用一個函數從一個dll和遵循的IAT指針:

反作弊遊戲如何破解,看看《黑色沙漠》逆向分析過程

調用GetModuleHandleW

為了識別轉儲中的IAT,我們需要尋找一個指針數組,就像我們之前解釋的那樣。一種可能是尋找對這種格式為qword_1419FB008的函數的調用,這類似於調用cs:qword_1419FB008。如果我們在IDA中遵循此變量,我們將發現看起來像這樣的IAT:

反作弊遊戲如何破解,看看《黑色沙漠》逆向分析過程

IAT與IDA

在上圖中,我們可以看到IAT的多個條目,並且在右側,可以看到IDA標識的所有xref。 Black Desert Online IAT表包含大約1000個條目,你可以想象這將如何簡化靜態反向過程。

反作弊遊戲如何破解,看看《黑色沙漠》逆向分析過程

沒有符號的反作弊初始化進程

恢復IAT

現在,我們已經在運行的進程以及靜態轉儲中標識了IAT表,我們可以知道嘗試將所有符號從進程遷移到IDA。由於x64dbg為我們解決了這些符號,我們可以嘗試從運行的進程中複製IAT並在IDA上重命名功能,以便我們在逆向分析時可以使用它們。

我認為有一個更好的方法來執行此操作,但是我決定手動執行第一部分,然後使用IDAPython編寫一個小腳本。首先,我們將以x64xdb轉到IAT的開頭,並在表的第一個條目上執行“右鍵單擊->跟進轉儲”。這將設置轉儲1,如下所示:

反作弊遊戲如何破解,看看《黑色沙漠》逆向分析過程

x64dbg中的IAT

現在,我們將選擇從表的第一個地址開始直到表的最後一個條目的所有值。最後,我們要做的是“右鍵單擊->複製->選定行”。如果我們將其存儲在新的txt文件中,則將得到以下內容:

00000001419FB000 00007FFC8F3C38F0 advapi32.SetServiceStatusStub

00000001419FB008 00007FFC8F3C3910 advapi32.CryptGenRandomStub

00000001419FB010 00007FFC8F3C3390 advapi32.CryptReleaseContextStub

00000001419FB018 00007FFC8F3C2F60 advapi32.CryptAcquireContextWStub

00000001419FB020 00007FFC8F3C2F80 advapi32.RegQueryValueExAStub

00000001419FB028 00007FFC8F3C2EA0 advapi32.RegOpenKeyExAStub

00000001419FB030 00007FFC8F3C3320 advapi32.CryptAcquireContextAStub

00000001419FB038 00007FFC8F3C7140 advapi32.RegDeleteValueWStub

00000001419FB040 00007FFC8F3C2A10 advapi32.RegCreateKeyExWStub

00000001419FB308 00007FFC8FE40D30 kernel32.FindFirstFileA

00000001419FB310 00007FFC8FE40DA0 kernel32.FindNextFileA

00000001419FB318 00007FFC8FE3FB30 kernel32.MoveFileExW

00000001419FB320 00007FFC8FE41050 kernel32.RemoveDirectoryW

00000001419FB328 00007FFC8FE41080 kernel32.SetFileAttributesW

00000001419FB330 00007FFC8FE40E20 kernel32.GetDiskFreeSpaceExW

雖然有三列,但我們只對第一列和最後一列感興趣。為什麼?因為第二列僅包含每個函數的動態地址,所以在使用IDA靜態逆向分析時我們並不在乎,因為這些模塊的地址不在轉儲中。如果我們可以使用方法名稱重命名每個指針名稱,則IDA將自動從Windows API中識別大多數函數,並動態更新轉儲中的參數和類型。

為了自動執行此操作,IDA向我們提供了一個名為IDAPython的API。這樣,我們可以編寫一個小的腳本,該腳本基本上可以獲取IAT的每一行,搜索轉儲中的每個內存地址,並使用方法的真實名稱重命名函數名稱。

結果如下所示:

import idaapi

import idautils

import idc

if __name__ == '__main__':

file = open( 'IAT.txt', 'r')

for line in file:

columns = line.split(' ')

address = columns[0]

fnName = columns[2].replace('\\r', '').replace('\\n', '')

if '.' in fnName:

fnName = fnName.split('.')[1]

print address ' ' fnName

idc.MakeNameEx(int(address, 16), fnName, idc.SN_NOWARN)

file.close()

該腳本將遍歷來自IAT的每一行,並將把每個內存地址的正確名稱放在轉儲中。

反作弊遊戲如何破解,看看《黑色沙漠》逆向分析過程

修復了IAT在轉儲裡面的問題,IDA將自動識別某些方法,並將適當的參數和函數信息添加到每個條目中。

你還記得有關反作弊初始化的圖像嗎?現在的情況是這樣的:

反作弊遊戲如何破解,看看《黑色沙漠》逆向分析過程

現在我們已經向轉儲IAT導入了將近1000種方法,這些方法將在整個二進制文件中發揮作用。

FLIRT簽名

我喜歡做的第二件事是使用快速的庫標識和識別技術(FLIRT)簽名,特別是對於簡化的二進制文件。這允許IDA通過分析反彙編程序的每個字節來從二進制文件內的多個庫中搜索函數,以便確定其是否對應於已知庫函數的開頭。

標識每個函數所需的這些信息存儲在包含每個函數的所有模式的文件中,要在IDA中使用此函數,你只需要打開“簽名”子視圖並執行“右鍵單擊->應用新簽名”即可:

反作弊遊戲如何破解,看看《黑色沙漠》逆向分析過程

菜單選擇要應用的簽名,選擇每個簽名將取決於我們確定相關庫的標準。應用它們之後,你將看到類似以下內容:

反作弊遊戲如何破解,看看《黑色沙漠》逆向分析過程

總結

在進行反向分析之前,花一些時間來解析和改進二進制文件中可用的信息確實非常重要,這對於那些難以逆向分析的程序(比如反作弊程序)來說是一個很好的開始。IDA有多個像ClassInformer這樣的插件,這些插件使得逆向分析c++程序更加容易。

如果您對逆向工程感興趣,可以前往賽虎學院官網:www.edusahoo.com ,觀看更多相關內容


分享到:


相關文章: