首先新建mfc项目
然后加上几个按钮
改一下名字大概改成这样
然后双击打开进程按钮进入代码区开始实现功能
#include<iostream>
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
这几个是添加进去的
然后写一个类以及 方法的实现
写在第一个按钮代码前面就行
注释的是需要根据情况自己改动的
其他的可以当作模板直接使用
class plant
{
public:
DWORD pid = 0;
DWORD sunaddress = 0x00779618; //阳光基址
DWORD cd = 0x004B4CA1; //无冷却基址
DWORD size = 0;
DWORD sunfirst = 0x868; //阳光一级偏移
DWORD jbfirst = 0x950; //金币一级偏移
DWORD jbsecond = 0x50; //金币二级偏移
DWORD sunsecond = 0x5578; //阳光二级偏移
DWORD sunnumber = 0;
DWORD jbnumber = 0;
DWORD wucd = 0;
DWORD jbvalue;
DWORD sunfirstvalue;
DWORD sunaddressvalue;
int swant = 9999;
int jwant = 9999;
int i = 21513670;
void getpvzid();
HANDLE getjb();
void gaiyg();
void gaijb();
}p1;
void plant::getpvzid()
{
HWND PVZ=FindWindow(L"MainWindow", L"Plants vs. Zombies 1.2.0.1073 RELEASE"); //查找进程 可以用spy++
GetWindowThreadProcessId(PVZ, &pid); //获取进程句柄
}
HANDLE plant::getjb()
{
HANDLE jubing = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
return jubing;
}
void plant::gaiyg()
{
ReadProcessMemory(p1.getjb(), (LPVOID)p1.sunaddress, &p1.sunaddressvalue, sizeof(DWORD), &p1.size);
ReadProcessMemory(p1.getjb(), (LPVOID)(p1.sunaddressvalue + p1.sunfirst), &p1.sunfirstvalue, sizeof(DWORD), &p1.size);
ReadProcessMemory(p1.getjb(), (LPVOID)(p1.sunfirstvalue + p1.sunsecond), &p1.sunnumber, sizeof(DWORD), &p1.size);
WriteProcessMemory(p1.getjb(), (LPVOID)(p1.sunfirstvalue + p1.sunsecond), &p1.swant, sizeof(DWORD), &p1.size);
}
void plant::gaijb()
{
ReadProcessMemory(p1.getjb(), (LPVOID)p1.sunaddress, &p1.sunaddressvalue, sizeof(DWORD), &p1.size);
ReadProcessMemory(p1.getjb(), (LPVOID)(p1.sunaddressvalue + p1.jbfirst), &p1.jbvalue, sizeof(DWORD), &p1.size);
ReadProcessMemory(p1.getjb(), (LPVOID)(p1.jbvalue + p1.jbsecond), &p1.jbnumber, sizeof(DWORD), &p1.size);
WriteProcessMemory(p1.getjb(), (LPVOID)(p1.jbvalue + p1.jbsecond), &p1.jwant, sizeof(DWORD), &p1.size);
}
然后开始写打开进程按下按钮实现的功能
p1.getpvzid();
if (p1.getjb() == NULL)
{
MessageBox(L"打开进程失败");
}
else
{
MessageBox(L"打开进程成功");
}
然后双击无cd修改植物无cd
if (p1.getjb() == NULL)
{
MessageBox(L"请先获取进程");
}
else
{
WriteProcessMemory(p1.getjb(), (LPVOID)(p1.cd), &p1.i, sizeof(DWORD), &p1.size);
MessageBox(L"已修改");
}
依次修改阳光9999
if (p1.getjb() == NULL)
{
MessageBox(L"请先获取进程");
}
else
{
p1.gaiyg();
MessageBox(L"已修改");
}
改金币
if (p1.getjb() == NULL)
{
MessageBox(L"请先获取进程");
}
else
{
p1.gaijb();
MessageBox(L"已修改");
}
这样一个mfc的植物大战僵尸的小外挂就好了
控制台版本
#include<iostream>
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int main()
{
n:
HWND plant = FindWindow(L"MainWindow", L"Plants vs. Zombies 1.2.0.1073 RELEASE");//查找窗口
DWORD pid = 0;//定义窗标识
GetWindowThreadProcessId(plant, &pid);//取窗口表示存入pid
if (plant == NULL && pid == NULL)//判断是否找到窗口标识
{
cout << "打开进程失败" << endl << "错误代码" << GetLastError() << endl;
}
else
{
cout << "************************已找到进程************************" << endl;
}
HANDLE jubing = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (jubing == 0)
{
cout << "打开进程失败" << endl << "错误代码" << GetLastError() << endl;
}
else
{
cout << "************************已获取进程************************" << endl;
DWORD sunaddress = 0x00779618; //阳光基址
DWORD cd = 0x004B4CA1; //无cd基址
DWORD sunaddressvalue = 0;
DWORD size = 0;
if (NULL == ReadProcessMemory(jubing, (LPVOID)sunaddress, &sunaddressvalue, sizeof(DWORD), &size))
{
cout << "获取静态基址失败" << endl << "错误代码" << GetLastError() << endl;
}
DWORD sunfirst = 0x868; // 阳光一级偏移
DWORD jbfirst = 0x950; //金币一级偏移
DWORD jbsecond = 0x50; //金币二级偏移
DWORD sunfirstvalue = 0;
if (NULL == ReadProcessMemory(jubing, (LPVOID)(sunaddressvalue + sunfirst), &sunfirstvalue, sizeof(DWORD), &size))
{
cout << "一级偏移获取失败" << endl << "错误代码" << GetLastError() << endl;
}
DWORD sunsecond = 0x5578; //阳光二级偏移
DWORD sunnumber = 0;
DWORD jbnumber = 0;
DWORD jbvalue = 0;
DWORD wucd = 0;
ReadProcessMemory(jubing, (LPVOID)(sunfirstvalue + sunsecond), &sunnumber, sizeof(DWORD), &size);
ReadProcessMemory(jubing, (LPVOID)(sunaddressvalue + jbfirst), &jbvalue, sizeof(DWORD), &size);
ReadProcessMemory(jubing, (LPVOID)(jbvalue + jbsecond), &jbnumber, sizeof(DWORD), &size);
ReadProcessMemory(jubing, (LPVOID)(cd), &wucd, sizeof(DWORD), &size);
if (sunnumber < 0)
{
cout << "二级偏移获取失败" << endl << "错误代码" << GetLastError() << endl;
}
int swant;
int jwant;
int i=21513670;
printf("阳光值:%d\n", sunnumber);
printf("金币值:%d\n", jbnumber);
WriteProcessMemory(jubing, (LPVOID)(cd), &i, sizeof(DWORD), &size);
cout <<"植物无冷却已开启"<<endl<< "请输入想修改的阳光值:";
scanf("%d", &swant);
WriteProcessMemory(jubing, (LPVOID)(sunfirstvalue + sunsecond), &swant, sizeof(DWORD), &size);
cout << "请输入想修改的金币值:";
scanf("%d", &jwant);
WriteProcessMemory(jubing, (LPVOID)(jbvalue + jbsecond), &jwant, sizeof(DWORD), &size);
}
system("pause");
goto n;
}