前言
之前做星際的時候,就有兄弟們說,為啥不做一個原子彈無CD呀。好像大家對CD這個東西挺感興趣,那我們這一篇就來研究一下,做無CD的思路吧。
這個植物大戰僵屍系列呢,目前暫定想法就是3-4集的樣子。主要就是針對於各種不同的功能,進行一個思路的引導和分析。最后一集的時候,會介紹如果使用易語言和AA引擎,將他直接制作成一個真正的修改器,盡情期待。
PS:我講的是思路,植物大戰僵屍,只是一個例子,大家可以把思路拓展到別的方面去,注重思維靈活。
歡迎文明轉載,請注明出處 丸子de爸爸
本文所有技術資料僅供研究,不鼓勵任何盜版商用行為
請大家支持正版,支持正版!支持正版!!!
工具
CheatEngine6.7
植物大戰僵屍本體
PS:(我使用的是年度版,可以直接解鎖所有物品,不然你就自己打到后面去吧)
本次基礎知識
內存,一切皆內存,我們操作的全部都是內存。
所有地址相關的概念,都可以理解為坐標,用來給我們做標記的而已。
如果實在搞不明白,你想想指南針為啥指向北邊,為啥叫南北,只是定義,只是公認
PS:上面這一段是重復了,但是我覺得還是有必要多重復一下,看多了,大家就印象深刻一點。
CE數據模糊搜索
在搜索數據時,有時數據並不是有固定值的,比如CD,只知道他是增加或是減少,此時需要怎么做?
可以使用CE的模糊搜索功能,更改掃描模式為“未知的初始值”,進行初次掃描后,就可以根據數值的增減,來對數值進行查找了。
例:植物生命值,種下植物之后,首次掃描,紀錄植物滿血的狀態。然后等僵屍咬了一口植物,植物生命值減少,進行數字的減少操作,多次重復,得到植物生命值。
每一次模糊搜索,都僅僅針對於上一次的搜索結果。
匯編語句
inc
相當於編碼中的i++,就是自身+1。
例:inc eax,其實就是eax = eax + 1
dec
相當於編碼中的i--,就是自身-1。
例:dec eax,其實就是eax = eax - 1
cmp
簡單理解為比較語句,通常結合j**跳轉一起使用。有興趣的可以去查一下,不講多了,講多了反而容易混亂。
例:cmp eax ,ebx,比較eax和ebx
jle
上一次比較的結果,左側小於等於右側,則跳轉。
例:eax = 1,ebx = 2。cmp eax,ebx。此時jle就會跳轉。
test
兩個參數進行與操作。如果兩個參數相同,則為判斷是否為0。這個也可以查一下,很多內容。
例:test eax,eax。
實現步驟
植物無CD
破解最重要的基礎,CE找到對應的內存
CE查找CD地址
先點一下墓碑旁邊的鎖,解鎖一下所有內容,省事很多
進入冒險模式第一關,隨便把植物選滿(記得選食人花和堅果,待會有用)
CE附加一下進程"PlantsVsZombies.exe"
開始游戲后,切換到CE,掃描類型改為“未知的初始值”,執行首次搜索
得到的結果數量很多(在附加進程按鈕下面就是數量),接下來我們講一下CD的機制。
一般的CD計算,在匯編中,都是通過循環來判斷,流程圖如下
就是當CD沒完成的時候,會一直循環,直到滿足條件,才會執行正常的邏輯
根據CD流程圖,所以接下來的動作就如下
植物大戰僵屍的CD是按照0開始增大,CD完成再恢復成0的邏輯。流程圖直接按增大邏輯。(我自己試出來的)
PS:正常的話,不知道是可以使用,模糊查找的變化的數值。但是如果數據太多,先猜一個增大或者減少,如果找不到,再搜另外一種可能,會更快找到內存。
這里為啥要判斷CD完沒完成呢?為啥又要減少。
因為每一種植物是一個CD,當在CD狀態時,CD值持續增大,當CD完成時,需要變為0。所以是減少了。
例:CD為3000,建造過程中,從0-3000一直增大,每一次時間間隔,都會增大,如1000,1100。完成CD時候,變成了0,自然會比上一次的數據都要少,所以搜索減少。
一通操作,找出了CD地址如下,你們的和我的不一定一樣
判斷找對了的方法在於,他數值的增長和歸零,和你植物的CD是同步的。
右鍵地址,選擇“是什么改寫了地址”
此時再回到游戲,選擇搜索到CD的植物(每種植物的CD是單獨是,所以一定要選同一個哦)
可以發現,你選中植物的時候,就有一條訪問紀錄,再次說明我們找對了。
反匯編分析
接下來簡單了,回到最初的流程,CD完成時,需要重置CD。
於是切入口出現了,根據流程,他會在循環中不斷判斷是否要重置CD。
所以只要將CD是否完成的判斷條件更改為一直完成,就可以實現無CD了。
種下找到CD的植物,等待他CD重置,會發現訪問列表中多了一條數據。
內容為: mov [esi+24],0000000。根據匯編知識,我們知道這是給[esi+24]置0。
反匯編分析
選擇最后那條記錄,點擊“顯示反匯編程序”
已經知道[esi+24]是植物CD了,那我們在往上看,發現了什么?
紅框內的語句從上到下分別為:
- CD增加1
- 將CD賦值到eax
- 比較CD和一個值(這里可以推斷是最大值了)
- 如果CD小於最大值,則跳轉
- 給eax賦值為esi
- 將CD置0
於是可以推測,jle那一句代碼,就是流程圖中的判斷CD是否完成的邏輯
修改匯編代碼
右鍵jle那一行,選擇“使用空指令替換”。即,讓這一行始終不執行。
然后回到游戲,CD移除。
小作業,可以按照上一集的做法,嘗試自己寫一下自動注入的AA腳本。並在CE中使用。
超級吃人花
食人花界的大胃王,移除消化時間,吃起來沒完沒了。
大家可以嘗試先不往下看,自己使用無CD的方法,看自己能不能找到怎么做。
CE查找消化CD地址
在離僵屍稍微遠一點的地方,種下一顆食人花。(遠一點是為了我們好記錄首次信息,別一下去就吃了,比較麻煩)
之后在第一個僵屍后面,擺一個堅果。(保護食人花不被后面的吃了,給我們多點時間。所以,為啥我不先做無敵。忘了....)
開啟一個“新的掃描”,掃描類型改為“未知的初始值”,執行首次搜索
按道理,一個游戲的邏輯都是一樣的,所以CD也應該是增大,然后這個游戲居然不是。食人花的CD居然是減少。
按照CD同樣的操作,只不過變成了減少。找到一個可疑值,為啥判斷是他,你看其他的都大成什么樣了,吃大象都消化了呀。
測試一下,右鍵“改變已選中地址的值”,改為0,發現食人花馬上就吞下去了。就是他了。
反匯編分析
選中食人花吞噬CD,右鍵“找出是什么改寫了這個地址”,然后就等吧。等啥,等僵屍來,就像種植CD,每一種植物同一個CD。食人花是每一朵一個吞噬CD,所以,只有等再來一個僵屍的時候,我們才可以觀察數據。
等它吃了一個僵屍,趕緊觀察數據,發現有兩條紀錄只調用了一次,第三條數據會特別一點,因為第一條才46,但是食人花消化是需要很久的。而我們又知道消化CD是遞減的,所以在剛吃進去的時候,應該需要賦值一個最大值,然后慢慢遞減,所以這個00000FA0就是最大值,選中他,“顯示反匯編程序”
修改匯編代碼
來到匯編界面,根據分析,我們知道他賦值的就是最大值,那么,我直接把最大值改為0,是不是就直接無消化CD呢?
雙擊選中的代碼,將后面的00000FA0,改為0。
回到游戲,發現還是沒有消化呀,那是因為我們這個修改,只是在食人花吃僵屍的時候生效,所以回內存地址中,把消化CD手動置為0,再看。接下來所有的僵屍就是一口一個不停了。
總結
在沒有准確數據顯示的時候,嘗試使用CE的模糊搜索,可以很方便的幫我們定位內存地址。通過檢測內存地址的訪問和改寫,我們又可以很快的定位到匯編的邏輯。於是,修改程序就變成了一個簡單的事情。
不要因為一個游戲比較老舊,就覺得他沒有可以利用的地方。只要你有想象力,它一樣可以有很多新鮮的功能,大家如果覺得有趣,可以按照本文的方法,繼續制作,土豆雷和玉米大炮的無CD,方法完全是相同的。
如果有什么意見和問題,歡迎留言或者私聊,感謝觀看!!!