1. 程式人生 > >利用C語言編寫《植物大戰殭屍》修改陽光值程式碼

利用C語言編寫《植物大戰殭屍》修改陽光值程式碼

0x00前言

文章中的文字可能存在語法錯誤以及標點錯誤,請諒解;

如果在文章中發現程式碼錯誤或其它問題請告知,感謝!

0x01準備工具:

2.Visual Studio 2010

3.植物大戰殭屍

0x02實現過程

1.思路

我們開啟的每一個程式中,儲存資料的記憶體地址都會發生改變,但是程式的基址和偏移不會變。所謂基址,可以簡單理解為不會隨程式執行的起始時間和環境改變的地址,即全域性資料區的資料的地址。 所以,我們關閉遊戲再啟動,存放遊戲關鍵值的變數的地址不變。

所以現在我們利用cheat engine工具找到遊戲的基址和偏移,獲取到之後,再利用C語言中ReadProcessMemory()和WriteProcessMemory()進行修改地址所指向的值就可以了。

2.找到陽光值基址

首先開啟植物大戰殭屍遊戲:
1.開局
然後開啟cheat engine,將植物大戰殭屍附加到該應用上:
2將遊戲附加到cheat engine

接下來看一下游戲左上角的太陽值,將太陽值寫入value中,然後單擊First Scan:
3查詢太陽值
此時在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執行結果

執行結果如下圖,成功修改了小太陽的值:
在這裡插入圖片描述
因為獲取的是靜態基址,所以就算遊戲關閉了,再開,也可以執行該程式碼進行修改。

以上。

相關推薦

利用C語言編寫植物大戰殭屍修改陽光程式碼

0x00前言 文章中的文字可能存在語法錯誤以及標點錯誤,請諒解; 如果在文章中發現程式碼錯誤或其它問題請告知,感謝! 0x01準備工具: 2.Visual Studio 2010 3.植物大戰殭屍 0x02實現過程 1.思路 我們開啟的每一個程式中,儲存資料的

WINCE5.0利用C#語言編寫的串列埠採集、顯示和儲存

          首先簡單說一下該程式實現的功能:定時採集現場的資料,在介面上實時顯示裝置資料,同時將採集到的裝置資料儲存到sqlite中,以方便第三方資料呼叫。該程式使用在wince5.0中,使用的是VS2008 C#語言。         內容涉及到wince同步的應

C語言也能寫植物大戰殭屍

不少同學都玩過《植物大戰殭屍》,最近PopCap公司又帶來了新版的訊息,這次高興的輪到Xbox的使用者了,日前PopCap公司公佈了《植物大戰殭屍》XBLA版的截圖,這個版本的《植物大戰殭屍》引入了多人合作與對抗模式,看圖就知道好玩多了又刺激多了。 C語言也能寫植物大戰殭屍 詳見遊戲說

C語言編寫的坦克大戰exe小遊戲

C語言編寫的坦克大戰exe小遊戲! (含有部分C++函式,不過不需要知道實現細節,主要用於鍵盤讀取等) 適合初學者學習的坦克大戰程式碼,無圖片,遊戲全部功能畫面顯示全部由 printf 列印的哦! C++視訊跟筆記都是全網最新最全的,加群玖四捌,玖伍四,四捌四 C語言/C艹程式設計入

使用cheat engine 修改植物大戰殭屍》遊戲引數

1.前言 1.1宣告 文章中的文字可能存在語法錯語以及標點錯誤,請諒解; 如果在文章中發現程式碼錯誤或其它問題請告知,感謝! 2具體實現過程 2.1 準備工具 2.植物大戰殭

利用語言編寫簡單的目錄掃描器

