写点什么

记录一次基于 Qt 的内存数据修改工具开发

用户头像
星河寒水
关注
发布于: 50 分钟前
记录一次基于Qt的内存数据修改工具开发

近期遇上某些老软件,软件是 C/S 架构,客户端却把服务器 IP 写死了,而且找不到源码和开发者了,故想到用修改内存数据的方式改变服务器 IP,使其在变换网络环境条件后可正常使用。

一、利用 Cheat Engine(CE)找到需要修改的相对地址

1、打开客户端进程,选择 String 类型,输入客户端定死的服务器 IP


2、点击 First Scan 后,把所有找到的值修改成新的服务器 IP

3、客户端按业务流程操作,继续搜索,直到把所有业务流程走完。

将涉及到的地址,其对应值都修改成新的 IP,此处以修改成 192.168.111.128 为例,修改后客户端连接使用正常。

二、基于 QT 编写服务器 IP 自动修改工具

通过 CE 工具修改,虽说能够正常使用,但是对于用户的交互体验极其不友好,对于不熟悉 CE 的人更是如此,所以产生编写自动修改工具的想法。

1、设计简单 UI

放置一个输入框,两个按钮,如下图。


2、编写简易界面交互逻辑

void MainWindow::on_pushButton_clicked(){    isStop = false;    ui->lineEdit->setDisabled(true);    ui->pushButton->setDisabled(true);    ui->pushButton->setText("运行中...");    // 开始检测并修改内存    readAndWriteProcess();}
void MainWindow::on_pushButton_2_clicked(){ // 停止检测与修改内存 isStop = true; ui->lineEdit->setDisabled(false); ui->pushButton->setDisabled(false); ui->pushButton->setText("启动");}
复制代码

3、读取 INI 格式配置文件

为了避免每次启动后都需要重新输入新的 IP,我们使用 QSettings 来读取 INI 文件。

void MainWindow::readConfigIni(){    QSettings settingsread("YourIni.ini",QSettings::IniFormat);    QString ipToSet = settingsread.value("config/ip").toString();    ui->lineEdit->setText(ipToSet);}
复制代码

4、检测与内存数据修改

bool isStop = false, isFindProcess = false;int addrToModify[4] = {    0x00a015bc,    0x009e3b30,    0x009e3b7c,    0x00a015fc};
void cmp_write(HANDLE hProcess, string newValue, int index){ char tmp[15]; memset(tmp,0,15); LPCVOID loginIpAddressRead = (LPCVOID)addrToModify[index]; ReadProcessMemory(hProcess, loginIpAddressRead, &tmp, 15, 0); if(strcmp(tmp,newValue.c_str())) { char newIP[15]; strcpy(newIP, newValue.c_str()); LPVOID loginIpAddressWrite = (LPVOID)addrToModify[index]; WriteProcessMemory(hProcess, loginIpAddressWrite, &newIP, 15, 0); }}
void MainWindow::readAndWriteProcess(){ HANDLE hpro = NULL; PROCESSENTRY32 pe32 = { 0 }; pe32.dwSize = sizeof(pe32);
HANDLE hprocess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); BOOL res = Process32First(hprocess, &pe32); while (res) { if (wcscmp(L"YourExe.exe", pe32.szExeFile) == 0) { hpro = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID); isFindProcess = true; break; } res = Process32Next(hprocess, &pe32); } string newIP = ui->lineEdit->text().toStdString(); while(isFindProcess) { for (int i = 0; i < 4; ++i) { cmp_write(hpro, newIP, i); } // 使用以下延时形式防止界面假死 QEventLoop eventloop; QTimer::singleShot(200, &eventloop, SLOT(quit())); eventloop.exec(); if (isStop) { break; } }}
复制代码

结语

QT 项目代码已经上传至 gitee

项目链接qtModMem: 修改指定名字进程内存数据的一个QT示例项目

参考资料

直接修改内存数据_liuguangsh的博客-CSDN博客

ReadProcessMemory function (memoryapi.h) - Win32 apps | Microsoft Docs

ReadProcessMemory如何读字符串-CSDN论坛

给Qt程序添加管理员权限总结(一定有你没见过的方式)_百里杨的博客-CSDN博客

qt延时之界面“假死”问题_weifu的qt学习之路-CSDN博客

VS+Qt应用开发-发布Release程序打包发布_羽士的博客-CSDN博客

用户头像

星河寒水

关注

还未添加个人签名 2018.09.17 加入

还未添加个人简介

评论

发布
暂无评论
记录一次基于Qt的内存数据修改工具开发