#include <iostream>
#include <windows.h>
using namespace std;
/*声明变量 */
HWND hand=NULL; //游戏窗口
DWORD pid=0;//游戏进程ID
HANDLE hProcess=NULL;//进程对象
DWORD BaseValue=0;//游戏数据存放的基础值
DWORD SunshineAddress=0x5560;//阳光内存变量名称(地址)
DWORD MoneyAddress=0x28;//金币内存地址
DWORD PlantsAddress=0x768;//植物内存地址
DWORD ZombiesAddress=0x90;//僵尸内存地址
/*声明方法/函数 */
bool startGame(); //初始化游戏数据
bool initSunshine();//初始化阳光数据
int getSunshineValue();//获取阳光值
void setSunshineValue(int value);//设置阳光值
void noCoolDown();//无冷却时间
void noStop(); //免暂停
int getMoney(); //获取金币
void setMoney(int value);//设置金币
bool initMoney();//初始化金币
bool initZombies();//初始化
bool killZombies(int index);//杀掉僵尸
bool initPlants(); //初始化植物
int setPlantsBlood(int index);//设置植物最大血量
void allZombies();//全部僵尸出动
int main(int argc, char** argv) {
bool Result=false;
Result=startGame();
if(Result==false){
return 0;
}
initMoney();
int money=getMoney();
cout<<"金币:"<<money<<endl;
//初始化阳光
Result=initSunshine();
if(Result==false){
return false;
}
int value=getSunshineValue();
cout<<"阳光值:"<<value<<endl;
while(1){
cout<<"输入1 充值 9999阳光"<<endl<<"输入2 秒杀全屏僵尸"<<endl<<"输入3 充值10000金币"<<endl;
cout<<"输入4 种植无冷却"<<endl<<"输入5 返回不暂停"<<endl<<"输入6 僵尸恢复正常"<<endl<<"输入7 僵尸隐身"<<endl;
cout<<"输入8 僵尸变黑"<<endl<<"输入9 设置植物无敌"<<endl<<"输入10 出动全部僵尸"<<endl;
value=0;
cin>>value;
if(value==1){
initSunshine();
setSunshineValue(9999);
cout<<"充值 9999阳光"<<endl;
} else if(value==2){
initZombies();
// 0为正常 1为消失 2为变黑 3为秒杀
killZombies(3);
cout<<"秒杀全屏僵尸"<<endl;
} else if(value==3){
setMoney(10000);
cout<<"充值10000金币"<<endl;
} else if(value==4){
noCoolDown();
cout<<"种植无冷却"<<endl;
} else if(value==5){
noStop();
cout<<"不暂停"<<endl;
} else if(value==6){
initZombies();
// 0为正常 1为消失 2为变黑 3为秒杀
killZombies(0);
cout<<"僵尸恢复正常"<<endl;
} else if(value==7){
initZombies();
// 0为正常 1为消失 2为变黑 3为秒杀
killZombies(1);
cout<<"僵尸隐身"<<endl;
} else if(value==8){
initZombies();
// 0为正常 1为消失 2为变黑 3为秒杀
killZombies(2);
cout<<"僵尸变黑"<<endl;
} else if(value==9){
initPlants(); //初始化植物
setPlantsBlood(999);//设置植物最大血量
cout<<"植物无敌"<<endl;
}else if(value==10){
allZombies();
}
}
return 0;
}
bool startGame(){
//查找电脑是否运行了植物大战僵尸
hand= FindWindow("MainWindow","植物大战僵尸中文版");
if(hand==NULL){
cout<<"游戏没有运行";
return false;
}
cout<<"窗口:"<<hand<<endl;
GetWindowThreadProcessId(hand,&pid);
if(pid==0){
cout<<"无法找到植物大战僵尸进程";
return false;
}
cout<<"进程:"<<pid<<endl;
hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,pid);
if(hProcess==NULL){
cout<<"无法打开进程"<<endl;
return false;
}
cout<<"打开进程:"<<hProcess<<endl;
DWORD BaseAddress=0x006A9EC0;//获取游戏数据的基础地址
bool Result= ReadProcessMemory(
hProcess, //读取哪一个进程
(LPVOID)BaseAddress, //内存地址是多少
&BaseValue, //读取数据放哪
4, //数据存储长度
NULL //实际读取的长度
);
if(Result==false){
cout<<"初始化基础地址失败";
return false;
}
return true;
}
bool initSunshine(){
DWORD _Address=BaseValue+0x768; //一级偏移地址
DWORD _Value=0;
bool Result= ReadProcessMemory(
hProcess, //读取哪一个进程
(LPVOID)_Address, //内存地址是多少
&_Value, //读取数据放哪
4, //数据存储长度
NULL //实际读取的长度
);
if(Result==false){
cout<<"初始化阳光地址失败";
return false;
}
SunshineAddress=_Value+0x5560;//二级偏移地址
return true;
}
//获取阳光值
int getSunshineValue(){
//阳光内存变量的真正名称
DWORD value=0;
bool Result= ReadProcessMemory(
hProcess, //读取哪一个进程
(LPVOID)SunshineAddress, //阳光内存地址
&value, //读取数据放哪
4, //数据存储长度
NULL //实际读取的长度
);
if(Result==false){
cout<<"获取阳光数据失败";
return 0;
}
cout<<"阳光数据:"<<value<<endl;
return (int)value;
}
//设置阳光值
void setSunshineValue(int value){
WriteProcessMemory(hProcess,(LPVOID)SunshineAddress,&value,4,NULL);
}
void noCoolDown(){
cout <<"种植无冷却"<<endl;
//无冷却时间代码
DWORD base = 0x00488e73;
//打开进程 获取所有操作权限
DWORD pianyi = 0x80;
WriteProcessMemory(hProcess,(LPVOID)base,&pianyi,1,NULL);
}
void noStop(){
cout <<"去掉暂停"<<endl;
//无冷却时间代码
DWORD base = 0x4502C0;
//打开进程 获取所有操作权限
DWORD pianyi = 0xC3;
WriteProcessMemory(hProcess,(LPVOID)base,&pianyi,1,NULL);
}
bool initMoney(){
DWORD _Address=BaseValue+0x82c; //一级偏移地址
DWORD _Value=0;
bool Result= ReadProcessMemory(
hProcess, //读取哪一个进程
(LPVOID)_Address, //内存地址是多少
&_Value, //读取数据放哪
4, //数据存储长度
NULL //实际读取的长度
);
if(Result==false){
cout<<"初始化金币地址失败";
return false;
}
MoneyAddress=_Value+0x28;//二级偏移地址
return true;
}
int getMoney(){
DWORD value=0;
bool Result= ReadProcessMemory(
hProcess, //读取哪一个进程
(LPVOID)MoneyAddress, //金币内存地址
&value, //读取数据放哪
4, //数据存储长度
NULL //实际读取的长度
);
if(Result==false){
cout<<"获取金币数据失败";
return 0;
}
cout<<"金币数据:"<<value<<endl;
return (int)value;
}
void setMoney(int value){
WriteProcessMemory(hProcess,(LPVOID)MoneyAddress,&value,4,NULL);
}
bool initZombies(){
//僵尸
DWORD _Address=BaseValue+0x768; //一级偏移地址
DWORD _Value=0;
bool Result= ReadProcessMemory(
hProcess, //读取哪一个进程
(LPVOID)_Address, //内存地址是多少
&_Value, //读取数据放哪
4, //数据存储长度
NULL //实际读取的长度
);
if(Result==false){
cout<<"初始化僵尸地址失败";
return false;
}
ZombiesAddress=_Value+0x90;//二级偏移地址
Result= ReadProcessMemory(
hProcess, //读取哪一个进程
(LPVOID)ZombiesAddress, //内存地址是多少
&_Value, //读取数据放哪
4, //数据存储长度
NULL //实际读取的长度
);
if(Result==false){
cout<<"僵尸二次偏移失败";
return false;
}
ZombiesAddress= _Value;
return true;
}
bool killZombies(int index){
// 0为正常 1为消失 2为变黑 3为秒杀
//不确定僵尸的个数 就从-100 ~ 100 寻找200个僵尸的内存地址
for(int i=-100;i<100;i++){
DWORD _address=ZombiesAddress+0x28+i*0x15c;
DWORD _Value=0;
bool Result= ReadProcessMemory(
hProcess, //读取哪一个进程
(LPVOID)_address, //内存地址是多少
&_Value, //读取数据放哪
4, //数据存储长度
NULL //实际读取的长度
);
if(Result==false){
cout<<"僵尸血量获取失败";
continue;
}
if(_Value<100){ // 这里要判断,否则写入其他地址会,游戏会崩溃 100以内的数据表示僵尸的各种状态
WriteProcessMemory(hProcess,(LPVOID)_address,&index,4,NULL);
}else if(_Value<1000){
cout<< "疑似僵尸血量:"<<_Value<< endl;
}
}
return true;
}
bool initPlants(){
DWORD _Address=BaseValue+0x768; //一级偏移地址
DWORD _Value=0;
bool Result= ReadProcessMemory(
hProcess, //读取哪一个进程
(LPVOID)_Address, //内存地址是多少
&_Value, //读取数据放哪
4, //数据存储长度
NULL //实际读取的长度
);
if(Result==false){
cout<<"初始化植物地址失败";
return false;
}
PlantsAddress=_Value+0xbc;//二级偏移地址
Result= ReadProcessMemory(
hProcess, //读取哪一个进程
(LPVOID)PlantsAddress, //内存地址是多少
&_Value, //读取数据放哪
4, //数据存储长度
NULL //实际读取的长度
);
if(Result==false){
cout<<"植物二次偏移失败";
return false;
}
PlantsAddress= _Value;
return true;
}
int setPlantsBlood(int index){
//不确定个数 就从-100 ~ 100 寻找200个植物的内存地址
for(int i=-100;i<100;i++){
DWORD value=0;
bool Result= ReadProcessMemory(
hProcess, //读取哪一个进程
(LPVOID)(PlantsAddress+0x44+(i*0x14c)), //植物内存地址
&value, //读取数据放哪
4, //数据存储长度
NULL //实际读取的长度
);
if(Result==false){
cout<<"当前血量数据失败";
continue;
}
if(value<100){ // 这里要判断,否则写入其他地址会,游戏会崩溃
WriteProcessMemory(hProcess,(LPVOID)(PlantsAddress+0x44+(i*0x14c)),&index,4,NULL);
}else{
cout<< "疑似植物血量:"<<value<< endl;
}
}
return 1;
}
void allZombies(){
//全部僵尸出动
//倒计时机制 当倒计时为1的时候,所有的僵尸全部出动
//时间不停 -1 当为0的时候,僵尸不出动
DWORD base = 0x413E45;
DWORD value = 0xE9FADA2C006690;
WriteProcessMemory(hProcess,(LPVOID)base,&value,1,NULL);
DWORD base1 = 0x6E1944;
DWORD value1 = 0xC7879C5500000100000083879C550000FFE9363E63F6;
WriteProcessMemory(hProcess,(LPVOID)base1,&value1,1,NULL);
Sleep(500);
value = 0x83879c660000FF;
WriteProcessMemory(hProcess,(LPVOID)base,&value,1,NULL);
value1 = 0x00;
WriteProcessMemory(hProcess,(LPVOID)base1,&value1,1,NULL);
}