これは私が試みることです:
モジュールのHMODULEハンドルは、実際にはモジュールのイメージのベースアドレスであることに注意してください。GetModuleHandleこの値を取得するために使用できます。これを画像のオプションのヘッダー値のベースアドレスと比較すると、ASLRがオンになっている場合、これら2つの値は異なると予想されます。
GetModuleHandleこれは、特定のシステムDLLで使用された場合にのみ、ASLRの明確な指標になることに注意してください。kernel32それは画像再配置の典型的な候補ではないので、それはうまくいくでしょう:
- MicrosoftシステムDLLには、すべて固有の推奨ベースアドレスが与えられています。と
- これは、プロセスアドレス空間にマップされた最初のDLLの1つです。
通常は再配置されないためkernel32、ASLRがオフになっている場合は、推奨されるベースアドレスにロードされると予想するのが妥当です。
画像ヘッダーから推奨ベースアドレスをどのように取得しますか?最も簡単な方法は、DUMPBINVisualC++に含まれているユーティリティを使用することです。プログラムで実行したい場合は、IMAGE_OPTIONAL_HEADER構造体のImageBaseフィールドが見つかるまで、実行可能イメージのヘッダーを調べていく必要があります。PEヘッダーの詳細については、 MattPietrekによる「 Win32PortableExecutableFileFormatの詳細」をお勧めします。