代码运行报错求助: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

