網路遊戲逆向分析-6-使用揹包物品call
首先,大家在處理網路遊戲的時候,一定得利用好發包函式,因為他就是整個網路遊戲的關鍵。
處理辦法:
這裡還是直接給發包打斷點來處理。
就像我們之前處理喊話函式call一樣來處理它:
還是先給send打斷點,然後依次往上找函式呼叫,直到只有使用揹包物品才會斷下來的函式作為關鍵函式分析:
肯定會有重複的,重複的就直接繼續往上跳就行了
我在這個揹包6這個函式這裡就滿足了所有要求:1:使用揹包內容會斷下來,2別的不會。所有我就把這個作為一個關鍵函式call來分析。
首先分析函式的引數,由於這是一個windows內部的函式,所以很有可能是stdcall 或者cdecall,就直接利用堆疊就好了,函式最後肯定會平棧的,不管前面有多少push,直接看函式執行完之後的棧提升就多少就可以大概看出來有多少引數:
現在是這樣:
然後是這樣:
+C,C就是12,應該是有3個引數在裡面,還有需要注意的是ECX這個暫存器,在C++裡面尤其要注意他,因為如果扯到了類裡面的thiscall就會有一個ecx來存放this指標,所以這裡 分析的時候就帶著它一起分析了。
不管我用揹包的哪一個,這個第一個引數的2和最後一個的1都沒有改變過,而中間這個會隨著物品的不同而改變不同,推測是根據物品的陣列從0開始然後01234這樣來處理:
果然再我用第六個物品的時候它變成了5:
然後就是ecx裡面的this指標了,這裡先拿來用著:
這裡我第二個物品欄的東西被我吃完了,所以這裡是肯定成功了。然後就來分析引數,其實也就一個ecx需要分析而已,別的都是固定的。
ecx是這樣來的,是不是非常像先是ecx得到某個地址的首地址,然後偏移1F54得到了內容.
所以這裡來分析mov ecx,....[esp+18]。
前面我們說到過牽扯到esp的就首先考慮引數,臨時變數這種東西。首先考慮引數,利用Windows呼叫函式的極值,是先把引數入棧,然後再把返回地址入棧來看是不是引數:
可以看到這個地址離返回的地址相當的遠啊,所以很有可能就不是引數,這裡我們再考慮,將函式跳出後看引數堆疊有沒有被釋放來判斷是否是引數:
剛開始:
跳出函式後:
絲毫沒有改變,說明它不是這個函式的引數。
很有可能是一個區域性變數,區域性變數的驗證就比較方便了,在函式的頭部斷下來,然後打一個硬體斷點,修改了就斷下來,前提是這個函式的esp+18這個地址不會改變(這個自己去驗證)。這裡我直接操作了
在函式第一條地址下斷下來,然後打一個硬體寫入斷點,段下來後在這裡:
這樣就一目瞭然,是被這裡的eax給修改了,就分析這個eax就行了。
這個eax前面正好有一個函式呼叫,來分析看看是不是這個函式的問題,先給函式的上一條指令打斷點來分析eax:
先是為0
呼叫完之後就是這個值了:
直到要呼叫揹包的時候這個值依然是這個值:
因為前面是eax來修改了[esp+18]地址對應的內容
所以一直這樣下來沒問題。而且這個修改eax的函式根本沒有引數呼叫,所以可以直接拿來用:
這樣的話就我們的程式碼邏輯就成型了:
這裡的call函式,就是把eax賦值為後面的mov ecx,dword ptr ss[esp+18]給代替了,
然後push 1 push2是必須的,中間的push 3是物品在物品欄中的位置,最後的call函式是呼叫揹包的函式。
總結
大型網路遊戲,發包函式是非常非常重要的,通過發包函式可以貫徹到很多東西,對於ESP這個暫存器必須要考慮到函式引數和臨時變數,根據是引數還是臨時變數來分別使用分析方法,引數就可以直接看,然後臨時變數採用硬體斷點來檢視修改。區分是不是引數可以通過將函式執行完後的棧是否將其捨棄掉來判斷,因為引數是函式棧裡面的函式呼叫完之後就會釋放這個棧。
這裡還有不合理的地方,如果外掛給別人用,別人肯定是想輸入一個名字,比如說 藍藥水就直接用了,這個還要人家來數陣列,肯定垃圾不行,所有後面還要來遍歷陣列來獲取對應的內容。