003 通过内存关系找万能按键call
文章目錄
- 什么是萬能按鍵call
- 切入點
- CE搜索背包狀態
- 通過內存關系找萬能按鍵call
- 萬能按鍵call參數分析
- 總結
什么是萬能按鍵call
當我們在游戲中敲擊鍵盤的按鍵時,游戲會對鍵盤事件會做出響應,去執行某些功能。
以口袋西游為例,按B鍵會打開人物背包,通過B鍵打開背包的這個call就是萬能按鍵call。
只要找到這一個call,就相當于找到了所有的按鍵call,因為剩下的所有的快捷鍵功能都會走這一個call。而且這個call實用性也比較強,可以用來替代很多的游戲功能。
切入點
當我們點擊B鍵時,背包會被打開,再次點擊,背包會被關閉。
那我們就可以先用CE搜索到背包打開和關閉的狀態,之后再對這個狀態下一個寫入斷點,通過棧回溯的方式就能找到這個萬能按鍵call。
CE搜索背包狀態
背包打開和關閉的狀態是一個標志位,可能是0和1,也可能不是。這里只能進行嘗試,如果0和1沒找到就需要利用未知的初始值和變化的值來找到這個標志位。
在背包打開狀態下掃描1,注意這里需要用1字節進行掃描,4字節是掃不出來的
關閉狀態下掃描0
重復這個過程(沒啥技術含量),直到篩選出唯一一個背包狀態標志位,我這里過濾剩下兩個。
通過內存關系找萬能按鍵call
接著我們在這個地址下一個字節的硬件寫入斷點,這里有兩個要注意的點:
第一個點是吾愛的OD硬件斷點有點問題,建議換個OD;
第二個點如果下了硬件斷點之后這個地方斷的很頻繁,而且數值的變化范圍超出了0和1說明標志位找錯了。
然后點擊B鍵,讓游戲斷下
刪除硬件斷點,打開調用堆棧
挨個下斷點分析參數排查,6296F0這個call就是我們要的萬能按鍵call
萬能按鍵call參數分析
這個call和我們之前找的call有一定的區別。正常找的call一般是調用一次,而這個地方會斷下來兩次。
原因在于這個call是用來響應處理按下鍵盤事件的,按下鍵盤事件實際上分為兩個動作,一個是按鍵按下,另一個是按鍵抬起,對應Windows的鍵盤事件就是WM_KeyDown和WM_KeyUp。
接下來分析這個call的參數
ebx是300001,無論是按下還是抬起都是一樣的,具體含義暫時未知
ebp在第一次斷下的時候是0x42,第二次斷下的時候是62
正好是對應按鍵B的ASCII值,大寫的B表示按鍵被按下,小寫的b表示鍵盤抬起
再看eax,按下的時候eax等于100,,抬起的時候eax等于102
這個參數對應的是當前的鍵盤狀態是按下還是抬起,區別在于把KeyUp改成了102。
而ecx是一個數據結構,需要往上追ecx的來源,直到把基址追出來。這里就不一步一步追數據,本次的重點是找call,各位有興趣可以自己去追一下ecx數據的基址。
總結
在api斷點不方便逆向的時候,可以通過內存的訪問關系下斷,然后利用棧回溯來找到我們需要的call。
另外這個萬能按鍵call,如果是在實際寫代碼應用的時候,需要寫兩個call,一次是按下,一次是抬起,在按下和抬起的中間還應該加一個延遲,盡量去模擬真實的鍵盤事件。
相關工具:
https://github.com/TonyChen56/GameReverseNote
總結
以上是生活随笔為你收集整理的003 通过内存关系找万能按键call的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 002 通过send断点分析功能call
- 下一篇: 004 两种方法找寻路call