[英]ReadProcessMemory _out_ bytesread
该程序使用ReadProcessMemory
扫描内存块中的某个值。 不幸的是,当我调用ReadProcessMemory
时,出现错误299。
void update_memblock(MEMBLOCK *mb)
{
//variables
static unsigned char tempbuf[128*1024];
size_t bytes_left;
size_t total_read;
size_t bytes_to_read;
size_t bytes_read;
size_t sizeMem;
size_t MemoryBase;
bytes_left = mb->size;
total_read = 0;
while (bytes_left)
{
bytes_to_read = (bytes_left > sizeof(tempbuf)) ? sizeof(tempbuf) : bytes_left;
ReadProcessMemory(mb->hProc ,mb->addr + total_read,mb->buffer, bytes_to_read, (SIZE_T*)&bytes_read);
if (bytes_read != bytes_to_read)break;
memcpy(mb->buffer + total_read, tempbuf,bytes_read);
bytes_left -= bytes_read;
total_read += bytes_read;
}
mb->size = total_read;
}
错误代码299(0x12B)ERROR_PARTIAL_COPY“仅ReadProcessMemory或WriteProcessMemory请求的一部分已完成”
之所以收到此错误,是因为您试图从未“分配”的页面读取内存。
您想在内存的每一页上使用VirtualQueryEx() ,这将产生一个MEMORY_BASIC_INFORMATION结构,其中包含2个注释变量:
状态:可以是MEM_COMMIT,MEM_FREE或MEM_RESERVE保护:可以是任何内存保护常量
您要遍历内存的所有页面,在它们上调用VirtualQueryEx()并跳过任何不好的页面。 我喜欢跳过状态为!= MEM_COMMIT和保护== PAGE_NOACCESS的所有页面/区域
这是一个伪代码示例:
MEMORY_BASIC_INFORMATION mbi = { 0 };
while (LoopingThroughTheMemories.bat)
{
if (!VirtualQueryEx(hProc, currentMemoryAddress, &mbi, sizeof(mbi))) continue
if (mbi.State != MEM_COMMIT || mbi.Protect == PAGE_NOACCESS) continue;
//good mem region, do ReadProcessMemory() stuffs
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.