植物大战僵尸外挂

Posted on 2025-09-06 11:10  封魔NJ  阅读(11)  评论(0)    收藏  举报
#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); 
     
}