基于QT的游戏修改器

本项目是一个可以修改部分游戏的部分数据的。例如:修改自己做的贪吃蛇的得分。

1.h代码

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_QtModifer.h"
#include<Windows.h>
#include<TlHelp32.h>
#include<QDebug>
#include <QMessageBox>
#include<QHeaderView>const DWORD KONEK = 1024;
const DWORD KPAGE = 4 * KONEK;
const DWORD KONEG = KONEK * KONEK * KONEK;class QtModifer : public QMainWindow
{Q_OBJECTpublic:QtModifer(QWidget *parent = Q_NULLPTR);int row = 0;
private:Ui::QtModiferClass ui;/*int row=0;*/HANDLE hProcess;DWORD dwAddrList[4 * KONEK];DWORD dwAddrCount;DWORD dwTargetList[KONEK];DWORD dwTargetCounter;void refreshshow();void openBtnClicked();void searchBtnClicked();void researchBtnCliked();void modifyBtnClicked();/*void ShowAddrList(DWORD *pDwAddrList, DWORD dwAddrCount);*/void FirstRound(HANDLE hProcess, DWORD dwValue, DWORD *pAddrList, DWORD *pAddrListCounter, const DWORD addrListMax);BOOL CompareOnePage(HANDLE hProcess, DWORD dwBaseAddr, DWORD dwValue, DWORD *pAddrList, DWORD *pAddrListCounter, const DWORD addrListMax);void SecondRound(HANDLE hProcess, DWORD dwValue, DWORD *pAddrList, DWORD dwAddrListCounter, DWORD *pTargetList, DWORD *pTargetCounter);
};

2.刷新按钮实现功能(显示所有的进程)

void QtModifer::refreshshow()
{PROCESSENTRY32 pc;pc.dwSize = sizeof(pc);HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);BOOL bMore = Process32First(hProcessSnap, &pc);int i = 0;while (bMore){ui.tableWidget->setRowCount(i + 1);//设置行数ui.tableWidget->setItem(i, 0, new QTableWidgetItem(QString::number(pc.th32ProcessID, 10)));//从DWORD转为QStringui.tableWidget->setItem(i, 1, new QTableWidgetItem(QString::fromWCharArray(pc.szExeFile)));//从WCHAR转为QStringbMore = Process32Next(hProcessSnap, &pc);i++;}CloseHandle(hProcessSnap);
}

3.打开选择的进程功能

void QtModifer::openBtnClicked()
{DWORD dwId = 0;/*DWORD dwSearchValue = 0;DWORD dwAddrList[4 * KONEK] = { 0 };DWORD dwAddrCount = 0;BOOL bRet = FALSE;*//*printf("please input process id which you want to edit:");while (!scanf_s("%u", &dwId)){rewind(stdin);printf("please input again:");}*///printf("\nprocess id = %u\n", dwId);QList<QTableWidgetItem *> items = ui.tableWidget->selectedItems();QTableWidgetItem *itemId = items.at(0);QString procId = itemId->text();dwId = procId.toInt();QTableWidgetItem *itemName= items.at(1);QString procName = itemName->text();ui.lineEdit->setText(procName);hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);if (NULL == hProcess){QString info;info = QString("Open process %1 failed").arg(procName);QMessageBox::information(NULL, "提示", info, QMessageBox::Yes);}else{QString info;info = QString("Open process %1 successful").arg(procName);QMessageBox::information(NULL, "提示", info, QMessageBox::Yes);}
}

4.对比功能

BOOL QtModifer::CompareOnePage(HANDLE hProcess, DWORD dwBaseAddr, DWORD dwValue, DWORD * pAddrList, DWORD * pAddrListCounter, const DWORD addrListMax)
{BYTE byPage[KPAGE] = { 0 };//读一页数据到该数组if (!ReadProcessMemory(hProcess, (LPCVOID)dwBaseAddr, (LPVOID)byPage, KPAGE, NULL)){/*printf("Read Memory error!!!\n");*/return TRUE;}DWORD *pdwPointer = NULL;pdwPointer = (DWORD *)byPage;for (DWORD i = 0; i < KONEK; i++){if (*pAddrListCounter >= addrListMax){/*printf("Too many data, can not save...\n");*/QMessageBox::information(NULL, "提示", "Too many data, can not save...", QMessageBox::Yes);return FALSE;}if (pdwPointer[i] == dwValue){pAddrList[*pAddrListCounter] = dwBaseAddr + i * sizeof(DWORD);ui.tableWidget_2->setRowCount(row + 1);//设置行数QString temp = QString::number(pAddrList[*pAddrListCounter], 16);ui.tableWidget_2->setItem(row, 0, new QTableWidgetItem(temp.toUpper()));//转大写//ui.tableWidget_2->setItem(row, 0, new QTableWidgetItem(QString::number(pAddrList[*pAddrListCounter],16)));//从DWORD转为QString//qDebug() << pAddrList[*pAddrListCounter];(*pAddrListCounter)++;row++;}}return TRUE;
}

