知识来源于腾讯课堂易道云
前置知识:3.游戏中自定义数据类型的解读分析
首先使用Visual Studio创建一个控制台项目,然后再设置一些项目属性,如果不设置下面的属性那么我们的程序没有权限访问其它进程,下面可以理解为是开启管理员模式
根据上体开启管理员之后再运行Visual Studio时会提示下图的弹框选择红框里的使用其他凭据重新启动,等待Visual Studio重启完就可以运行我们的程序了
效果图:
使用任务管理器找pid
代码:用到的api是ReadProcessMemory根据进程句柄读取进程的内存区域
#include#include 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; } }
还没有评论,来说两句吧...