You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:16:02