跳至主要內容

编程使用偏移地址

chanchaw大约 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");
}