Image File Execution Optionsでヒープオーバーフローのデバッグ

マルチスレッドプログラムで、不定期にヒープ領域の破壊を検出するようになって困ってしまいました。

IPA ISEC セキュア・プログラミング講座:C/C++言語編 第10章 著名な脆弱性対策:バッファオーバーフロー: #4 あふれを検出するデバッグ

確かに、/RTCs や /RTCu オプションを付けると検出はできるんですが、単に、マルチスレッドで定期的にヒープ領域のメモリ破壊を検出するだけなので、どこでヒープエラーがおこったのかわかりません。

そこで、 HKEY_LOCAL_MACHINEの
SOFTWARE\Microsoft\Windows NT\CurrentVersion\
にある、Image File Execution Options キーを開いて、
実行ファイルと同じ名前のキーを作ります。

作るのは、「PageHeapFlags」と「GlobalFlag」 両方DWORD型で作成します。

ASCII型でも設定できますが、その場合は、”0xXXXXXXXX” の形式で指定しないといけないようです。

なぜ、低い断片化ヒープ (LFH) メカニズムは、Windows Server 2003、Windows XP、または Windows 2000 を実行しているコンピューターによってできない可能性があるか。

// NtGlobalFlag flags
#define FLG_STOP_ON_EXCEPTION 0x00000001
#define FLG_SHOW_LDR_SNAPS 0x00000002
#define FLG_DEBUG_INITIAL_COMMAND 0x00000004
#define FLG_STOP_ON_HUNG_GUI 0x00000008
#define FLG_HEAP_ENABLE_TAIL_CHECK 0x00000010
#define FLG_HEAP_ENABLE_FREE_CHECK 0x00000020
#define FLG_HEAP_VALIDATE_PARAMETERS 0x00000040
#define FLG_HEAP_VALIDATE_ALL 0x00000080
#define FLG_POOL_ENABLE_TAIL_CHECK 0x00000100
#define FLG_POOL_ENABLE_FREE_CHECK 0x00000200
#define FLG_POOL_ENABLE_TAGGING 0x00000400
#define FLG_HEAP_ENABLE_TAGGING 0x00000800
#define FLG_USER_STACK_TRACE_DB 0x00001000
#define FLG_KERNEL_STACK_TRACE_DB 0x00002000
#define FLG_MAINTAIN_OBJECT_TYPELIST 0x00004000
#define FLG_HEAP_ENABLE_TAG_BY_DLL 0x00008000
#define FLG_IGNORE_DEBUG_PRIV 0x00010000
#define FLG_ENABLE_CSRDEBUG 0x00020000
#define FLG_ENABLE_KDEBUG_SYMBOL_LOAD 0x00040000
#define FLG_DISABLE_PAGE_KERNEL_STACKS 0x00080000
#define FLG_HEAP_ENABLE_CALL_TRACING 0x00100000
#define FLG_HEAP_DISABLE_COALESCING 0x00200000
#define FLG_VALID_BITS 0x003FFFFF
#define FLG_ENABLE_CLOSE_EXCEPTION 0x00400000
#define FLG_ENABLE_EXCEPTION_LOGGING 0x00800000
#define FLG_ENABLE_HANDLE_TYPE_TAGGING 0x01000000
#define FLG_HEAP_PAGE_ALLOCS 0x02000000
#define FLG_DEBUG_WINLOGON 0x04000000
#define FLG_ENABLE_DBGPRINT_BUFFERING 0x08000000
#define FLG_EARLY_CRITICAL_SECTION_EVT 0x10000000
#define FLG_DISABLE_DLL_VERIFICATION 0x80000000

「PageHeapFlags」を3、「GlobalFlag」 を0x02000000 にして、ページヒープを有効にします。

hp
再起動なしで、こんな感じで厳密なチェックで、オーバーフローを検出すると例外が発生するようになります。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です