004 两种方法找寻路call
文章目錄
- 關于尋路call
- 通過參數找尋路call
- CE搜索尋路目的地坐標
- 通過參數定位尋路call
- 尋路call參數分析
- 尋路call代碼測試
- 尋路狀態找尋路call
- 搜索尋路標志位
- 通過尋路標志位找尋路call
關于尋路call
尋路call在大部分的游戲里都是存在的,游戲的策劃為了用戶體驗,一般都會自帶尋路的功能,可以一鍵自動讓人物到目的地。
但是也有一些游戲不包含尋路call,那樣的游戲就需要我們去找一些地圖數據以及障礙的遍歷判斷等等,再自己用算法去實現。
這個尋路call不太適合用send斷點回溯去找,因為在尋路的過程需要不斷的向服務器發送數據包,是一個比較復雜的過程,里面可能有很多循環和邏輯算法。單純通過一個簡單的調用關系不一定能找到這個call。
通過參數找尋路call
CE搜索尋路目的地坐標
在找這個call之前我們先來思考一下這個call會有什么樣的參數,參數可能會有很多個,但是有一個參數是必然存在的,就是尋路的目的地坐標。
這里有三個坐標分別是XYZ,選擇任意一個即可。
先讓人物進行尋路,尋路完成之后,當前的人物坐標就是目的地坐標。接著搜索人物當前的坐標。
坐標在內存中的形式都是用的浮點數,浮點數的值是經過四舍五入以后顯示到游戲界面的,所以這里要搜索一個區間的值,而不是搜索精確值,區間盡量給大。
接著讓人物進行尋路,尋一個遠一點的位置,這個時候尋路目的地坐標發生改變,此時在CE里搜索變化的值。
然后在人物尋路的過程中目的地坐標是不變的,我們可以一直掃描未變動的值
等人物到達目的地以后,再用根據當前的人物坐標進行一個范圍的浮點數值掃描。
一直重復這個過程篩選掉CE的結果,最后會剩下二十多個,這二十多個值都是一樣的,都等于當前人物的坐標。那么說明這些值都是人物的目的地坐標。這種情況只能一個一個去測試。
通過參數定位尋路call
這里有兩個基地址,有基地址的情況當然優先考慮選擇用基地址。
打開OD,在這兩個基地址下四字節的硬件寫入斷點。然后讓人物尋路,此時OD斷下
此時[edi+0x2C]是我們的目的地坐標,然后下面這個call將坐標作為參數傳入下面的call,那么這個call有可能是尋路call,也有可能是在尋路call的內部對參數進行處理。
刪除硬件斷點,Ctrl+F9執行到返回,上面的這個call也可能是尋路call。
實際上這兩個call都是尋路call,里層的尋路call有點類似于封包,需要對數據進行組包,所有的數據糅合在一起,分析起來不是那么方便。外層的尋路call參數多,比較清晰,分析起來方便。這里我們選擇外層的尋路call進行分析。
尋路call參數分析
我們在外層的尋路call下斷,讓游戲斷下。
esi這個地方是一個常量1,多測試幾次會發現這個參數的含義是地圖ID。
往上翻一下也可以找到這個地圖ID的一個基址表達式
edx是一個地址,指向的地址內容是和當前的人物坐標是一致的,那么edx就是出發點的人物坐標,坐標在內存中的存儲形式是XZY
D1F930這個地址有點眼熟,回到CE
這個地址正是我們用于找call的切入點,也就是目的地的坐標
最后一個參數ecx是一個當前模塊的基址,沒有什么特殊含義
尋路call代碼測試
接下來用代碼注入器測試一下我們找到的這個call是否有效
首先隨便找一塊地址按照XZY的方式填入出發點的人物坐標
然后在0D1F930填上人物的目的地坐標
在注入器填上相關的匯編代碼,注入到游戲進程,效果如圖:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Ek4EuVau-1586586062769)(004 兩種方法找尋路call.assets/自動尋路.gif)]
尋路狀態找尋路call
搜索尋路標志位
當人物正在尋路的時候是處于跑動的狀態,不尋路的時候人物處于站立不動的狀態。在尋路call的內部一定會對這個狀態進行改寫。
利用這個特點我們可以利用狀態值作為突破口,來定位到尋路call
首先在人物尋路的過程中搜索1
然后在人物尋路結束的時候搜索0
最后可以篩選出三個地址,我這里正確的地址是第二個,大家需要去挨個測試。
通過尋路標志位找尋路call
打開OD,在尋路標志位下硬件寫入斷點,等游戲斷下
打開調用堆棧,找到最后一個call,顯示調用
這個地方,就是我們之前找到的尋路call。
代碼之前已經測試過了,這里就不再測試。另外這個call的參數有出發點的人物坐標,也就是說以當前人物坐標為切入點也是可以找到這個call 的,各位可以自行嘗試,到此分析結束。
相關工具:
https://github.com/TonyChen56/GameReverseNote
總結
以上是生活随笔為你收集整理的004 两种方法找寻路call的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 003 通过内存关系找万能按键call
- 下一篇: 005 定位控件输入call