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

代码运行报错求助:update_memblock函数及MEMBLOCK结构问题排查

排查update_memblock函数的错误问题

我来帮你一步步梳理这个函数里可能存在的问题,结合你的代码和MEMBLOCK结构体定义,先列几个最容易触发错误的关键点:

1. 核心参数的有效性未做检查

你当前的代码直接使用mb里的所有字段,但这些字段很可能是无效的,这是最常见的错误来源:

  • 进程句柄mb->hProc:确保它是通过OpenProcess获取的,并且请求了PROCESS_VM_READ权限。如果句柄无效(比如进程已退出、权限不足),ReadProcessMemory会直接失败。
  • 目标地址mb->addr:必须是目标进程中合法且可读取的内存地址。如果是野指针、未分配的内存区域,或者你没有权限访问该区域,都会触发内存访问错误。
  • 缓冲区mb->buffer:你必须在调用update_memblock之前,提前分配至少mb->size大小的内存空间。如果mb->buffer是NULL,或者分配的空间小于需要读取的大小,memcpy的时候就会发生越界写入,直接触发访问违规。

2. ReadProcessMemory的错误处理严重缺失

你现在只判断了bytes_read != bytes_to_read就退出循环,但完全没处理函数调用失败的情况。建议调用后立即检查返回值,并获取错误码:

if (!ReadProcessMemory(mb->hProc, mb->addr + total_read, tempbuf, bytes_to_read, (DWORD*)&bytes_read)) {
    DWORD err_code = GetLastError();
    // 这里可以打印err_code,或者根据错误码做针对性处理
    // 比如错误码299表示部分读取,错误码5表示权限不足,错误码1400表示无效窗口/进程
    break;
}

通过GetLastError()的返回值,你能精准定位是权限问题、地址问题还是进程状态问题。

3. 变量类型不匹配的隐患

你的MEMBLOCK结构体里size是int类型,但ReadProcessMemory的相关参数(比如读取大小)是SIZE_T(无符号整数类型)。如果mb->size是负数,或者超过了int的取值范围(32位系统下int最大为2GB),会导致计算逻辑出错。建议把size字段改成SIZE_T或者unsigned int,保持和其他变量类型一致:

typedef struct _MEMBLOCK {
    HANDLE hProc;
    unsigned char *addr;
    SIZE_T size;  // 替换原有的int类型
    unsigned char *buffer;
    struct _MEMBLOCK *next;
} MEMBLOCK;

4. 静态缓冲区tempbuf的线程安全问题

你用了static unsigned char tempbuf[128 * 1024];,静态数组是全局共享的。如果你的程序是多线程环境,多个线程同时调用update_memblock会出现数据竞争,导致读取的数据混乱。如果是单线程场景还好,多线程的话建议改成动态分配:

unsigned char* tempbuf = (unsigned char*)malloc(128 * 1024);
if (!tempbuf) {
    // 内存分配失败处理
    return;
}
// 用完后释放
free(tempbuf);

最后结合错误截图的补充建议

如果Visual Studio提示的是Access Violation(访问违规),优先检查mb->buffer是否分配足够内存、mb->addr是否为合法地址;如果是函数调用失败,就用GetLastError()获取具体错误码来定位。

内容的提问来源于stack exchange,提问作者Total Anime Immersion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:55:26