單機游戲逆向分析:植物大戰(zhàn)僵尸中文版破解學習
用到工具:CE、OD、植物大戰(zhàn)僵尸中文版
原理:每個程序在window上都會分配得到4GB的虛擬內存,我們只需將其在該4GB上對應的邏輯和數值進行修改即可實現最簡單的破解
例子:1.修改陽光反向增長
2.實現植物卡槽無冷卻
1.挖掘陽光數據
0x1打開ce工具選擇游戲進程選擇打開按鈕

0x2選好植物進入游戲后得到了50陽光的初始值,那我們ce選擇精確數值4字節(jié)首次掃描

首次掃描出現了多個結果,那我們繼續(xù)通過數據變化來繼續(xù)跟蹤

0x3在栽下一個向日葵以后陽光值變化為了0,那輸入0再次掃描后就只得到了一個結果

0x4將該值添加到地址表,修改數值確認該值是否是陽光地址

更改后發(fā)現這個地址的值就是陽光的地址值
0x5我們此時知道這個地址的值就是陽光的地址值,所以我們就可以通過查看是那些代碼訪問了或改寫了這個地址的值,就比如我們看到游戲右上角的陽關數就是通過不停訪問陽光的值顯示此時的陽光數量,我們栽下植物后或者收集陽光后則是對這個地址的值進行了更改(增加或減少),那我們選中地址列表中對應地址的值按下F5來選擇附件進程跟蹤是什么訪問了這個地址,如果打開這個窗口是空內容的話那就栽下或者收集陽光就可以出現內容了,那為什么會出現沒有內容呢?因為這個窗口的內容是從我們附加游戲進程后來記錄對應的訪問和改寫記錄

0x6此時我們選擇再栽下一棵植物來找最新的記錄,然后查看這條指令所在的匯編代碼
?

0x7打開反匯編界面以后,可以看到在我們跟進這條記錄的前一條指令是sub esi,ebx
我們知道sub是相減指令,而且剛才我們是栽下了植物,陽光減少了,所以猜測這里的esi存是未更改前的陽光值,ebx存的是對應植物所需的陽光值,則[edi+0x5578]存的是此時陽光的值,那我們此時可以通過修改sub esi,ebx 指令為add sub esi,ebx來驗證我們的猜想,如果我們栽下植物后陽光增加了對應栽下植物所需的陽光就說明我們的猜想就正確了,此時陽光是9899,那我們栽下一個寒冰豌豆175試試

0x7果然,我們的猜想正確,那我們選中此時的add esi,ebx按下CTRL+G來查看這條指令的虛擬地址,并且把它記錄下,00427694
?

2.挖掘卡槽冷卻數據
0x1這里我們采用和挖掘陽關數據一樣的方法來跟蹤數據,即卡槽沒在冷卻則為一個狀態(tài)值,在冷卻為一個狀態(tài)值,這里我們通過猜測狀態(tài)值為1、0來挖掘(不對再通過模糊搜尋來挖掘),這里注意用狀態(tài)值時基本都是字節(jié)類型,所以要記得更改數值類型再搜索

0x2最后找到22個可以數據我們全部把這些地址值加入地址列表,然后通過二分法來批量修改驗證知道找到最后的卡槽冷卻數據,這里我就不說二分法具體怎么用了,大家可以百度,最后我找到卡槽狀態(tài)的地址值是0x1F5B2438(臨時數據,不是特征,我只是說一下我找的數據方便接下來講解),此時我們知道我們之所以看到植物卡槽的狀態(tài)灰與亮都是由這個值來決定,那我們依舊采用挖掘陽光數據的方法去查找那些指令訪問了這個地址,查看匯編代碼

mov byte ptr [esi+49],00
mov byte ptr [esi+48],01
0x3mov byte ptr [esi+49],00代碼是我載下植物時候產生的訪問或者改寫記錄,可以看到上面兩行代碼一個賦值00,一個賦值01,那我們就將00改為01試試,發(fā)現依舊沒實現無冷卻,那么我們分析指令,發(fā)現以上兩行指令是在一個jle條件不成立的情況下才會執(zhí)行,那我們直接把jle那行指令nop了,讓它無論什么情況都執(zhí)行一下兩行代碼
mov byte ptr [esi+49],01
mov byte ptr [esi+48],01
0x4更改后發(fā)現的確沒存在了冷卻,和挖掘陽光一樣,記下這幾條指令的地址0049CE02

3.此時所有的修改都是內存中的值,都是臨時,所以我們接下來用od對其進行永久性更改
0x1先對陽光反增長邏輯指令定位更改,CTRL+G跳轉到00427694,將sub 該為add
?

0x2對卡槽冷卻邏輯定位更改,CTRL+G跳轉到0049CE02,jle用二進制填充,mov byte ptr ds:[esi+0x48],0x0改mov byte ptr ds:[esi+0x48],0x1

?