gpt4 book ai didi

C++内存扫描

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:08 27 4
gpt4 key购买 nike

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

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 block )不是内存保护常量之一。您是说 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);
}

关于C++内存扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15734542/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com