植物大戰僵屍自動收集陽光&金幣


一.自動收集陽光

大致思路,猜測有一個點擊陽光的函數,當我們點擊陽光后,會調用它,完成增加陽光的一系列操作。但是只有當我們點擊的是陽光時,才會調用它,所以點擊陽光應該是有一個判斷的,判斷點擊的是否是陽光,找到這個判斷應該是可以實現自動收集陽光的。

 

分析
我們可以通過找到點擊陽光的函數,再去尋找判斷來達到我們的目的。點擊陽光后會增加陽光數量,那么我們就可以先去尋找存儲陽光的地址。使用CE,尋找存儲陽光的地址,附加游戲后,每當游戲中的陽光數值變化后,在CE中使用精確數值搜索,搜索當前陽光值,確定一個地址后,將其中的值修改為999,發現游戲中陽光數量也隨之變化,那么這里就是存儲陽光的地址 。

 

右鍵點擊這個地址,選擇find out what writes to this address,回到游戲中,等待一個掉落的陽光,點擊增加陽光后,這個窗口出現了變化,記住這個地址0x43C0AF,使用OD搜索此地址進行分析(此時需要關閉CE,才能使用OD附加程序)。

 

使用OD進入此地址進行分析,在這里下斷,每次增加陽光時都會斷下來,陽光數值的變化是陽光本身的值加上ecx的值,看當前ecx的值是0x19(25)這正是一個大陽光的值。

 

 

執行返回到上一層,根據里面的代碼分析,我們剛才出來的這個函數,就是當我們點擊陽光后,增加陽光數量的函數。點擊陽光的判斷並不在這里,這個函數只是當陽光到達左上角時增加陽光數量而已。

 

繼續執行出去,返回之后,在上面這個函數下斷,回到游戲中,當我們點擊陽光時就會斷下來,F9后,回到游戲中點擊繼續游戲還是會斷下來,但是發現陽光的位置發生了改變,不斷的在向左上角移動,那么這就是點擊陽光的函數了。

 

在點擊函數的上面有許多的判斷跳轉,其中有一個關鍵的跳轉決定是否進入此函數。猜測這里大概是一個標志的判斷,判斷我們點擊的是什么,如果點擊陽光的話,就進入這個函數,否則不會進入這個函數。我們可以去查看這個地址,是否符合我們的猜測。

 

找到與0x0比較的這個地址,下一個內存斷點

 

回到游戲中,點擊一個陽光,程序斷了下來,可以看到給這個地址賦值1,與0作比較是會跳轉的。

 

當我們點擊一個植物時,程序斷了下來,可以看到賦值0,JNZ是不會跳轉的。這里應該就是一個點擊標志的判斷,只有當我們點擊陽光的時候才會賦值1,調用函數。但是有一個問題是,有的時候點擊植物的時候並不會斷下來,在后續的調試中發現,這里並不是判斷植物的,產生陽光的時候才會賦值0,這里后續會提到。

 

修改就很簡單,只要讓這里無條件跳轉即可,改為JMP。

 

 二.自動點擊金幣
有了陽光的經驗,金幣就好辦多了,還是尋找金幣的存儲地址。但是沒有通過精確搜索找到金幣的存儲地址,沒辦法只能用別的辦法。

 

 

通過尋找當前減少的數值,來尋找。不斷的尋找減少的數值和未改變的數值,尋找,最終篩選剩下4個,嘗試修改其中一個,發現游戲中金幣數值改變。看到實際中存儲的數據,比游戲中顯示的少了一個0,之后再搜索尋找,發現金幣數值除以10即可精確的找到地址,金幣的數值在內存中應該是少了一個0進行存儲的。

 

還是老方法,右鍵,選擇find out what writes to this address,增加一個金幣之后,記下這個地址回到OD中搜索。收集一個金幣,看到給地址中的數值加了1,但是一個小金幣的數值應該是10,說明金幣的存儲在內存中是少一個0的。

 

執行出去,可以發現居然是剛才陽光的函數,說明點擊增加陽光和金幣是同一個函數,那么修改同一個條件就可以實現自動收集陽光和金幣。

 

回到剛才增加金幣的那里,向上查看就能看到陽光的增加函數。分析一下是如何判斷金幣和陽光的。看到是通過eax的值來判斷的,動態調試看到,eax=4或5時,代表陽光的增加,1和2的時候代表金幣的增加。eax=4的時候,代表的是大陽光,賦值0x19,eax=5的時候代表的是小陽光(夜晚關卡,小蘑菇產生的小陽光,一個增加15陽光值,43C09B處的eax+0xA,讓ecx中值=0xF),賦值0xF

 

 對於金幣來講eax=1時,代表小金幣,eax=2時,代表大金幣(43C109處,eax+0x3,讓edx=5,大金幣一個增加50),eax=3,代表鑽石(43C116,43C117兩處會讓edx=0x64,一個鑽石增加1000)。

 


免責聲明!

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



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