编程使用偏移地址
大约 2 分钟cpp
读取内存数据
读取为字符串
下面的方法只能读取为英文,如果含有中文则需要借助 utf8
printf("内存地址0xC79D18的字符串:%s\r\n",(char*)0xC79D18);
加载进程名称内存地址
在CE中常常见到类似 wow.exe+0x879D18 类似的地址,编程中使用为:
LoadLibraryA("wow.exe")+0x879D18
基址+偏移
编程使用游戏中找到的偏移量
#include <iostream>
#include <Windows.h>
// 全局变量
HWND gameWindowHwnd = 0;// 游戏窗口句柄
DWORD pid, tid;// 游戏 pid,tid.十进制数字
HANDLE processHandle;// 游戏进程句柄
// 下面的基址和偏移是180天翼云盘家庭共享目录下:教程与资料 > 郁金香2021 > 用到的工具 > 用到的游戏和工具 下的 “GMEPlantsVsZombie练习用”
// 中的数据,已经验证正确
UINT_PTR BASE_ADDR = 0x006A9EC0;
UINT_PTR OFFSET01 = 0x768;
UINT_PTR OFFSET02 = 0x5560;
// 获取游戏进程句柄
int init() {
// 获取窗口句柄
gameWindowHwnd = FindWindowA("MainWindow", "植物大战僵尸中文版");
printf("游戏窗口句柄:%p\r\n", gameWindowHwnd);
// 使用窗口句柄获取 pid,tid
tid = GetWindowThreadProcessId(gameWindowHwnd, &pid);
printf("十进制:\r\ntid=%d,pid=%d\r\n", tid, pid, pid);
printf("十六进制:\r\ntid=%X,pid=%X\r\n", tid, pid, pid);
// 使用 pid 获取进程句柄
processHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
printf("游戏进程句柄:%d\r\n", processHandle);
return 1;
}
// 读取指定内存地址的4字节数据
unsigned int read(UINT_PTR addr) {
// 使用进程句柄读取游戏数据
unsigned int readBuff = 0;
ReadProcessMemory(processHandle, (LPCVOID)addr, &readBuff, 4, 0);
printf("从地址:%d(十进制),%X(十六进制) 读取到的4字节数据的\r\n16进制,10进制,无符号数据依次是:%X,%d,%u\r\n", addr, addr, readBuff, readBuff, readBuff);// 如果读取过程出错使用 GetLastError() 获取并处理
return readBuff;
}
int main()
{
int ret = init();
if (ret == 1)
printf("辅助初始化成功!");
else
printf("辅助初始化失败!!!");
printf("\r\n");
// 0x182F92E0 是阳光的内存地址,基址+偏移公式是:
// [[PlantsVsZombie.exe+2A9EC0]+768]+5560 = [[006A9EC0]+768]+5560
// 上面计算 PlantsVsZombie.exe+2A9EC0 = 006A9EC0 的方法是将其黏贴到CE中
read(read(read(BASE_ADDR) + OFFSET01) + OFFSET02);
system("pause");
}
