【问题标题】:ReadProcessMemory _out_ bytesreadReadProcessMemory _out_ bytesread
【发布时间】:2016-01-30 23:07:37
【问题描述】:

程序使用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;
}

【问题讨论】:

  • “仅完成了 ReadProcessMemory 或 WriteProcessMemory 请求的一部分。” -msdn.microsoft.com/en-us/library/windows/desktop/…
  • 你需要使用VirtualProtect来保证所有内存都是可写的。
  • @xboi209:他在阅读,而不是在写作。 (很可能他遇到了未分配的地址空间部分。)
  • 为什么要将数据读入tempbuf并复制到mb->buffer而不是直接读入mb->buffer
  • 当它到达连续分配之间的边界时它可能会停止。 (文档没有说明这一点,但这似乎是合理的做法。)收到错误后,bytes_read 是什么?如果您继续并从新地址发出另一次读取,该读取是否有效?如果没有,你会得到什么错误?

标签: c++ windows readprocessmemory


【解决方案1】:

错误代码 299 (0x12B) ERROR_PARTIAL_COPY "只有部分 ReadProcessMemory 或 WriteProcessMemory 请求已完成"

您收到此错误是因为您尝试从未“分配”的页面读取内存。

您想在每个内存页上使用VirtualQueryEx(),这会产生一个MEMORY_BASIC_INFORMATION 结构,其中包含两个注意变量:

状态:可以是 MEM_COMMIT、MEM_FREE 或 MEM_RESERVE 保护:可以是Memory Protection Constants中的任何一个

您想遍历所有内存页面,在它们上调用 VirtualQueryEx() 并跳过任何不好的页面。我喜欢跳过所有状态为 != MEM_COMMIT 和 Protect == 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2012-01-22
    相关资源
    最近更新 更多