遊戲輔助 | 植物大戰殭屍 (C# 陽光修改器)
工具準備
Cheat Engine
Visual Studio
Plants 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# 操作地址 从内存中读取写入数据(初级)