植物大戰殭屍陽光金幣修改器(外g)c++代碼實現

前言

本人在網絡上看到一些視頻,學習寫作而成。代碼僅供學習參考,切勿作爲商業用途。雖然沒人會用我這麼low的代碼

主要思路

這種簡單的修改器也就是對於內存的讀寫就可以了,而且PVZ(植物大戰殭屍)這個單機遊戲沒做反外掛,內存基址始終不變。經個人幾個電腦實驗,只要是同一版本的PVZ其基址都相同。

可能會用到的工具

Visual studio :可自行找度娘安裝教程

Cheat Engine:也可自己找度娘安裝,若是覺得網上不安全有病毒,可以下載本人找到的資源:百度網盤–Cheat Engine 7.0,提取碼:m0iz

植物大戰殭屍:可自行網絡下載,或者本人找到的資源:百度網盤 --PVZ中文年度版,提取碼:32yh

基址獲取

1.用CE(Cheat Engine) 去自己尋找,過程也非常有趣,推薦教程(非本人所寫,讀者也可自行百度)。

2.本人所用版本的基址:

請認準窗口名稱:Plants vs. Zombies 1.2.0.1073 RELEASE
在這裏插入圖片描述
以下均爲16進制
基址: 007794f8
陽光:+868+5578 (兩次偏移)
金錢: +950+50 (兩次偏移)

3.如果不是本人版本的PVZ,那麼可以自行百度。

以下爲本人找的基址大全的一篇博客:植物大戰殭屍 基址大全
真實性與正確性,本人未曾一一驗證。

PS:讀者在c++中使用時請將16進制下的地址轉換爲10進制,如本人程序所寫

// plantwg.cpp : 此文件包含 "main" 函數。程序執行將在此處開始並結束。

#include "pch.h"
#include <iostream>
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

//主菜單
void MainMenu()
{
	printf("-----歪瓜選項------\n");
	printf("    1.修改陽光\n");
	printf("    2.修改金幣\n");
	printf("    3.退出\n");
	printf("---created by wjl---\n");
}

//修改陽光
void ModifySun()
{
	//根據窗口名字獲取窗口句柄
	HWND hgame = ::FindWindow(NULL, "Plants vs. Zombies 1.2.0.1073 RELEASE");

	//得到線程或者進程id
	DWORD ProcessId;
	::GetWindowThreadProcessId(hgame, &ProcessId);

	//根據id得到進程句柄
	HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId);
	//內存基址
	LPVOID pBase = (LPVOID)7836920;//十六進制7794F8轉換爲10進制
	int sun = 0;
	LPVOID rbuffer = (LPVOID)&sun;
	//傳出參數
	DWORD byred;
	::ReadProcessMemory(hProcess, pBase, rbuffer, 4, &byred);

	pBase = (LPVOID)(sun + 2152);//十六進制868轉換爲10進制
	::ReadProcessMemory(hProcess, pBase, rbuffer, 4, &byred);

	pBase = (LPVOID)(sun + 21880);//十六進制5578轉換爲10進制
	::ReadProcessMemory(hProcess, pBase, rbuffer, 4, &byred);
	printf("當前陽光值:%d \n", sun);
	int wsun = 0;
	printf("請輸入陽光的修改值\n");
	scanf("%d", &wsun);
	LPVOID wbuf = (LPVOID)&wsun;
	DWORD by;
	::WriteProcessMemory(hProcess,(LPVOID)pBase,wbuf,4,&by);
	printf("修改陽光成功!\n");
}

//修改金幣
void ModifyMoney()
{
	//根據窗口名字獲取窗口句柄
	HWND hgame = ::FindWindow(NULL, "Plants vs. Zombies 1.2.0.1073 RELEASE");

	//得到線程或者進程id
	DWORD ProcessId;
	::GetWindowThreadProcessId(hgame, &ProcessId);

	//根據id得到進程句柄
	HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId);
	//內存基址
	LPVOID pBase = (LPVOID)7836920;//十六進制7794F8轉換爲10進制
	int money = 0;
	LPVOID rbuffer = (LPVOID)&money;
	//傳出參數
	DWORD byred;
	::ReadProcessMemory(hProcess, pBase, rbuffer, 4, &byred);

	pBase = (LPVOID)(money + 2384);//十六進制868轉換爲10進制
	::ReadProcessMemory(hProcess, pBase, rbuffer, 4, &byred);

	pBase = (LPVOID)(money + 80);//十六進制5578轉換爲10進制
	::ReadProcessMemory(hProcess, pBase, rbuffer, 4, &byred);
	printf("當前金幣值:%d \n", money);
	int wmoney = 0;
	printf("請輸入金幣的修改值\n");
	scanf("%d", &wmoney);
	LPVOID wbuf = (LPVOID)&wmoney;
	DWORD by;
	::WriteProcessMemory(hProcess, (LPVOID)pBase, wbuf, 4, &by);
	printf("修改金幣成功!\n");
}


int main()
{
	//根據窗口名字獲取窗口句柄
	HWND hgame = ::FindWindow(NULL, "Plants vs. Zombies 1.2.0.1073 RELEASE");

	//得到窗口的具體信息
	RECT r;
	::GetWindowRect(hgame, &r);
	//printf("窗口信息:\n 左上角座標:%d %d       右下角座標: %d %d\n", r.left, r.top, r.right, r.bottom);

	//獲得鼠標點擊的位置
	POINT P;
	::GetCursorPos(&P);
	//printf("鼠標位置:%d %d\n", P.x, P.y);
	
	if (NULL == hgame)
	{
		printf("請先運行遊戲,後重新開啓歪瓜!\n");
		Sleep(3000);
		return 0;
	}
	int op;
	while (1)
	{
		MainMenu();
		scanf("%d",&op);
		switch (op)
		{
		case 1:
		{
			ModifySun();
			break;
		}
		case 2:
		{
			ModifyMoney();
			break;
		}
		default: break;
		}
		if (op != 1 && op != 2)
		{
			printf("感謝使用!\n");
			break;
		}
	}
	return 0;
}


歡迎指正和評論!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章