1

我有一个应用程序需要扫描内存中的某些数据类型。为了获得一些基准测试,我启动了这个程序:

long count = 0;

MEMORY_BASIC_INFORMATION meminfo;
unsigned char *addr = 0;

HANDLE hProc = GetCurrentProcess();

while (true){

    if ( VirtualQueryEx( hProc, addr, &meminfo, sizeof( meminfo ) ) == 0 ){

        break;

    }

    if ( ( meminfo.State & MEM_COMMIT ) && ( meminfo.Protect & WRITABLE ) ){

        addr = (unsigned char*)meminfo.BaseAddress + meminfo.RegionSize;

        count++;

        printf("%d",count);

    }

}

printf("%ld\n",count);

该程序不起作用,它在第一个内存块处阻塞/崩溃。从概念上讲,它也失败了,理想情况下,我需要指向当前流程中所有变量的指针,这样我就可以检查它们是否与我有任何相关性。我已经用谷歌搜索了一段时间,但无济于事,如果有人能把我推向正确的方向,那就太好了。

我知道首先这样做通常是一个坏主意,我只是想知道如果我需要这样做会如何完成。

4

1 回答 1

1

WRITEABLE(在第二个if块)不是内存保护常量之一。你的意思是PAGE_READWRITE?您可以在此处找到完整的选项列表。

内存访问权限很棘手。该功能的其余部分虽然有效。这是可行的,尽管只有在单步执行时才能查看 addr:

#include <Windows.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    long count = 0;
    MEMORY_BASIC_INFORMATION meminfo;
    unsigned char *addr = 0;
    HANDLE hProc = GetCurrentProcess();
    while (true)
    {
        if (VirtualQueryEx(hProc, addr, &meminfo, sizeof(meminfo)) == 0)
        {
            // TODO GetLastError
            break;
        }

        // if ((meminfo.State & MEM_COMMIT) && (meminfo.Protect & PAGE_READWRITE))
        {
            addr = (unsigned char*) meminfo.BaseAddress + meminfo.RegionSize;
            count++;
            printf("%d", count);
        }
    }

    printf("%ld\n", count);
}
于 2014-12-19T22:22:12.677 回答