5.第一回合对比

void QtModifer::FirstRound(HANDLE hProcess, DWORD dwValue, DWORD *pAddrList, DWORD *pAddrListCounter, const DWORD addrListMax)
{DWORD dwBaseAddr = 64 * KONEK;DWORD dwPageCount = (2 * KONEG - 64 * KONEK * 2) / KPAGE;/*printf("%u pages\n", dwPageCount);printf("Start searching ...\n");*/DWORD dwBeginAddr = dwBaseAddr;for (; dwBaseAddr < 2 * KONEG - 64 * KONEK; dwBaseAddr += KPAGE){if (!CompareOnePage(hProcess, dwBaseAddr, dwValue, pAddrList, pAddrListCounter, addrListMax)){return;}计算进度百分比DWORD page = (dwBaseAddr - dwBeginAddr) / KPAGE + 1;//printf("current is %u page\n", page);//double temp = ((double)page / dwPageCount) * 100;//printf("-----%%%f------\n", temp);ui.progressBar->setMinimum(0);ui.progressBar->setMaximum(dwPageCount);ui.progressBar->setValue(page);}/*printf("\nSearch finished...\n");*//*system("pause");*/
}

6.第一次查找(这里是查找要改的那个值,比如:分数)

void QtModifer::searchBtnClicked()
{DWORD dwSearchValue = 0;dwAddrList[4 * KONEK] = { 0 };dwAddrCount = 0;QString temp = ui.lineEdit_search->text();dwSearchValue = temp.toInt();FirstRound(hProcess, dwSearchValue, dwAddrList, &dwAddrCount, 4 * KONEK);}

7.第二回合对比

void QtModifer::SecondRound(HANDLE hProcess, DWORD dwValue, DWORD * pAddrList, DWORD dwAddrListCounter, DWORD * pTargetList, DWORD * pTargetCounter)
{DWORD dwTemp = 0;row = 0;for (DWORD i = 0; i < dwAddrListCounter; i++){if (ReadProcessMemory(hProcess, (LPCVOID)pAddrList[i], &dwTemp, sizeof(dwTemp), NULL)){if (dwTemp == dwValue){pTargetList[*pTargetCounter] = pAddrList[i];ui.tableWidget_2->setRowCount(row + 1);//设置行数ui.tableWidget_2->setItem(row, 0, new QTableWidgetItem(QString::number(pTargetList[*pTargetCounter], 16)));//从DWORD转为QString(*pTargetCounter)++;row++;}}}
}

8.第二轮查找

void QtModifer::researchBtnCliked()
{/*ui.tableWidget_2->clearContents();*/DWORD dwSecondRoundSearchValue = 0;dwTargetList[KONEK] = { 0 };dwTargetCounter = 0;QString temp = ui.lineEdit_search->text();dwSecondRoundSearchValue = temp.toInt();SecondRound(hProcess, dwSecondRoundSearchValue, dwAddrList, dwAddrCount, dwTargetList, &dwTargetCounter);/*ShowAddrList(dwTargetList, dwTargetCounter);*/
}

9.修改功能

void QtModifer::modifyBtnClicked()
{BOOL bRet = FALSE;DWORD value;QString temp = ui.lineEdit_modify->text();value = temp.toInt();for (DWORD i = 0; i < dwTargetCounter; i++){bRet = WriteProcessMemory(hProcess, (LPVOID)dwTargetList[i], &value, sizeof(value), NULL);if (bRet){/*printf("Edit Success!!!\n");*/QMessageBox::information(NULL, "提示", "edit Success!!!", QMessageBox::Yes);}else{QMessageBox::information(NULL, "提示", "edit fail!!!", QMessageBox::Yes);}}
}

10.全部.cpp代码

#include "QtModifer.h"
#pragma execution_character_set("utf-8")//解决乱码问题QtModifer::QtModifer(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);resize(560, 620);this->setWindowTitle("游戏修改器");ui.tableWidget->setColumnCount(2);ui.tableWidget_2->setColumnCount(1);QStringList headers;headers << "PID" << "ProcessName";ui.tableWidget->setHorizontalHeaderLabels(headers);//设置表头ui.tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);ui.tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);ui.tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);//一次选中一行QStringList headers2;headers2 << "地址";ui.tableWidget_2->setHorizontalHeaderLabels(headers2);ui.tableWidget_2->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);ui.tableWidget_2->horizontalHeader()->setStretchLastSection(true);ui.tableWidget_2->setSelectionBehavior(QAbstractItemView::SelectRows);/*refreshshow();*/connect(ui.refreshbtn, &QPushButton::clicked, this, &QtModifer::refreshshow);connect(ui.openbtn, &QPushButton::clicked, this, &QtModifer::openBtnClicked);connect(ui.searchbtn, &QPushButton::clicked, this, &QtModifer::searchBtnClicked);connect(ui.researchbtn, &QPushButton::clicked, this, &QtModifer::researchBtnCliked);connect(ui.modifybtn, &QPushButton::clicked, this, &QtModifer::modifyBtnClicked);ui.progressBar->setValue(0);
}void QtModifer::refreshshow()
{PROCESSENTRY32 pc;pc.dwSize = sizeof(pc);HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);BOOL bMore = Process32First(hProcessSnap, &pc);int i = 0;while (bMore){ui.tableWidget->setRowCount(i + 1);//设置行数ui.tableWidget->setItem(i, 0, new QTableWidgetItem(QString::number(pc.th32ProcessID, 10)));//从DWORD转为QStringui.tableWidget->setItem(i, 1, new QTableWidgetItem(QString::fromWCharArray(pc.szExeFile)));//从WCHAR转为QStringbMore = Process32Next(hProcessSnap, &pc);i++;}CloseHandle(hProcessSnap);
}void QtModifer::openBtnClicked()
{DWORD dwId = 0;/*DWORD dwSearchValue = 0;DWORD dwAddrList[4 * KONEK] = { 0 };DWORD dwAddrCount = 0;BOOL bRet = FALSE;*//*printf("please input process id which you want to edit:");while (!scanf_s("%u", &dwId)){rewind(stdin);printf("please input again:");}*///printf("\nprocess id = %u\n", dwId);QList<QTableWidgetItem *> items = ui.tableWidget->selectedItems();QTableWidgetItem *itemId = items.at(0);QString procId = itemId->text();dwId = procId.toInt();QTableWidgetItem *itemName= items.at(1);QString procName = itemName->text();ui.lineEdit->setText(procName);hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);if (NULL == hProcess){QString info;info = QString("Open process %1 failed").arg(procName);QMessageBox::information(NULL, "提示", info, QMessageBox::Yes);}else{QString info;info = QString("Open process %1 successful").arg(procName);QMessageBox::information(NULL, "提示", info, QMessageBox::Yes);}
}BOOL QtModifer::CompareOnePage(HANDLE hProcess, DWORD dwBaseAddr, DWORD dwValue, DWORD * pAddrList, DWORD * pAddrListCounter, const DWORD addrListMax)
{BYTE byPage[KPAGE] = { 0 };//读一页数据到该数组if (!ReadProcessMemory(hProcess, (LPCVOID)dwBaseAddr, (LPVOID)byPage, KPAGE, NULL)){/*printf("Read Memory error!!!\n");*/return TRUE;}DWORD *pdwPointer = NULL;pdwPointer = (DWORD *)byPage;for (DWORD i = 0; i < KONEK; i++){if (*pAddrListCounter >= addrListMax){/*printf("Too many data, can not save...\n");*/QMessageBox::information(NULL, "提示", "Too many data, can not save...", QMessageBox::Yes);return FALSE;}if (pdwPointer[i] == dwValue){pAddrList[*pAddrListCounter] = dwBaseAddr + i * sizeof(DWORD);ui.tableWidget_2->setRowCount(row + 1);//设置行数QString temp = QString::number(pAddrList[*pAddrListCounter], 16);ui.tableWidget_2->setItem(row, 0, new QTableWidgetItem(temp.toUpper()));//转大写//ui.tableWidget_2->setItem(row, 0, new QTableWidgetItem(QString::number(pAddrList[*pAddrListCounter],16)));//从DWORD转为QString//qDebug() << pAddrList[*pAddrListCounter];(*pAddrListCounter)++;row++;}}return TRUE;
}void QtModifer::FirstRound(HANDLE hProcess, DWORD dwValue, DWORD *pAddrList, DWORD *pAddrListCounter, const DWORD addrListMax)
{DWORD dwBaseAddr = 64 * KONEK;DWORD dwPageCount = (2 * KONEG - 64 * KONEK * 2) / KPAGE;/*printf("%u pages\n", dwPageCount);printf("Start searching ...\n");*/DWORD dwBeginAddr = dwBaseAddr;for (; dwBaseAddr < 2 * KONEG - 64 * KONEK; dwBaseAddr += KPAGE){if (!CompareOnePage(hProcess, dwBaseAddr, dwValue, pAddrList, pAddrListCounter, addrListMax)){return;}计算进度百分比DWORD page = (dwBaseAddr - dwBeginAddr) / KPAGE + 1;//printf("current is %u page\n", page);//double temp = ((double)page / dwPageCount) * 100;//printf("-----%%%f------\n", temp);ui.progressBar->setMinimum(0);ui.progressBar->setMaximum(dwPageCount);ui.progressBar->setValue(page);}/*printf("\nSearch finished...\n");*//*system("pause");*/
}void QtModifer::searchBtnClicked()
{DWORD dwSearchValue = 0;dwAddrList[4 * KONEK] = { 0 };dwAddrCount = 0;QString temp = ui.lineEdit_search->text();dwSearchValue = temp.toInt();FirstRound(hProcess, dwSearchValue, dwAddrList, &dwAddrCount, 4 * KONEK);}void QtModifer::SecondRound(HANDLE hProcess, DWORD dwValue, DWORD * pAddrList, DWORD dwAddrListCounter, DWORD * pTargetList, DWORD * pTargetCounter)
{DWORD dwTemp = 0;row = 0;for (DWORD i = 0; i < dwAddrListCounter; i++){if (ReadProcessMemory(hProcess, (LPCVOID)pAddrList[i], &dwTemp, sizeof(dwTemp), NULL)){if (dwTemp == dwValue){pTargetList[*pTargetCounter] = pAddrList[i];ui.tableWidget_2->setRowCount(row + 1);//设置行数ui.tableWidget_2->setItem(row, 0, new QTableWidgetItem(QString::number(pTargetList[*pTargetCounter], 16)));//从DWORD转为QString(*pTargetCounter)++;row++;}}}
}
void QtModifer::researchBtnCliked()
{/*ui.tableWidget_2->clearContents();*/DWORD dwSecondRoundSearchValue = 0;dwTargetList[KONEK] = { 0 };dwTargetCounter = 0;QString temp = ui.lineEdit_search->text();dwSecondRoundSearchValue = temp.toInt();SecondRound(hProcess, dwSecondRoundSearchValue, dwAddrList, dwAddrCount, dwTargetList, &dwTargetCounter);/*ShowAddrList(dwTargetList, dwTargetCounter);*/
}void QtModifer::modifyBtnClicked()
{BOOL bRet = FALSE;DWORD value;QString temp = ui.lineEdit_modify->text();value = temp.toInt();for (DWORD i = 0; i < dwTargetCounter; i++){bRet = WriteProcessMemory(hProcess, (LPVOID)dwTargetList[i], &value, sizeof(value), NULL);if (bRet){/*printf("Edit Success!!!\n");*/QMessageBox::information(NULL, "提示", "edit Success!!!", QMessageBox::Yes);}else{QMessageBox::information(NULL, "提示", "edit fail!!!", QMessageBox::Yes);}}
}

11.main函数

#include "QtModifer.h"
#include <QtWidgets/QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);QtModifer w;w.show();return a.exec();
}

运行界面


使用方法:

1.先打开贪吃蛇游戏(也可以用其他小游戏,一般来说选自己做的,因为免得打不开)。
2.运行程序,点击刷新按钮。
3.鼠标选择贪吃蛇程序,点击打开按钮。
4.将贪吃蛇游戏玩到分数等于10(也可以是其他分数),在第一个输入框输入10,点击查找按钮。
5.再将贪吃蛇游戏玩到20(也可以是其他的,但是要跟第一次查找的分数不一样),点击二次查找按钮。
6.再第二个输入框输入想要改变的值,比如我这里想把分数改为10000.点击修改按钮。
7.再玩一下贪吃蛇游戏,发现分数改变,修改成功。
8.注意:我的贪吃蛇是按空格可以暂停的,修改之后,再按空格就会继续运行。

该项目还有很多不足,望指正共勉!

基于QT的游戏修改器相关推荐

  1. 基于Qt的音乐播放器(二)切换歌曲,调节音量,调节语速,暂停

    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 文章目录 1.切换歌曲 2.调节音量 3.调节语速 4.播放/暂停 5.我们来看下效果 6.关于上一篇提 ...

  2. 手把手教你写游戏修改器(终极版)

    关于怎样写植物大战僵尸游戏修改器的详细过程,在手把手教你写游戏修改器里面已经详细介绍了,这里就不再说了.前面那个修改器是基于控制台程序下面的,紧紧对于植物大战僵尸有用,采用上面那个教程已经将游戏修改器 ...

  3. zz .Net 实现游戏修改器

    .Net 实现游戏修改器 前不久玩植物大战僵尸,不停地玩啊玩,也通关了,准备开始享受一下IMBA的感觉."玩玩小游戏"模式中有关"谁笑到最后",一来就有5000 ...

  4. 利用cheat engine以及VC编写游戏修改器

    cheat engine的介绍已经完毕了,下面就是怎么使用它的问题,这里写一个稍微有意思一点的,也有实际用途的话题,就是来编写自己的游戏修改器. 这篇文章参考了http://www.pediy.com ...

  5. 打造自己的游戏修改器和内存补丁

    相信很多人打游戏的时候都用修改器,这里我介绍怎样用VB编写修改器. 1.其实修改器原理很简单,一般来说,在游戏运行的时候我们对游戏内存空间中必要的数据进行修改就可以了.举个例子来说,一款拳皇模拟器里游 ...

  6. 关于烧饼游戏修改器的分析

    一.前言 烧饼游戏修改器是一款元老级的游戏修改器,提供了精确搜索.模糊搜索.联合搜索.数据过滤.存储搜索与读取搜索等功能.主要实现搜索手机进程的内存数据并做相应修改. 本文中分析的版本为2.0.2(3 ...

  7. 为英雄无敌3写个游戏修改器

    我是比较铁杆的英雄无敌3的fans,在网上看到这样的文章:http://game.china.com/zh_cn/play/10002765/20021113/11362720.html 就是让我方英 ...

  8. 基于QT的简陋视频播放器

    基于QT的简陋播放器 看图(恒简陋): 一.实现的功能 (1)进度条的实现(不可拖动,旁边的时间栏也没写): (2)播放.暂停.打开.关闭按钮的实现: (3)图中关闭按钮旁边的Label组件显示当前播 ...

  9. 掀开高级游戏黑客的面纱,教你打造游戏修改器

    本文出在  轻描淡写编程论坛「  http://www.luocong.com/bbs 」 作者:CrackYY  掀开高级游戏黑客的面纱,教你打造游戏修改器 工具:SoftICE.金山游侠2002. ...

最新文章

  1. Western Subregional of NEERC, Minsk, Wednesday, November 4, 2015 Problem G. k-palindrome dp
  2. bzoj 2962 序列操作
  3. Faster R-CNN论文笔记——FR
  4. 201126阶段二单例数据库及MVC设计模式
  5. 几个方便编程的C++特性
  6. 把Springboot项目部署到服务器上和结束运行
  7. 幕乔美化版音乐网站源码
  8. sicily 1002. Anti-prime Sequences
  9. 前端性能优化—js代码打包 1
  10. 数学分析原理 定理 6.8
  11. VGG11、VGG13、VGG16、VGG19网络结构图
  12. 对抗样本(五)DeepFool
  13. VMwarenbsp;vSpherenbsp;ESXiamp;nb…
  14. Javascript的事件驱动
  15. d3.js 刷新折线图(包括坐标轴及路径的刷新及信息点提示)
  16. Windows10创建还原点备份系统(解决类似网络重置网卡错误代码56问题!!!)
  17. 赠与今年的大学毕业生
  18. 违法?猝死?你肯定不知道程序员还有这些“高危”操作
  19. Excel数据导入到hbase实战
  20. Jeeweb 中shiro验证码启用问题

热门文章

  1. 汽修第5天 升降玻璃的维修
  2. html大段文本如何分页,打印大型HTML表时如何处理分页符
  3. .net/C# 实现汉字到拼音转换
  4. Trident API
  5. 2021年度训练联盟热身训练赛第三场——C,G,I
  6. 个人如何办理注册商标
  7. ArcMap-network analyst
  8. 面向全球用户的Teams app之时区篇
  9. Excel改变了你的基因名,30% 相关Nature文章受影响,NCBI也受波及
  10. 服务器系统raid设置,服务器RAID配置详解