[英]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);
该程序不起作用,它在第一个内存块中阻塞/崩溃。 从概念上讲,它也失败了,理想情况下,我需要指向当前进程中所有变量的指针,因此我可以检查它们是否与我相关。 如果有人可以向正确的方向推动我,那我已经在谷歌上搜索了一段时间了,但无济于事。
我知道首先这样做通常是个坏主意,我只想知道如果需要的话该怎么做。
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.