前言
本人在網絡上看到一些視頻,學習寫作而成。代碼僅供學習參考,切勿作爲商業用途。雖然沒人會用我這麼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;
}
歡迎指正和評論!