【游戏辅助】利用C语言编写《植物大战僵尸》修改阳光值代码
0x00前言
文章中的文字可能存在語法錯誤以及標點錯誤,請諒解;
如果在文章中發現代碼錯誤或其它問題請告知,感謝!
0x01準備工具:
1.cheat engine:
https://www.cheatengine.org/
2.Visual Studio 2010
3.植物大戰僵尸
0x02實現過程
1.思路
我們打開的每一個程序中,存儲數據的內存地址都會發生改變,但是程序的基址和偏移不會變。所謂基址,可以簡單理解為不會隨程序運行的起始時間和環境改變的地址,即全局數據區的數據的地址。 所以,我們關閉游戲再啟動,存放游戲關鍵值的變量的地址不變。
所以現在我們利用cheat engine工具找到游戲的基址和偏移,獲取到之后,再利用C語言中ReadProcessMemory()和WriteProcessMemory()進行修改地址所指向的值就可以了。
2.找到陽光值基址
首先打開植物大戰僵尸游戲:
然后打開cheat engine,將植物大戰僵尸附加到該應用上:
接下來看一下游戲左上角的太陽值,將太陽值寫入value中,然后單擊First Scan:
此時在cheat engine中左側的內容區出現包含和剛才輸入值相同的數據行,然后回到游戲,等待新的小太陽的出現,當撿到小太陽后,太陽值將發生改變,現在回到cheat engine中,觀察內容區Value列,看該列數據是否出現變化的行(出現變化的行也會自動標紅顯示,方便查找):
上圖中變化的行已經標記出來,為了確定該行和游戲中的太陽值相關,多在游戲中撿幾個小太陽,看看標記的Value列是否跟著游戲改變,確定該地址和太陽值有關后,雙擊左鍵,將該行標記在最下對話框中,然后單擊右鍵,選擇“Find out what writes to this address”:
此時彈出一個對話框,對話框中沒有內容,此時回到游戲中進行使用或收集太陽的操作,現在,對話框中出現數據操作的信息。注意,當你撿太陽值是“add……”信息,當你使用太陽值是“mov……”信息,雙擊以觀察詳細信息:
現在,在彈出對話框中觀察紅字部分:mov [edi + 00005560] ,esi,該指令意思是將esi的值傳遞給[edi + 00005600]所指的地址中,其中00005560為偏移量,為十六進制數值。通過查看edi的值得知,edi為1476A5B0(或者直接查看The value……probaply 1476A5B0那一行提示),這樣,我們獲得了上級地址0x1476A5B0和偏移00005560。然后在The value……probaply 1476A5B0那一行提示右鍵復制上級地址值。
關閉兩個對話框,點擊New Scan重新掃描,將上級地址粘貼到value中,勾選Hex,點擊First Scan:
此時左側列表出現很多值,仔細觀察一會兒,會發現有些行數據一直變紅變黑,表明數據值在變化,點擊“Next Scan”將這些變化的值過濾掉(因為我們查找的value值一直沒變是0x1476A5B0)。
回到游戲,繼續撿太陽或者使用太陽值,然后選擇左側對話框中從第一行開始選擇,右鍵選擇“Find out what accessses this address”,直到在彈出的對話框中有類似mov……的指令為止。
同前,此時得到偏移0000768,上級地址為0x0283A1F8,將左側對話框中的該行標記在最下對話框,關閉彈出的兩個對話框,開始新一次Scan,復制0283A1F8到value中,勾選Hex,然后單擊“First Scan”:
此時觀察左側對話框中有綠色的行,證明我們找到了一個綠色的靜態地址(綠色顯示的是基址),現在選擇“Add Address Manually”,在彈出對話框中選擇 “Pointer”:
在彈出的對話框中將基址輸入的框中,然后單擊兩次“Add offset”(因為我們經過兩次的尋址),依次填入偏移,一次偏移為0x0000768,一次為0x00005560(從最近一次的偏移開始填),填寫完成后,查看Address中的數值是否為游戲中小太陽的值,如下圖:
我們現在理清一次思路:
由基址0x006A9EC0里的值+0x768后是個地址,
該地址里的值+0x5560就是存儲小太陽值的內存單元。
所以,現在我們找到了基址,然后在編寫代碼時將該基址加上0x768以及0x5560就是小太陽的內存單元。
3代碼
#include <stdio.h> #include <windows.h>#define SUN_SHINE_BASE_ADDR 0x006A9EC0 //陽光基址 #define SUN_SHINE_OFFSET_FIRST 0x768 //一級偏移 #define SUN_SHINE_OFFSET_SECOND 0x5560 //二級偏移值int main() {int modifySunshine = 0;DWORD ErrorInfo = 0;DWORD Size = 0;DWORD SunShineNum=0; //最后值DWORD PID = 0;DWORD SunShineBaseAddress = SUN_SHINE_BASE_ADDR; //陽光基址DWORD SunShineBaseAddressValue = 0; //陽光基址值DWORD SunShineOffsetFirst = SUN_SHINE_OFFSET_FIRST; //一級偏移DWORD SunShineOffsetFirstValue = 0; //一級偏移值DWORD SunShineOffsetSecond = SUN_SHINE_OFFSET_SECOND; //二級偏移HANDLE Process = 0;HWND hWinmine = FindWindowW(NULL, L"植物大戰僵尸中文版"); //找到窗口GetWindowThreadProcessId(hWinmine, &PID); //獲取進程標識if (0 == PID){printf_s("獲取PID失敗\n");return -1;}Process = OpenProcess(PROCESS_ALL_ACCESS, 0, PID);if (NULL == Process ){printf_s("進程打開失敗\n");ErrorInfo = GetLastError();return -1;}if (0 == ReadProcessMemory(Process, (LPVOID)SunShineBaseAddress, &SunShineBaseAddressValue, sizeof(DWORD), &Size)){printf_s("獲取基址失敗\n");ErrorInfo = GetLastError();return -1;}if (0 == ReadProcessMemory(Process, (LPVOID)(SunShineBaseAddressValue + SunShineOffsetFirst), &SunShineOffsetFirstValue, sizeof(DWORD), &Size)){printf_s("獲取一級偏移失敗\n");ErrorInfo = GetLastError();return -1;}if (0 == ReadProcessMemory(Process, (LPVOID)(SunShineOffsetFirstValue + SunShineOffsetSecond), &SunShineNum, sizeof(DWORD), &Size)){printf_s("獲取二級偏移失敗\n");ErrorInfo = GetLastError();return -1;}printf_s("SunShineNum:%d\n", SunShineNum);printf_s("輸入你要修改的值:");scanf_s("%d", &modifySunshine);WriteProcessMemory(Process, (LPVOID)(SunShineOffsetFirstValue + SunShineOffsetSecond), &modifySunshine, sizeof(DWORD), &Size);CloseHandle(Process); //關閉句柄system("pause");return 0; }4運行結果
運行結果如下圖,成功修改了小太陽的值:
因為獲取的是靜態基址,所以就算游戲關閉了,再開,也可以運行該代碼進行修改。
以上。
參考文檔:
https://blog.csdn.net/qq78442761/article/details/54670630
https://blog.csdn.net/xiaokangdream/article/details/79366176
https://www.cnblogs.com/gd-luojialin/p/7789569.html
https://blog.csdn.net/ChristmasYe/article/details/8757547
https://blog.csdn.net/xiaokangdream/article/details/79356831
https://blog.csdn.net/wangqingchuan92/article/details/82417454
總結
以上是生活随笔為你收集整理的【游戏辅助】利用C语言编写《植物大战僵尸》修改阳光值代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL InnoDB的缓冲池之预读失
- 下一篇: ae 的动画导出为html,Bodymo