ASLRとエントリポイント

Windows Vistaからの機能であるASRL(Address Space Layout Randomization)のためにPEヘッダを見てもプログラムのエントリポイントが取得できなくなった件についてのメモ。

  1. エントリポイントの欲しいプログラムをCreateProcess関数でDEBUG_PROCESSとして起動する。
  2. WaitForDebugEvent関数でLOAD_DLL_DEBUG_EVENTを拾う。
  3. CreateProcessのときのプロセスハンドルを使って、EnumProcessModules関数を投機的に呼んでみる。(何回かContinueDebugEventを呼びつつ繰り返す。2回目以降は成功する気がする。)
  4. 先頭のモジュールに対してGetModuleInformationを実行する。(先頭には自分が入っているらしい。)
  5. 取得したMODULEINFO構造体にEntryPointというのが入っているので、そこがエントリポイントである。


構造体の中身についてのドキュメントが取得しづらいのだけれど、どうにかならないんですかね?構造体名+特徴的なフィールド名で検索すれば引っかかる感じだけれども。