使用ReadProcessMemory/WriteProcessMemory时缓冲区值异常回退的问题
拆解你的C++进程内存读写异常问题
嘿,这个问题确实有点让人摸不着头脑,我来帮你梳理几个最可能导致缓冲区“自动变回旧值”的原因:
1. WriteProcessMemory参数顺序搞反了(高频踩坑点!)
这绝对是最常见的原因!WriteProcessMemory的参数顺序很容易搞混:
正确的函数签名是:
BOOL WriteProcessMemory( HANDLE hProcess, LPVOID lpBaseAddress, // 目标进程的内存地址(要写的地方) LPCVOID lpBuffer, // 你的缓冲区(要写入的新值) SIZE_T nSize, SIZE_T *lpNumberOfBytesWritten );
如果你不小心把lpBaseAddress和lpBuffer的位置搞反了,比如写成:
WriteProcessMemory(hProcess, myBuffer, targetAddress, sizeof(int), NULL);
这就会把目标进程里的旧值(targetAddress指向的内容)写入到你的缓冲区myBuffer里,直接把你刚修改的新值覆盖回旧值!这种错误太容易犯了,赶紧检查下你的代码参数顺序。
2. 缓冲区被内存越界操作意外覆盖
如果你的缓冲区是栈上的局部变量,很容易因为越界读写被“误伤”:
- 调用
ReadProcessMemory时,nSize参数填大了,比如要读4字节的int,却填了8字节,导致读取操作越界,覆盖了栈上缓冲区附近的其他变量,甚至反过来影响缓冲区本身; - 代码里其他地方有数组越界、野指针赋值的情况,不小心蹭到了缓冲区的内存地址。
比如你定义了int buf;,但ReadProcessMemory的nSize传了sizeof(int)*2,而目标进程中test变量后面的内存恰好有数据,就可能导致栈上的buf被意外修改。
3. 无意识的重复读取操作
会不会在你修改缓冲区值、调用WriteProcessMemory之前,代码里不小心又跑了一次ReadProcessMemory?比如:
- 循环逻辑里的条件判断出错,导致读取操作被重复触发;
- 函数调用顺序混乱,把读取代码写在了修改缓冲区之后、写入之前,又把旧值重新读回了缓冲区。
建议你加几个调试输出,比如在修改缓冲区后、写入前打印缓冲区的值,看看是不是被偷偷改回去了。
4. 目标进程的内存地址失效
你提供的目标进程代码里,test是main函数的局部变量,一旦main执行完cout就退出了,进程结束后之前获取的test地址就失效了。这时候再读写的话,操作系统可能把这块内存重新分配给其他进程,导致读写结果完全不可预测——包括缓冲区的值被莫名其妙篡改。
如果是这种情况,给目标进程加个阻塞逻辑就行,比如:
// 在cout之后加个循环,让进程保持运行 while (true) { Sleep(1000); // 需要包含<windows.h> }
内容的提问来源于stack exchange,提问作者Zamar
相关产品推荐
相关产品推荐

