gpt4 book ai didi

c++ - VirtualQueryEx 错误 - 页面太多

转载 作者:行者123 更新时间:2023-11-28 00:50:50 25 4
gpt4 key购买 nike

我使用 VirtualQueryEx 通过以下代码枚举模块的内存页:

unsigned char *p = (unsigned char *)module;
MEMORY_BASIC_INFORMATION info;
unsigned long usage = 0;
for ( ;VirtualQueryEx(hProcess, p, &info, sizeof(info)) == sizeof(info);
p += info.RegionSize )
{
printf("%#10.10x (%6uK)\t", info.BaseAddress, info.RegionSize/1024);

switch (info.State) {
case MEM_COMMIT:
printf("Committed");
break;
case MEM_RESERVE:
printf("Reserved");
break;
case MEM_FREE:
printf("Free");
break;
}
printf("\t");
switch (info.Type) {
case MEM_IMAGE:
printf("Code Module");
break;
case MEM_MAPPED:
printf("Mapped ");
break;
case MEM_PRIVATE:
printf("Private ");
}
printf("\t");

if ((info.State == MEM_COMMIT) && (info.Type == MEM_PRIVATE))
usage +=info.RegionSize;

int guard = 0, nocache = 0;

if ( info.AllocationProtect & PAGE_NOCACHE)
nocache = 1;
if ( info.AllocationProtect & PAGE_GUARD )
guard = 1;

info.AllocationProtect &= ~(PAGE_GUARD | PAGE_NOCACHE);

switch (info.AllocationProtect) {
case PAGE_READONLY:
printf("Read Only");
break;
case PAGE_READWRITE:
printf("Read/Write");
break;
case PAGE_WRITECOPY:
printf("Copy on Write");
break;
case PAGE_EXECUTE:
printf("Execute only");
break;
case PAGE_EXECUTE_READ:
printf("Execute/Read");
break;
case PAGE_EXECUTE_READWRITE:
printf("Execute/Read/Write");
break;
case PAGE_EXECUTE_WRITECOPY:
printf("COW Executable");
break;
}

if (guard)
printf("\tguard page");
if (nocache)
printf("\tnon-cachable");
printf("\n");
}

代码取自此处的另一篇文章。

问题是:VirtualQueryEx 不会停止枚举当前模块的页面(它只会在内存超出进程时停止)并且结果错误

这是我的输出和 VMMap 的输出

enter image description here

正如您所看到的,从突出显示的地址开始,页面都是错误的,VirtualQueryEx 甚至不会停止枚举它们。

我哪里错了?

最佳答案

VMMap 知道 文件格式(.data、.text、ext 部分),VirtualQueryEx 不支持。 MEMORY_BASIC_INFORMATION.RegionSize - 所有页面具有相同保护属性的区域的大小(屏幕截图中的 RW)。这就是计算区域 VMMap 和 VirtualQueryEx 不匹配的原因。

enter image description here

VirtualQueryEx 甚至不会停止枚举它们。

p += info.RegionSize

扫描整个用户态虚拟内存地址空间。如果要停止扫描,请检查 AllocationBase 字段。

关于c++ - VirtualQueryEx 错误 - 页面太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14171136/

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