網路遊戲逆向分析-6-使用背包物品call
網路遊戲逆向分析-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這個暫存器必須要考慮到函數參數和臨時變數,根據是參數還是臨時變數來分別使用分析方法,參數就可以直接看,然後臨時變數採用硬體斷點來查看修改。區分是不是參數可以通過將函數執行完後的棧是否將其捨棄掉來判斷,因為參數是函數棧裡面的函數調用完之後就會釋放這個棧。