先看下我们的界面,很简单,就一个复选框选中即为全部方框无冷却,没选中则恢复冷却。方框里输入数字,点击按钮可以修改阳光
一、需要用到的函数以及参数获取
用的是常见的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窗体
然后添加控件
上面我们说过还要获取,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);
选择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);
}
这样就可以编译运行看看阳光是否可以修改了。
接下来是无冷却
编译器带我们转到了这里,然后写下函数
//无冷却复选框被单击
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函数,就是我们刚刚上面的操作转到槽,系统帮我们自动生成的。
然后在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);
}
}
结尾是代码打包,
我只打包了cpp,和h文件,代码量很少
你们如果看不懂直接下载我这个,
然后自己新建项目把我函数里的代码复制进去就行了
链接: https://pan.baidu.com/s/1cl-jwIyPUj5n0E1P8PaFMA
提取码: 36mt
连接永久有效,有学习交流可以一起私聊我学习