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” の形式で指定しないといけないようです。
| // 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 にして、ページヒープを有効にします。

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


Comments