正反合璧,挖掘war3資源地址詳細過程

正反合璧,挖掘war3資源地址詳細過程

這個話題原來我只能求助了,百度搜索等等。發現了很多有興趣的同學也在搜索,無奈卻找不到……。有找到的大俠卻又惜字如金,不肯吐露分毫。嘿嘿,本著共享知識,共同進步的原則,我將研究的成果共享給大家吧!

我用CE查找war3 1.27的金幣的時候,也是想著按照CE教程里的原理直接查找。首先按精確值查找,開局都是500金幣,然後采10點金幣,再Next Scan,結果……沒有結果了!

看來這裡的數值不一定就是畫面顯示的數值。突然想到以前查生化危機時,它的血值是顯示的10倍!這麼看來魔獸也很有可能搞點小動作!於是按未知初始值方式,每采一次金幣,就按增加值的方式搜索,終於把它定格下來了。居然真的是10*顯示的金幣值。(這中間探索的過程就不貼圖了,若知道它是10倍關係,直接按精確值搜索立即就出來了!嘿嘿)CE裡面搜索出來的動態地址如下:

然後,再按照基礎教程方式(find out what writes to this address)可以找到一級指針!

再繼續,搜索一級指針。這裡會搜索出一堆指針地址:

按照一般的思路,肯定是選擇簡單的進行搜索了!嘿嘿,我也是這麼想的!那麼就完蛋了!按照mov eax, [ecx+40]的地址進行搜索也是很多同學不知道怎麼會陷入到無盡循環之中的原因了。按照這種步驟進行常規搜索,在搜索出一堆地址之後,又會出現指向前面一模一樣的指針……子又生孫,孫又生子,找不到盡頭了!

我開始也被困在此處了,後來想到上面的那個特殊指針地址。既然此路不通,只能看看那個特殊地址了!但是這個ecx的值不確定啊!!!怎麼辦?

用CE中的」小OD「打開這個地址,向上一掃描,發現好多這樣的[eax+ecx*8+04]:

沒辦法了,CE中的小OD的調試功能確實沒有大OD強,用大OD來幫忙吧,哈哈。關掉CE,用OD附加到war3進程,然後CTRL+G到達這處令人鬱悶的地址。

發現這個位置應該是在一個函數體內。先看看周圍環境吧,上下瞧瞧。結果在上面入口處看到了好東西:

難道這就是傳說中的基址?哈哈。然後向下再看看與此硬編碼相關的操作:

看到沒有?這樣就正向推導出來了指針的計算方法了(CE的查找方式是反向推導,從數據入手), 這裡直接是從硬編碼的基地址入手。得出結論:

金幣的基址為5D340A8,那麼它指向的地址為 [[5DE340A8]+0C]+8*ECX+4]+78。

這裡的ECX我猜測應該是一個常數,類似於金幣的ID。驗證很簡單:在5D2873B0處下斷,當其指向的地址,設為x。x+78==當前的金幣值時,查看ECX的值,就得到了最終的金幣指針計算方法。但是,這裡直接下斷時,遊戲會不斷地斷下來,沒辦法驗證。怎麼辦呢?

一直按F9重複不是辦法,也沒辦法測試數據了。先跳到此CALL之外吧,第一次寫入金幣值的地址處,上面就是指針計算的CALL,看看有什麼辦法不:

此處的圖片地址與上面有些差別,因為經歷了多次重新載入。但方法是非常有效的。

然後再進入計算指針的CALL, F7進入:

最終,根據得到的ECX值,代入到指針的計算公式中,得到了金幣的指針計算方法:

[[5DE340A8]+0C]+8*ECX+4]+78 = [[5DE340A8]+0C]+8*2+4]+78=[[5DE340A8]+0C]+14]+78

同理,可以得到木頭的ID號為3。到木頭的基址加指針計算方法:[[5DE340A8]+0C]+1C]+78

此處,ECX的取值非常多,如上2為金幣3為木材,還有其它多種,肯定每種取值代表不同的資源或單位屬性等等。

本來以為這樣就完了,沒想到魔獸搞得還挺怪異,表現為:

1、換個種族居然就搜索不到數據了!經測試發現:精靈族與獸族使用的為同一基址:5DE340A8,人族與不死族使用的為另一個相同基址:5FEC40A8。計算公式都一樣,代入基址即可。

2、對於不同的地圖,這裡的基址都是不一樣的。猜測資源信息應該是與地圖綁定的,記得魔獸里有一個地圖編輯器,不過沒怎麼用過。所以對於想直接通過找基址直接定位金幣的同學,這方法可能行不通。有一個萬能的辦法:以調試API方式來處理,可以直接獲取到所有不同地圖中的基址。

結論:很多事情不要一路走到黑,有很多靈活變通的方式一樣可以得到結果!

附記:

呵呵,對於上面的兩點疑惑,終於研究出結果了:以上方法得到的基址的確是唯一的地址,但是是什麼導致每次重新載入地址不一樣呢?

答案在於DLL的重定位!每次Game.dll在重新載入時的模塊地址不一樣,這導致其中的「硬編碼」的基址也隨之發生了改變。只需要找到基址相對於Game.dll的偏移地址即可,如圖

綜上,糾正一下。war3的資源基址計算方法為:

金幣: [[Game.dll基址+0xBE40A8]+0C]+8*2+4]+78

木材: [[Game.dll基址+0xBE40A8]+0C]+8*3+4]+78

測試上述結果,所有地圖的所有種族均一致!(版本針對1.27a)

最後,感謝指出我錯誤的同學。嚴謹求實,也讓上面的兩點疑惑煙消雲散!

本文由看雪論壇 不問年少 原創,轉載請註明來自看雪社區


推薦閱讀:

安卓逆向菜鳥的初體驗
安卓U3D逆向從Assembly-CSharp到il2cpp
CTF取證類題目指南
No Power No Shell --- 非PE攻擊中的套路

TAG:軟體逆向工程 | 軟體安全 | OllyDbg |