#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); }
浙公网安备 33010602011771号