C ++内存扫描

时间:2013-03-31 21:07:40

标签: c++ memory

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

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);

此程序不起作用,它在第一个内存块上阻塞/崩溃。从概念上讲它也失败了,理想情况下我需要指向当前进程中的所有变量,所以我可以检查它们是否与我有任何关系。如果有人能够把我推向正确的方向,那我已经google了一段时间了,但是没有用。

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

1 个答案:

答案 0 :(得分:1)

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

内存访问权限很棘手。其余的功能虽然有效。这可行,但只有在单步执行时才能查看地址:

#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);
}