實驗目標:通過遍歷尋找召喚僵屍的CALL,通過調用CALL出現自定義的僵屍,加速僵屍的出現。
僵屍CALL的遍歷技巧:
我們可以通過僵屍出現在屏幕中的個數來遍歷尋找僵屍出現的CALL
首先打開CE->進入游戲開始新的游戲-> 直接搜索未知初始化數據
等待出現第一個僵屍 ->CE搜索-增加的數值 -> 回到游戲中
等待出現第二個僵屍 -> CE搜索增加的數值 ->然后殺死一個僵屍-> 搜索減少的數值
CE中直接選擇介於兩者之間的 -> 輸入 0 - 10 這個范圍 -> 進一步篩查
按照上面的步驟依次篩查 ,最終會看到兩個數值!
1.首先打開CE工具,等待開始游戲以后,我們直接【搜索未知初始值】,因為結果太大所以地址欄不會顯示。
2.當屏幕上出現第一只僵屍以后,我們直接切回CE修改器,【搜索增加的數值】。
3.等待出現第二只僵屍以后,我們再次【搜索增加的數值】,經過二次排查以后,地址欄的地址變得更少了。
3.等待出現第三只僵屍以后,再次回到CE【搜索增加的數值】,經過第三次排查,地址又變小了很多。
4.等待小推車自動的殺死一個僵屍,或手動殺死一只,(我是等待小推車推死的),然后回到CE【搜索減少的數值】。
5.接着搜索未變動的數值,此時CE會顯示連個地址,我們加入下方地址欄。
6.在CE數據窗口選中第一個地址,右鍵選擇是什么改寫了它,然后等待出現僵屍,會發現一條匯編代碼,我們記下地址【00471B57】
接着在第二個地址上同樣的操作,然后記下地址【0041DE07】。
7.我們直接OD載入吧,載入以后運行起來,然后到程序領空,並在【00471B57】,【0041DE07】兩個地指處下兩個【F2】斷點。
8.回到游戲等待出現僵屍,觀察發現第一個地址【00471B57】並不是出現僵屍的地址,我們取消這個斷點,然后按下【F9】讓游戲跑起來。
接着回到游戲,再次等待出現僵屍,觀察(如下)地址發現,只要出現了僵屍游戲就會被斷在【0041DE07】地址處,那就非常肯定這就是關鍵地址了。
上方代碼,一般情況下應該不會有調用函數,因為這里是只是計數器,那么這個函數的作用應該僅僅只是一個僵屍計數函數,所以我們要返回到上一層。
9.我們直接RETN返回到上一層,會看到如下代碼,直接在PUSH地址上下一個【F2】斷點,然后運行游戲,回到游戲等待出現新的僵屍,這里我為了演示方便重新開了一局。
經過我的測試,上面的參數經過不同程度的修改確實可以控制僵屍的出現位置,和僵屍的類型,但這里傳遞的參數還是過多,而且很多參數我們都用不到,那么我們直接出這個CALL,去外層看一下。
9.我們在以下位置直接下【F2】斷點,等待出現僵屍OD會直接斷下,我們經過單步調試然后記下這些地址參數。
上圖的EDI是一個動態地址,因為他是僵屍對象,所以每次程序運行都會發生變化,如果想用代碼注入器注入代碼的話,則需要找到EDI的基地址,接下來我們將使用CE搜索EDI的基址和偏移。
10.這里我們使用X32dbg調試器,因為OD默認無法脫離進程,導致無法使用CE下斷點,直接使用x32dbg附加游戲進程然后運行,並在【00413055】的位置下一個【F2】斷點,回到游戲等待出現僵屍,然后x32dbg會自動斷下,我們單步【F8】並記下【ESI寄存器】參數。
如上我們只需要記下【143DF008】然后,選擇文件,選擇脫離進程即可。
11.打開CE附加游戲進程,並搜索十六進制【143DF008】,多搜索幾次排除一些干擾,然后選擇幾個看着順眼的地址然后加入到下方地址列表。
12.直接在第二個地址上下一個硬件訪問斷點,然后會發現有一堆數據,此處選擇第一個然后單擊【詳細信息】,發現此處的偏移地址是【00768】然后記下EDI的地址【00FE40E8】,記下以后關閉窗口。
13.此處我們已經發現了基地址,我們直接記下來吧 【006A9F38】偏移是【768】指向的就是僵屍的對象地址。
14.使用代碼注入器測試一下效果。
轉到召喚僵屍CALL:[00413055] 執行到返回出CALL
在004140C9的地方直接給mov eax,1