1

MEM_FREE である特定の 512MB ページを割り当て、そのページを 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_RESERVEVAD ツリーで一定範囲のアドレスを予約します。保護を適用できるページはコミットしません。PAGE_*定数の説明を読んでください。「ページのコミットされた領域」というフレーズが繰り返し書かれています。のProtectパラメーターはNtAllocateVirtualMemory、「ページのコミットされた領域」に適用されると言います。同様flProtectVirtualAllocEx、「ページがコミットされている」場合にも有効です。

で保護されているメモリのページをコミットする 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
于 2015-05-17T23:44:35.677 に答える