繁体   English   中英

C ++内存扫描

[英]C++ Memory Scanning

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

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

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

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

WRITEABLEif块,则为第二个)不是存储器保护常数之一。 您是说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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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