植物大战僵尸(6):查找植物叠加种植CALL
實驗?zāi)繕?biāo):我們都知道植物大戰(zhàn)僵尸游戲中植物是不可以疊加種植的,也就是一個格子只能種植一個植物,今天我們將實現(xiàn)一個格子里種植無限多的植物。
我們首先需要找到植物的種植CALL,然后在逐步測試觀察功能之間的變化,最終實現(xiàn)功能。
?
種植CALL的遍歷技巧:
打開CE -> 回到游戲 -> 然后回到CE -> 掃描未知初始數(shù)
回到游戲 -> 拿起向日葵(不要種) -> CE 搜索變動的數(shù)值 -> 回到游戲(不要動) -> 搜索未變動的數(shù)值
回到游戲 -> 放下向日葵 -> 拿起豌豆射手 -> CE搜索 變動的數(shù)值 -> 以此重復(fù)進(jìn)行
當(dāng)我們使用鼠標(biāo)點(diǎn)擊時會在一個地址寫入值,當(dāng)換個植物則會換一個數(shù)值,這樣如此反復(fù)就會找到CALL的地址。
?
1.打開CE附加游戲進(jìn)程,然后搜索未知初始化數(shù)值。
?
2.接著回到游戲,選擇向日葵植物,然后回到CE直接搜索,變動的數(shù)值。
?
3.回到游戲不要動,直接右擊取消向日葵的選擇,然后再次拿起向日葵,搜索未變動的數(shù)值。
?
4.放下向日葵,拿起豌豆射手(不要告訴我你不知道是哪個),回到CE,搜索變動的數(shù)值。
?
5.放下豌豆射手,拿起向日葵,然后CE搜索變動的數(shù)值。
?
6.如上以此循環(huán)執(zhí)行第4,5步,直到數(shù)據(jù)變成了幾個為止,這里我找到了兩個比較可疑的,只要拿起植物它就發(fā)生變化。
?
7.我們在第一個地址上面,右擊選擇查找訪問的地址,也可以選中第一行按下【F5】鍵,回到游戲并手動種植一個植物,會發(fā)現(xiàn)一條可疑匯編代碼,我們先把地址記下來【00410AC1】
這里我們只需要記錄植物種下后出現(xiàn)的地址,前面三個分別是拿起植物和放下植物的代碼,我們這里不需要考慮。
好了,我們關(guān)閉上面的【訪問地址】對話框,然后我們用同樣的方式在第二個地址上操作,種下植物會發(fā)現(xiàn)三個可疑地址,我們直接記下來,【00410865】,【00410a91】,【0041239A】
由于我們不知道那一個會調(diào)用種植的CALL所以,我們把這三個地址都記下來,記下來之后關(guān)閉CE就好了,后期用不到了。
在調(diào)試之前,請你自行把陽光改多一點(diǎn),方便我們調(diào)試。
?
8.關(guān)閉CE后,直接打開OD并附加植物大戰(zhàn)僵尸游戲進(jìn)程,然后按下【F9】讓程序先跑起來,然后【Ctrl + G】輸入【00401000】回到程序領(lǐng)空。
?
9.我們分別定位到上面找到的那幾個地址上,【00410AC1】,【00410865】,【00410a91】,【0041239A】,然后觀察后分別下斷點(diǎn)。
?
10.一切準(zhǔn)備就緒了,我們回到游戲中,然后拿起一個植物,拿起植物后發(fā)現(xiàn)并沒有斷下,我們直接右擊放下植物,會發(fā)現(xiàn)OD直接斷下了,這里可以排除了,因為我們放下了植物并沒有種植所以也就跳過了種植的CALL,這里沒有我們直接取消下面的兩個斷點(diǎn),然后按下【F9】讓程序跑起來。
?
11.接著我們繼續(xù)回到游戲中,拿起植物然后種植下去,此時OD會段在第二個斷點(diǎn)的位置上,默認(rèn)關(guān)鍵跳轉(zhuǎn)沒有跳,我們直接修改標(biāo)志位讓其跳轉(zhuǎn)實現(xiàn),然后運(yùn)行程序發(fā)現(xiàn)種下了植物,這里雖然斷下了但修改后并沒有停止種植,所以這里我們也排除掉,取消這里的兩處斷點(diǎn)。
?
12.繼續(xù)回到游戲,種下植物OD會段在以下位置,我們默認(rèn)是不跳轉(zhuǎn)的也就是種植,我們修改標(biāo)志位觀察發(fā)現(xiàn),植物并沒有被種下,說明這個跳轉(zhuǎn)跳過了關(guān)鍵的種植代碼,我們向下找也不難看出,于是乎我們重點(diǎn)分析它跳過的代碼的執(zhí)行軌跡。
?
13.觀察如上跳過的代碼不難看出一堆PUSH指令,很明顯這是調(diào)用CALL之前的參數(shù)傳遞,此時我們直接在PUSH的位置下斷點(diǎn),回到游戲中再次種植植物,程序會斷下,我們觀察程序的壓站情況。
首先我在第一行第一列種植了一個植物,觀察壓站情況如下所示,我已經(jīng)分析好了。
為了對比明顯,我在第二行種植了一個寒冰射手,然后觀察壓站情況,會發(fā)現(xiàn)植物的未知變化和植物ID的變化。
?
14.上面的對比已經(jīng)非常明顯了,我們直接使用代碼注入器注入分別將push 5 改成【 1,2,3】,然后用【mov eax,2】控制在第幾列種植,即可實現(xiàn)疊加效果。注意:這里的 【Push 1406FA88】每次運(yùn)行程序都會改變,我這里可以注入成功,你們那里需要修改一下。
既然找到了種植CALL的地址【00410A94】,那我們可以猜測,植物在種下之前是否會判斷放入方格中是否有植物呢? 答案是肯定的,當(dāng)我們在一個空地上種植的時候,我們能夠種上說明條件成立,那如果方格中有植物則無法完成種植,條件也就不會成立,由此可猜到這里應(yīng)該是使用一個條件判斷來控制的,下面我們就去尋找這個條件判斷的位置。
?
15.直接打開OD,然后附加游戲并運(yùn)行起來,按下【Ctrl + G】,輸入【00401000】回到程序領(lǐng)空,然后輸入【00410A94】,來到種植CALL的位置,然后向上找。
?
16.由于這里我們并不知道那個跳轉(zhuǎn)是影響植物的種植判斷的,所以我們只能去程序的斷首下斷點(diǎn),一步一步的單步調(diào)試。
?
17.然后我們回到游戲,在已經(jīng)有植物的格子里種植植物,發(fā)現(xiàn)程序會斷下直接單步跟蹤,只要不是大跳轉(zhuǎn)就不需管它,在單步調(diào)試的時候,注意test 和cmp這種比較指令的狀態(tài)。
?
18.如下圖1-2,此處的JE跳轉(zhuǎn)并沒有跳轉(zhuǎn)成功,而且還是很大的跳轉(zhuǎn),我們鼠標(biāo)向下滑,找到跳轉(zhuǎn)的結(jié)束位置,發(fā)現(xiàn)在結(jié)束之前有一個JMP指令,由于JE沒有跳轉(zhuǎn),那么肯定是執(zhí)行JMP指令。
?
19.接著看圖1我們順著JMP指令向下找,在圖2的位置我們找到了種植CALL,也就是說它跳過了種植過程,我們繼續(xù)順著跳轉(zhuǎn)紅線往下找,會看到圖3直接ret返回了。
由上面的分析不難看出,由于JE跳轉(zhuǎn)并沒有跳轉(zhuǎn)成功所以執(zhí)行了JMP指令,而JMP指令恰巧跳過了種植CALL,也就是跳過了種植的過程,所以可以斷定上方的JE指令必須得跳轉(zhuǎn)才能實現(xiàn)疊加種植的效果。
其實還有一種分析思路,我們知道如果植物種植失敗肯定會Ret直接返回,所以我們直接來到程序的斷尾,觀察有沒有直接跳轉(zhuǎn)到結(jié)束的指令,然后順著指令向上找也能夠找到這個JE的位置。
?
20.既然知道了JE跳轉(zhuǎn)是關(guān)鍵,那我們就讓它直接無條件跳轉(zhuǎn)試試,果然可以實現(xiàn)疊加種植啦。
?
轉(zhuǎn)載于:https://www.cnblogs.com/LyShark/p/11213955.html
總結(jié)
以上是生活随笔為你收集整理的植物大战僵尸(6):查找植物叠加种植CALL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第十届大学生服务外包创新比赛心得和感悟
- 下一篇: 梦幻西游手游:工坊进阶考试题目攻略—考古