如何通过WriteProcessMemory实现目标程序内存值与用户输入值叠加写入
错误原因
你的代码不生效的核心问题是混淆了指针运算和数值运算:&baseAddress是baseAddress变量在你当前程序内存中的地址,对这个地址做+ value操作属于指针偏移,得到的是你本地进程里的一个无效野地址,根本不是你计算后要写入的数值,传入WriteProcessMemory自然无法得到预期结果。
实现逻辑
要给目标进程的内存值做增量叠加,不能在写内存的传参阶段直接做地址偏移计算,必须按固定三步执行:
- 先读取目标进程对应内存地址中存储的原始数值
- 在你自己的程序内存空间内,把原始值和用户输入的增量做加法,得到最终要写入的新值
- 把计算完成的新值回写到目标进程的对应内存地址
参考实现代码
注意读写时使用的变量类型要和目标内存存储的数值类型保持一致,以下以最常见的4字节int类型数值为例:
#include <windows.h> #include <iostream> using namespace std; int main() { // 假设你已经拿到了合法的进程句柄processHandle、目标数值地址pointsAddress HANDLE processHandle = /* 你的现有进程句柄 */; LPVOID pointsAddress = /* 你的现有目标内存地址 */; int originalValue = 0; int inputDelta = 0; // 第一步:读取目标地址当前的原始值 BOOL readRet = ReadProcessMemory( processHandle, pointsAddress, &originalValue, sizeof(originalValue), NULL ); if (!readRet) { cout << "读取内存失败,错误码:" << GetLastError() << endl; CloseHandle(processHandle); return 1; } // 第二步:获取用户输入的增量,计算最终写入值 cout << "请输入要叠加的数值:"; cin >> inputDelta; int newValue = originalValue + inputDelta; // 第三步:把新值写回目标内存 BOOL writeRet = WriteProcessMemory( processHandle, pointsAddress, &newValue, sizeof(newValue), NULL ); if (!writeRet) { cout << "写入内存失败,错误码:" << GetLastError() << endl; CloseHandle(processHandle); return 1; } cout << "修改完成,原始值:" << originalValue << ",叠加后值:" << newValue << endl; CloseHandle(processHandle); return 0; }
常见踩坑点
- 打开目标进程句柄时必须申请
PROCESS_VM_READ和PROCESS_VM_WRITE权限,否则读写操作会直接被系统拦截 - 读写长度必须和目标内存存储的数值类型完全匹配:如果目标存的是4字节单精度浮点数就用
float类型,是8字节长整数就用long long类型,不要硬编码读写长度为4,用sizeof(对应变量)可以自动适配类型长度,避免长度不匹配导致的数值错乱 - 读原值时一定要传入你最终要修改的目标内存地址(也就是写操作时用的
pointsAddress),不要误读成进程基址或者其他无关地址的值,否则叠加计算的结果完全错误 - 如果目标程序开启了内核级内存保护、或者目标地址属于只读内存页,写入操作会失败,可以通过
GetLastError()返回的错误码定位具体原因
内容的提问来源于stack exchange,提问作者user16940272
相关产品推荐
相关产品推荐

