1

我想分配一个特定的 512MB 页面,它是 MEM_FREE,我想将该页面更改为 MEM_RESERVE 和 PAGE_NOACCESS。

因此,使用 Windbg,我找到了一个页面,并使用 PAGE_RESERVED 和 PAGE_NOACCESS 在该页面地址上调用了 NtAllocateVirtualMemory。

在此调用之后 - 我没有注意到页面有 PAGE_NOACCESS 标志(使用 !address 命令),但我无法更改该页面内的内存地址 - (我收到 eb 命令的内存访问错误)。所以操作成功了,因为我无法更改内存。

  1. 您知道为什么在更改权限后我在该页面的 windbg PAGE_NOACCESS 中看不到吗?

下一步,我在该空闲页面上调用了 VirtualQuery,该函数失败并出现错误 998(对内存位置的无效访问)

  1. 最后,我想识别空闲页面并显示它们的大小。您知道如果 VirtualQuery 失败,我该如何获取这些信息?

提前致谢!

4

1 回答 1

4

MEM_RESERVE在 VAD 树中保留一系列地址。它不会提交可以对其应用保护的页面。阅读PAGE_*常量的描述。短语“已提交的页面区域”被重复写入。的Protect参数NtAllocateVirtualMemory表示它适用于“页面的提交区域”。当“正在提交页面”时,类似flProtect的也是有效的。VirtualAllocEx

这是一个 Python 脚本,它提交受保护的内存页面PAGE_NOACCESS。然后它尝试读取第一个字节,这当然会引发访问冲突异常。

测试.py:

from ctypes import *

MEM_COMMIT = 0x1000
PAGE_NOACCESS = 1

VirtualAlloc = WinDLL('kernel32').VirtualAlloc
VirtualAlloc.restype = c_void_p

addr = VirtualAlloc(None, 4096, MEM_COMMIT, PAGE_NOACCESS)
array = (c_char * 4096).from_address(addr)
array[0] # access violation

演示:

(test) C:\>cdb -xi ld python test.py

Microsoft (R) Windows Debugger Version 6.12.0002.633 AMD64
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: python test.py
Symbol search path is: symsrv*symsrv.dll*C:\Symbols*
    http://msdl.microsoft.com/download/symbols
Executable search path is:
(d70.d08): Break instruction exception - code 80000003 (first chance)
ntdll!LdrpDoDebuggerBreak+0x30:
00000000`77b78700 cc              int     3
0:000> g

(d70.d08): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
python34!PyBytes_FromStringAndSize+0x70:
00000000`64bd5cc0 0fb601          movzx   eax,byte ptr [rcx]
                                              ds:00000000`00190000=??
0:000> !address 190000
Usage:                  <unclassified>
Allocation Base:        00000000`00190000
Base Address:           00000000`00190000
End Address:            00000000`00191000
Region Size:            00000000`00001000
Type:                   00020000        MEM_PRIVATE
State:                  00001000        MEM_COMMIT
Protect:                00000001        PAGE_NOACCESS
于 2015-05-17T23:44:35.677 回答