我想分配一个特定的512MB页面,这是MEM_FREE,我想要 将该页面更改为MEM_RESERVE和PAGE_NOACCESS。
因此,使用Windbg,我找到了一个页面,然后我打电话给 该页面上的NtAllocateVirtualMemory使用PAGE_RESERVED和 PAGE_NOACCESS。
此次通话后 - 我没有注意到该页面有PAGE_NOACCESS flag(带!地址命令),但我无法更改内存地址 在那个页面内 - (我得到了eb命令的内存访问错误)。 因此操作成功,因为我无法改变记忆。
下一步,我在那个免费页面上调用了VirtualQuery 功能失败,错误998(对内存位置的访问无效)
提前致谢!
答案 0 :(得分:2)
MEM_RESERVE
保留VAD树中的一系列地址。它不会提交可以对其应用保护的页面。阅读PAGE_*
constants的说明。短语"页面的承诺区域"是反复写的。 NtAllocateVirtualMemory
的Protect
参数表示它适用于"已提交的网页区域"。同样地,VirtualAllocEx
的flProtect
在"提交页面时有效#34;。
这是一个Python脚本,它提交了一个受PAGE_NOACCESS
保护的内存页面。然后它尝试读取第一个字节,这当然会引发访问冲突异常。
<强> test.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