某火熱區塊鏈游戲(mir4)的一次通信協議分析
游戲名:Mir4(傳奇4)
準備工作:
1、平臺:iOS 14.3越獄環境
2、工具:hopper,ida,frida
3、知識:需要對c++虛表有一定的了解,UE4dump和ProtoDump需要
思路
既然是網絡層分析,那么第一步肯定是抓包分析一下。逆向基礎的wirashark,charles這些就不做介紹了。
這一塊就不貼圖了,抓包分析后得知:
- 網絡交互是走的tcp連接;
- 協議是基于protobuf;
- 通信過程加密了,前幾個包是明文包,后續加密了,看了一下位數,不像是非對稱加密,因為長度不符合,還是需要驗證一下。
protoc --decode_raw < 二級制文件 //可以直接解析proto協議
切入點尋找
首先我們是要對游戲網絡交互進行分析,那么需要對UE4虛幻引擎有一定的了解。
通過查閱相關資料得知虛幻引擎是通過'UNetDriver'進行網絡交互的,而'UNetDriver'是在'UWorld'下,那么我們就需要對游戲先進行sdk dump拿到實例化對象。
然后拿到UNetDriver后,可以在ida里面跟到相應的網絡流程,加密等。
那么ue4dump是怎么做的呢?首先安卓平臺有一個開源的ue4dumper,我們可以參閱一下:UE4Dumper。
核心原理就是找到GNamesArray,GObjectsArray,GWorld這三個內存位置,然后進行遍歷讀取。
現有的資料基本都是基于ue4.23版本的,4.25有一點改動:
- GNamesArray > FNamePool
- GObjectsArray > TUObjectArray
關于GWrold的尋找,論壇已經又相關帖子了,不再說明,主要說一下自己摸索的剩下兩個關鍵字的尋找。
FNamePool
我們首先在源碼里找到FNamePool的初始化函數,在附近看看有沒有相關關鍵字可以定位的。
/UnrealEngine/Engine/Source/Runtime/Core/Private/UObject/UnrealNames.cppFNamePool::FNamePool();
運氣比較好,可以看到有字符串:

也就是說,我們在hopper中找到字符串并查找相關引用,就可以得到FNamePool:

找到函數頂部,按X查找引用:

然后隨便找一個進入,看看調用是什么:

這里解釋一下, 在C++面向對象中,一般的X0就是this指針,那么這個函數調用了我們的FNamePool::FNamePool(),傳入的x0對象就是fnamepool的地址,也就是:0x1065c2000+0x1c0 = 0x1065c21c0
剩下TUObjectArray基本也一樣。然后自己改一改UE4Dumper就可以拿到完整的sdk了:

驗證想法
后續補充,包括怎么尋找切入點,算法還原,,包括怎么樣dump出proto文件等,一時半會寫不完。
dump出的proto文件類似下面:
