【问题标题】:Error while reading other process memory读取其他进程内存时出错
【发布时间】:2015-12-16 22:33:52
【问题描述】:

我正在使用 ReadProcessMemory 从我创建的进程中读取单个字节。 由于我作为调试器附加,我正在读取现在(或不久之前)正在执行的地址。

但我通过 GetLastError() 仅在某些地址上收到 ReadProcessMemory 的 299 错误(有些工作正常..)

在出现错误的情况下,我调用 VirtualQueryEx,memInfo 保护为 0x1,而 type 和 baseAddress 为 0x0(但区域大小是一些正常数字),VirtualQueryEx 也没有失败..

如果我为这些情况调用 VirtualProtectEx,我会收到错误 487(尝试访问无效地址)。

我想可能是我尝试读取的地址被分页了,因此出现了所有错误,但它似乎不对,因为正如我已经提到的,它是最近执行的地址。

有什么想法吗?

【问题讨论】:

  • 你的地址好像写错了,你是怎么确定的? MEMORY_BASIC_INFORMATION->State 的值是多少?
  • 除非你挂起目标进程中的所有线程,否则分配的内存是一个移动的目标,试图访问它需要运气。我不知道您为什么认为无法通过ReadProcessMemory 访问分页内存。
  • 我附加了一个调试器,并且在每一步异常中,我都会读取从异常中获得的内存地址。 MEMORY_BASIC_INFORMATION->State 是 0x00010000。此外,由于我正在处理调试异常,因此线程被暂停..
  • 0x10000 表示地址未分配。如果被调试的进程进入了未分配的内存,那就意味着它崩溃了。
  • 但它没有崩溃 :( 所以我不知道为什么它没有被分配(据称)。当我没有收到这个错误时,一切正常并按预期.. .

标签: windows api memory


【解决方案1】:

你想遍历所有内存,在调用 ReadProcessMemory() 之前调用 VirtualQueryEx() 来确保内存是有效的

在大多数情况下,您需要确保 MEMORY_BASIC_INFORMATION.State 为 MEM_COMMIT。

整个操作很容易搞砸,因为您没有提供任何代码,我将提供一个可以在 95% 的情况下工作的有效解决方案。 bytesRead 与 regionSize 不同是可以的,您只需要正确处理这种情况。在大多数情况下,您不需要使用 VirtualProtect 获取权限,因为所有有效内存都应该具有读取权限。

int main()
{
    DWORD procid = GetProcId("notepad.exe");

    unsigned char* addr = 0;

    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procid);

    MEMORY_BASIC_INFORMATION mbi;

    while (VirtualQueryEx(hProc, addr, &mbi, sizeof(mbi)))
    {
        if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS)
        {
            char* buffer = new char[mbi.RegionSize]{ 0 };
            SIZE_T bytesRead = 0;

            if (ReadProcessMemory(hProc, addr, buffer, mbi.RegionSize, &bytesRead))
            {
                if (bytesRead)
                {
                    //scan from buffer[0] to buffer[bytesRead]
                }
                else
                {
                    //scan from buffer[0] to buffer[mbi.RegionSize]
                }
            }

            delete[] buffer;
        }
        addr += mbi.RegionSize;
    }

    CloseHandle(hProc);
}

提醒:这只是一个 PoC 来教你这个概念。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多