繁体   English   中英

ReadProcessMemory _out_字节读取

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM