網絡游戲逆向分析-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這個寄存器必須要考慮到函數參數和臨時變量,根據是參數還是臨時變量來分別使用分析方法,參數就可以直接看,然后臨時變量采用硬件斷點來查看修改。區分是不是參數可以通過將函數執行完后的棧是否將其舍棄掉來判斷,因為參數是函數棧里面的函數調用完之后就會釋放這個棧。