模塊 取出 col 統計 原理 pan 結果 局部變量 xxx 最近在參加小迪的培訓,聽到這目錄掃描收獲很大,把過程寫下來做筆記。 一.先開發這個我們得首先知道目錄掃描器的原理: 1.獲取用戶輸入的url 2.把url和敏感目錄關鍵字組合(比如:url:www.xxx.co

C#語言編寫代碼時常用的三大循環

包括 表達式 分析 大循環 進行 隨筆 循環 重新 一半 在我們編寫C#語言的過程中,經常會遇到各種需要用循環的時候,但是c#語言中三種常用的循環體(while循環, do while循環,for循環)我們該怎麽選擇呢? 首先while循環,wh

如何用c語言編寫出一個對文件夾加密的程序

加密 文件夾加密 編寫 quest http html 文件 .com 程序 http://baobao.baidu.com/question/1be9811f542d58b862736798f5dd6f57.html?5N2g=2017/12/04 http://baob

c語言編寫經驗逐步積累4

自己的 替換 移位 棧幀 編譯器 none 個數 -i data 寥寥數筆,記錄我的C語言盲點筆記,僅僅為以前經歷過。亦有誤。可交流。?1.邏輯表達式的使用取值 = 表達式 ? 表達式1:表達式2。比方x = y >

練手小項目:利用pygame庫編寫飛機大戰遊戲

代碼 pthon ngs 博客 以及 項目 class 編寫 利用 pygame庫已經很久不更新,畢竟使用python開發遊戲的不多。本項目的目的在於訓練自己的pthon基本功、了解中小型程序框架以及學習代碼重構等。項目出自《Python編程 從入門到實踐》中12-14章節

C#語言編寫:數組分析器

find 操作 fin numbers 排序 ole class 數字 輸入 static void Main(string[] args) { #region 創建數組 Console.Write("請輸入數組的

C#語言編寫:集合管理器

list 管理 main 繼續 console reac 提示 回車 read static void Main(string[] args) { List<int> numbers = new List<int>

c#語言編寫水仙花數

sta program for eric eap write 水仙花 ogr ati using System;using System.Collections.Generic;using System.Linq;using System.Text;using System

cp&tar&用c語言編寫程序 實現cp命令的效果

none des tdi 文件內容 display 我們 class pan fop 1.cp (拷貝) 已存在文件路徑 要拷貝的文件路徑 實現cp命令的代碼如下: 2 #include <stdio.h>

C語言編寫學生信息管理系統

name 全局變量 功能 管理系統 als 圖片 format \n 創建鏈表 學完C語言,自己想著編寫一個學生信息管理系統,既可以鞏固C語言知識,也能體驗怎麽合理地設計和實現一個項目。 設計比較簡陋,希望各位大佬多多批評,多多指教! 這個系統最重要的便是主要功能框架,在主

C語言編寫簡單遊戲——三子棋

      先簡單介紹一下三子棋的規則,方便我們接下來的程式設計和理解。規則如下:   在九宮格棋盤上,只要將自己的三個棋子走成一條線(橫、豎、對角線),對方就算輸了。   規則很簡單,但是我們應

C語言編寫Copy程式(Linux環境下的操作)

COPY程式的編寫 (作者:Baron_wu 禁止轉載) 一、實驗描述 在這個實驗中,我們要做一個程式,這個程式是將一個檔案的內容複製到一個目標檔案。首先這個程式提示使用者輸入要複製的原始檔案的名字,以及要複製到的目標檔案的名字。 確保包括必要的錯誤檢查,包括確保原始檔案存在

組合語言程式設計( 利用c語言快速理解彙編)

文章目錄 組合語言程式設計 一 操作碼和運算元 1 操作碼 2 運算元 3 語句格式 4 源程式框架 庫函式 二 資料定址方式 子程式

如何利用C語言來獲取當地時間和UTC時間 (設當地時間是北京時間)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

自我記錄:C語言編寫程式碼可能發生的問題與注意事項【陸續補充】

前言:該文章原創,不僅針對新手還是老手,均有一定幫助。若有錯誤地方,請不惜賜教。主要結合《C與指標》這本書,後續看過《C專家程式設計》、《C語言的XXX個問題》等書後會繼續補充。【非計算機類學生,目前更新進度緩慢】 編寫程式碼前的注意: ①、程式設計風格影響程式碼的可讀性,這像是一個人的臉,