遊戲輔助 | 植物大戰殭屍 (C# 陽光修改器)
工具準備
Cheat EngineVisual StudioPlants vs. Zombies
行前準備
- 閱讀Cheat Engine基本教學。
 - 閱讀x86組合語言 - 第三章 | 基本指令集。
 
輔助構思
- 透過
Cheat Engine抓取遊戲陽光基址與偏移量 - 使用
C#呼叫Win32API進行記憶體讀寫 
找尋基址
- 開啟
Plants vs. Zombies主程式 - 並開啟一場新遊戲至第一關卡
 

- 開啟
Cheat Engine - 選擇
Plants vs. Zombies程序 

- 新的搜尋
150 

- 回到
Plants vs. Zombies - 點擊增加陽光或是消費陽光,讓其陽光的值變動
-這邊示範消費陽光 - 其陽光的值變成了
50 

- 回至
Cheat Engine - 再次搜尋
50 - 僅剩下一個地址
062C7578(每次都會不一樣) 

- 對該地址點擊兩下,新增至下方的作弊表內
 - 將
Value進行修改為500 - 此時可見
Plants vs. Zombies的陽光也變更為500 

註:至此找到的地址並非所謂的基址,所以再重新開啟遊戲或是新的一輪遊戲,陽光的地址就會改變。
- 對
062C7578右鍵選擇Find out what writes to this address(找出是什麼改寫了這個地址) - 會開啟
The following opcodes write to 062C7578視窗 

- 回到
Plants vs. Zombies - 點擊增加陽光或是消費陽光,讓其陽光的值變動
- 這邊示範增加陽光
 
 - 其陽光的值變成了
525 - 回至
Cheat Engine - 可見
The following opcodes write to 062C7578視窗內多一筆資料 

- 點擊該筆資料
 
1  | EAX=062C2018  | 
- 可以發現指針
062C2018,偏移量00005560 

- 回至
Cheat Engine - 勾選
Hex - 新的搜尋,
062C2018 - 搜尋出一堆地址,此時請不要關閉該
Cheat Engine 

回到
Plants vs. Zombies選擇
Menu->Restart Level此時可以發現作弊表內的
062C7578修改value也不管用了新開啟一個
Cheat Engine選擇
Plants vs. Zombies程序新的搜尋
150回到
Plants vs. Zombies點擊增加陽光或是消費陽光,讓其陽光的值變動
- 這邊示範消費陽光
 
其陽光的值變成了
50回至
Cheat Engine再次搜尋
50僅剩下一個地址
0F38A5D8(每次都會不一樣)關閉這個
Cheat Engine

- 回到最初的
Cheat Engine - 點擊
Add Address Manually - 輸入
0F38A5D8,新增 

對
0F38A5D8右鍵選擇Find out what writes to this address(找出是什麼改寫了這個地址)會開啟
The following opcodes write to 0F38A5D8視窗回到
Plants vs. Zombies點擊增加陽光或是消費陽光,讓其陽光的值變動
-這邊示範增加陽光其陽光的值變成了
75回至
Cheat Engine可見
The following opcodes write to 0F38A5D8視窗內多一筆資料

- 點擊該筆資料
 
1  | EAX=0F385078  | 
可以發現指針
0F385078,偏移量00005560回至
Cheat Engine再次搜尋,
0F385078結果地址剩下兩個
0018926C、0029A0E0

- 此時可以判斷
0029A0E0才是該程序的地址- 因Windwos 是 0x004之後開始
 
 - 對該地址點擊兩下,新增至下方的作弊表內
 

- 對
0029A0E0右鍵選擇Find out what accesses to this address(找出是什麼訪問了這個地址) - 看到一堆東西
 

- 找尋前面幾筆
mov的做點擊 
1  | EAX=00452650  | 
- 可以發現指針
00299978,偏移量00000768 

回至
Cheat Engine新的搜尋,
00299978找尋一下結果地址表
發現四個綠色的基址
006A9EC0、006A9F38、006A9F78、006AA00C針對這四個基址右鍵選擇
Find out what accesses to this address(找出是什麼訪問了這個地址)發現只有前兩個
006A9EC0、006A9F38有一直被持續accesses
1  | EAX=00299978  | 
1  | EAX=00299978  | 
可見
006A9EC0、006A9F38兩個都已經沒有偏移量此時手動添加地址,透過基址加上偏移量
768和5560(反向)

可見最後指向地址都是
0F38A5D8,且值就是當前Plants vs. Zombies的陽光值對其修改
Value,Plants vs. Zombies亦會一起變動至此恭喜你找到陽光的基址與偏移量
註:即便重新開啟遊戲或是新的一輪都可以透過基址加上偏移量找到陽光的地址。
註:為什麼會找到兩個基址,我的猜測是因為我們在抓的時候,一個是新增陽光、一個是消費陽光。 (以上待驗證)
編寫輔助
- 啟動
Visual Studio - 新增專案 
Visual C\#->Windows 傳統桌面->Windows Forms App (.NET Framework)- 名稱
PZCheat 
 - 名稱
 

- 新增項目
 

Class類別- 名稱
PZHelper 
- 名稱
 

- 新增以下代碼
- 用於
Call Win32 API DLL,針對指定程序進行記憶體讀寫 
 - 用於
 
1  | using System;  | 
- 開啟
Form1.cs[設計] - 新增
Label、TextBox、Button 

- 雙擊
Button建立Click事件 
1  | using System;  | 

- 撰寫程式
 
1  | using System;  | 
- 運行測試
 

- 至此恭喜你已經成功做出一個簡單的單機遊戲輔助程式了
 
註:如要分享
.exe檔案,請到專案目錄下的Debug資料夾內,將其全部複製給別人即可。注意因為使用C#撰寫,對方的電腦要有安裝.NET Framework才可執行。
其他
以上只是非常陽春的修改器,主要是有個開始即概念;以下就是一些其他的思路可以先行嘗試做做看。
主動開啟
Plants vs. Zombies程式- 使用
Process.Start()並取得pid 
- 使用
 無限陽光
- 使用Timer持續修改陽光數值
 
註:以上參考了
植物大战僵尸修改器DIY(一)
植物大戰殭屍 (Plants vs Zomebies) 遊戲簡介、下載與完整攻略
C# 操作地址 从内存中读取写入数据(初级)
