知识来源于腾讯课堂易道云
前置知识:3.游戏中自定义数据类型的解读分析
首先使用Visual Studio创建一个控制台项目,然后再设置一些项目属性,如果不设置下面的属性那么我们的程序没有权限访问其它进程,下面可以理解为是开启管理员模式
根据上体开启管理员之后再运行Visual Studio时会提示下图的弹框选择红框里的使用其他凭据重新启动,等待Visual Studio重启完就可以运行我们的程序了
效果图:
使用任务管理器找pid
代码:用到的api是ReadProcessMemory根据进程句柄读取进程的内存区域
#include <iostream>
#include <Windows.h>
struct Role
{
int unknown1[4];
int hp;
int maxHp;
int tiLi;
int maxTiLi;
int mp;
int maxMp;
int gongJiLi;
int fangYu;
int shenFa;
int dengJi;
int unknown2;
int jingYan;
int shengJi;
int yiDongSuDu;
int unknown3;
int mianXiang;
int unknown4[2];
int xZuoBiao;
int yZuoBiao;
int unknown5[36];
char name[0x20];
};
HANDLE hProcecss;
BOOL ReadInt(unsigned address, Role* role) {
int value{};
SIZE_T readByte{};
BOOL retData = ReadProcessMemory(hProcecss,(LPCVOID)address, (LPVOID)role,sizeof(Role), &readByte);
return retData;
}
int main()
{
DWORD Pid;
Role role;
linput:
std::cout << "请输入游戏进程ID:";
std::cin >> Pid;
hProcecss = OpenProcess(PROCESS_ALL_ACCESS, FALSE, Pid);
if (hProcecss) {
while (true)
{
if (ReadInt(0x4CEF08, &role)) {
system("cls");
std::cout << "角色名:[" << role.name << "]" << std::endl;
std::cout << "等级:[" << role.dengJi << "]" << std::endl;
std::cout << "生命值:[" << role.hp << "/" << role.maxHp << "]" << std::endl;
std::cout << "坐标:[" << role.xZuoBiao << ", " << role.yZuoBiao << "]" << std::endl;
Sleep(100);
}
else {
std::cout << "内存读取失败";
break;
}
}
}
else {
std::cout << "打开游戏进程失败";
goto linput;
}
}