MemUtils
大约 1 分钟cpp
#include <iostream>
#include <Windows.h>
// 内存操作工具类
/*
* 通过窗口类(lpClassName),窗口标题(lpWindowName)获取进程句柄并返回
*/
HANDLE getProcessHandle(LPCSTR lpClassName, LPCSTR lpWindowName) {
HWND gameWindowHwnd = 0;
DWORD pid, tid;
HANDLE processHandle;
// 获取窗口句柄
//gameWindowHwnd = FindWindowA("MainWindow", "植物大战僵尸中文版");
gameWindowHwnd = FindWindowA(lpClassName, lpWindowName);// 获取窗口句柄
// 使用窗口句柄获取 pid,tid
tid = GetWindowThreadProcessId(gameWindowHwnd, &pid);
// 使用 pid 获取进程句柄
processHandle = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
return processHandle;
}
/*
* 读取指定地址的内存数据,返回读取到的4字节数据
* hProcess: 进程句柄
* addr:要访问的地址
* 使用案例:
* 多次偏移读取到目标属性的直接地址,返回的 addr 是直接地址,使用方法如下:
* UINT_PTR addr = read4(gameProcessHandle, read4(gameProcessHandle, 0x006A9EC0) + 0x768) + 0x5560;
*/
unsigned int read4(HANDLE hProcess,UINT_PTR addr) {
// 使用进程句柄读取游戏数据
unsigned int readBuff = 0;
ReadProcessMemory(hProcess, (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;
}
/*
* 向指定进程句柄指定内存地址写入数据
* hProcess:进程句柄
* lpBaseAddress:内存地址
* lpBuffer:写入的数据
* 使用案例:
* UINT_PTR addr = xxx;
* int newVal = 200;
* int retWrite = write4(gameProcessHandle, (LPVOID)addr, (LPCVOID)newVal);
* 最后一个参数也可以写直接数 int retWrite = write4(gameProcessHandle, (LPVOID)addr, (LPCVOID)200);
*/
int write4(HANDLE hProcess, LPVOID lpBaseAddress, LPCVOID lpBuffer) {
return WriteProcessMemory(hProcess, (LPVOID)lpBaseAddress, &lpBuffer, sizeof(lpBuffer), NULL);
}
