植物大戰僵屍:查找植物疊加種植CALL


實驗目標:我們都知道植物大戰僵屍游戲中植物是不可以疊加種植的,也就是一個格子只能種植一個植物,今天我們將實現一個格子里種植無限多的植物。

我們首先需要找到植物的種植CALL,然后在逐步測試觀察功能之間的變化,最終實現功能。

 

種植CALL的遍歷技巧:

打開CE -> 回到游戲 -> 然后回到CE -> 掃描未知初始數

回到游戲 -> 拿起向日葵(不要種) -> CE 搜索變動的數值 -> 回到游戲(不要動) -> 搜索未變動的數值

回到游戲 -> 放下向日葵 -> 拿起豌豆射手 -> CE搜索 變動的數值 -> 以此重復進行

當我們使用鼠標點擊時會在一個地址寫入值,當換個植物則會換一個數值,這樣如此反復就會找到CALL的地址。

 

1.打開CE附加游戲進程,然后搜索未知初始化數值。

 

2.接着回到游戲,選擇向日葵植物,然后回到CE直接搜索,變動的數值。

 

3.回到游戲不要動,直接右擊取消向日葵的選擇,然后再次拿起向日葵,搜索未變動的數值。

 

4.放下向日葵,拿起豌豆射手(不要告訴我你不知道是哪個),回到CE,搜索變動的數值。

 

5.放下豌豆射手,拿起向日葵,然后CE搜索變動的數值。

 

6.如上以此循環執行第4,5步,直到數據變成了幾個為止,這里我找到了兩個比較可疑的,只要拿起植物它就發生變化。

 

7.我們在第一個地址上面,右擊選擇查找訪問的地址,也可以選中第一行按下【F5】鍵,回到游戲並手動種植一個植物,會發現一條可疑匯編代碼,我們先把地址記下來【00410AC1】

這里我們只需要記錄植物種下后出現的地址,前面三個分別是拿起植物和放下植物的代碼,我們這里不需要考慮。

好了,我們關閉上面的【訪問地址】對話框,然后我們用同樣的方式在第二個地址上操作,種下植物會發現三個可疑地址,我們直接記下來,【00410865】,【00410a91】,【0041239A】

由於我們不知道那一個會調用種植的CALL所以,我們把這三個地址都記下來,記下來之后關閉CE就好了,后期用不到了。

在調試之前,請你自行把陽光改多一點,方便我們調試。

 

8.關閉CE后,直接打開OD並附加植物大戰僵屍游戲進程,然后按下【F9】讓程序先跑起來,然后【Ctrl + G】輸入【00401000】回到程序領空。

 

9.我們分別定位到上面找到的那幾個地址上,【00410AC1】,【00410865】,【00410a91】,【0041239A】,然后觀察后分別下斷點。

 

10.一切准備就緒了,我們回到游戲中,然后拿起一個植物,拿起植物后發現並沒有斷下,我們直接右擊放下植物,會發現OD直接斷下了,這里可以排除了,因為我們放下了植物並沒有種植所以也就跳過了種植的CALL,這里沒有我們直接取消下面的兩個斷點,然后按下【F9】讓程序跑起來。

 

11.接着我們繼續回到游戲中,拿起植物然后種植下去,此時OD會段在第二個斷點的位置上,默認關鍵跳轉沒有跳,我們直接修改標志位讓其跳轉實現,然后運行程序發現種下了植物,這里雖然斷下了但修改后並沒有停止種植,所以這里我們也排除掉,取消這里的兩處斷點。

 

12.繼續回到游戲,種下植物OD會段在以下位置,我們默認是不跳轉的也就是種植,我們修改標志位觀察發現,植物並沒有被種下,說明這個跳轉跳過了關鍵的種植代碼,我們向下找也不難看出,於是乎我們重點分析它跳過的代碼的執行軌跡。

 

13.觀察如上跳過的代碼不難看出一堆PUSH指令,很明顯這是調用CALL之前的參數傳遞,此時我們直接在PUSH的位置下斷點,回到游戲中再次種植植物,程序會斷下,我們觀察程序的壓站情況。

首先我在第一行第一列種植了一個植物,觀察壓站情況如下所示,我已經分析好了。

為了對比明顯,我在第二行種植了一個寒冰射手,然后觀察壓站情況,會發現植物的未知變化和植物ID的變化。

 

14.上面的對比已經非常明顯了,我們直接使用代碼注入器注入分別將push 5 改成【 1,2,3】,然后用【mov eax,2】控制在第幾列種植,即可實現疊加效果。注意:這里的 【Push 1406FA88】每次運行程序都會改變,我這里可以注入成功,你們那里需要修改一下。

既然找到了種植CALL的地址【00410A94】,那我們可以猜測,植物在種下之前是否會判斷放入方格中是否有植物呢? 答案是肯定的,當我們在一個空地上種植的時候,我們能夠種上說明條件成立,那如果方格中有植物則無法完成種植,條件也就不會成立,由此可猜到這里應該是使用一個條件判斷來控制的,下面我們就去尋找這個條件判斷的位置。

 

15.直接打開OD,然后附加游戲並運行起來,按下【Ctrl + G】,輸入【00401000】回到程序領空,然后輸入【00410A94】,來到種植CALL的位置,然后向上找。

 

16.由於這里我們並不知道那個跳轉是影響植物的種植判斷的,所以我們只能去程序的斷首下斷點,一步一步的單步調試。

 

17.然后我們回到游戲,在已經有植物的格子里種植植物,發現程序會斷下直接單步跟蹤,只要不是大跳轉就不需管它,在單步調試的時候,注意test 和cmp這種比較指令的狀態。

 

18.如下圖1-2,此處的JE跳轉並沒有跳轉成功,而且還是很大的跳轉,我們鼠標向下滑,找到跳轉的結束位置,發現在結束之前有一個JMP指令,由於JE沒有跳轉,那么肯定是執行JMP指令。

 

19.接着看圖1我們順着JMP指令向下找,在圖2的位置我們找到了種植CALL,也就是說它跳過了種植過程,我們繼續順着跳轉紅線往下找,會看到圖3直接ret返回了。

由上面的分析不難看出,由於JE跳轉並沒有跳轉成功所以執行了JMP指令,而JMP指令恰巧跳過了種植CALL,也就是跳過了種植的過程,所以可以斷定上方的JE指令必須得跳轉才能實現疊加種植的效果。

其實還有一種分析思路,我們知道如果植物種植失敗肯定會Ret直接返回,所以我們直接來到程序的斷尾,觀察有沒有直接跳轉到結束的指令,然后順着指令向上找也能夠找到這個JE的位置。

 

20.既然知道了JE跳轉是關鍵,那我們就讓它直接無條件跳轉試試,果然可以實現疊加種植啦。

 

詳細分析筆記,猛戳這里:https://blib.cn/post/4420.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM