Qt植物大战僵尸实现修改阳光和无冷却

Qt植物大战僵尸实现修改阳光和无冷却


网上关于qt修改植物大战僵尸的,尤其是开头获取进程句柄和窗口句柄,代码和博客方面会模糊一些,今天写个简洁易懂的,本人也是菜鸟刚学qt快两个月,有疑问在下面我一定回复。

先看下我们的界面,很简单,就一个复选框选中即为全部方框无冷却,没选中则恢复冷却。方框里输入数字,点击按钮可以修改阳光
Qt植物大战僵尸实现修改阳光和无冷却_第1张图片
一、需要用到的函数以及参数获取

用的是常见的ReadprocessMemory(读进程内存)和WriteProcessMemory(写进程内存),你要用到这两个函数,你肯定要满足这两个函数的参数才能修改

我们来看下这两个函数:
BOOL ReadProcessMemory(
HANDLE hProcess, //这个是进程句柄,注意不是窗口句柄
LPCVOID lpBaseAddress, //进程中内存地址,这里即为要修改的地址
LPVOID lpBuffer, //缓冲区
DWORD nSize, //要读的字节数
LPDWORD lpNumberOfBytesRead //实际传的字节数
);

BOOL WriteProcessMemory(
HANDLE hProcess, //进程句柄
LPVOID lpBaseAddress, //地址
LPVOID lpBuffer, //缓冲区
DWORD nSize, //要写的字节数
LPDWORD lpNumberOfBytesWritten //实际写的字节数
);

现在我们记住,我们在窗口初始化时需要获取的变量有
HANDLE hProcess, //进程句柄
LPVOID lpBaseAddress, //地址(地址通过CE软件查找植物大战僵尸获取)

这里列举本文中需要用到的基址和偏移,即LPVOID lpBaseAddress
植物大战僵尸中文版,游戏统一基址为:0X006A9EC0

阳光的地址为:006A9EC0+768+5560
无冷却地址为:
006A9EC0+768+144 +70 (第1个方框的无冷却)
006A9EC0+768+144 +70+50(第2个方框的无冷却)
006A9EC0+768+144 +70+50+50(第3个方框的无冷却)

以此类推,每个地址,偏移加上50,就是下一个方框的无冷却地址
注意不同版本的植物大战僵尸基址和偏移也不同,请下载中文版原始版

二、接下来是代码实现部分

我们先建立一个UI,我建立的是QMainWindow窗体
然后添加控件
Qt植物大战僵尸实现修改阳光和无冷却_第2张图片
上面我们说过还要获取,HANDLE hProcess //进程句柄。

现在在初始化的地方,我们在widget.h地方头文件加上
#include
#include//这个是定时器,用来执行写入无冷却

然后定义
HWND hwnd;//窗口句柄
DWORD pid;//进程pid
HANDLE hProcess; //进程句柄
QTimer *No_cooling;//无冷却定时器
然后在cpp文件中,头文件加上
#include
#include

接下来就是初始化时获取进程句柄

    No_cooling=new QTimer(this);//创建一个为无冷却的定时器

    hwnd= FindWindow(NULL, TEXT("植物大战僵尸中文版"));
    GetWindowThreadProcessId(hwnd, &pid);//第二个参数用来保存进程标识符pid  
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    
    //进程不存在则关闭软件
    if(hProcess==NULL)
    {
QMessageBox::warning(this,"提示","请打开游戏",QMessageBox::Ok);//信息框提示
QTimer::singleShot(0,qApp,SLOT(quit()));//关闭软件
    }
    //无冷却定时器信号槽
    connect(No_cooling,&QTimer::timeout,this,&MainWindow::dealCooling);

然后在UI界面,右击按钮,转到槽
Qt植物大战僵尸实现修改阳光和无冷却_第3张图片

选择clicked,然后确定

//修改阳光函数
void MainWindow::on_pushButton_clicked()
{
   int sun= ui->lineEdit->text().toInt();//获取编辑框你输入的数值
   DWORD d=sun;    //然后把阳光int转化成DWORD,可以回头参考函数类型
   int Addr;       //临时保存的地址
   
   //然后就根据基址和偏移写内存就行了,最后两个参数默认4和0就行了
   ReadProcessMemory(hProcess, (LPCVOID)(BaseAddr), &Addr, 4, 0);
   ReadProcessMemory(hProcess, (LPCVOID)(Addr + 0x768), &Addr, 4, 0);
   WriteProcessMemory(hProcess, (LPVOID)(Addr + 0x5560), &d,4,0);
  
}

这样就可以编译运行看看阳光是否可以修改了。

接下来是无冷却

同样右击转到槽,选择clicked,然后确定
Qt植物大战僵尸实现修改阳光和无冷却_第4张图片

编译器带我们转到了这里,然后写下函数

//无冷却复选框被单击
void MainWindow::on_checkBox_clicked()
{
    if(ui->checkBox->isChecked())  //复选框被选中
    {
        No_cooling->start(100);  //无冷却定时器开始以0.1秒一次写入执行
    }
    else if(!ui->checkBox->isChecked())//复选框不被选中
    {
         No_cooling->stop();  //无冷却定时器停止
    }
}

接下来我们对定时器进行操作,在初始化中
(看不懂的看上面初始化我定义了这个定时器)
我定义了这个信号和槽,&QTimer::timeout表示定时器被触发,
&MainWindow::dealCooling是我自己写的无冷却的函数

connect(No_cooling,&QTimer::timeout,this,&MainWindow::dealCooling);

所以我们在.h头文件中,加上void dealCooling的槽函数,前面那两个clicked函数,就是我们刚刚上面的操作转到槽,系统帮我们自动生成的。
Qt植物大战僵尸实现修改阳光和无冷却_第5张图片
然后在cpp文件中,自己手动写这个无冷却槽函数的内容

//无冷却槽函数
void MainWindow::dealCooling()
{
    int value = 1;
    int Addr;
    ReadProcessMemory(hProcess, (LPVOID)(BaseAddr), &Addr, 4, 0);
    ReadProcessMemory(hProcess, (LPVOID)(Addr + 0x768), &Addr, 4, 0);
    ReadProcessMemory(hProcess, (LPCVOID)(Addr+0x144), &Addr, 4, 0);
    
    for (int i = 0; i < 10;i++)//利用循环每次加50,循环10次实现10个方框无冷却
    {
        WriteProcessMemory(hProcess,
         (LPVOID)(Addr +0x70 + (0x50)*i),&value, 4, 0);
    }
}

好了,这样无冷却,和修改阳光都完成了,可以编译运行看看了
Qt植物大战僵尸实现修改阳光和无冷却_第6张图片

结尾是代码打包,
我只打包了cpp,和h文件,代码量很少
你们如果看不懂直接下载我这个,
然后自己新建项目把我函数里的代码复制进去就行了

链接: https://pan.baidu.com/s/1cl-jwIyPUj5n0E1P8PaFMA
提取码: 36mt
连接永久有效,有学习交流可以一起私聊我学习

你可能感兴趣的:(qt游戏)