木村屋です。この記事は私のブログからの転載です。
現在、Windowsでexeファイルからプロセスが作られるまでの過程を調査しています。
今回はAPI Monitorというツールを使って、プロセスが生成されてから、どういったネイティブAPIが呼び出されているかを調査しましたので、今回、改めて記事を書かせていただきます。
調査中である為、間違いや勘違いも含まれていると思われます。予めご了承ください。正確性を期した積もりですが誤りがあった場合は文責はすべて私にあります。
検証を行った環境はWindows 7 Ultimate(x64)です。exeファイルはx64の物でテストを行いました。
- 親プロセスからexeファイルが起動される(普通のユーザーがexeファイルを起動する場合、親プロセスはエクスプローラーやコマンドプロンプトである場合が多いと思います。エクスプローラーから起動した場合、エクスプローラーが親プロセスになります)
- 関数CreateProcessがexeファイル(イメージファイル)を開き、セッションオブジェクトを作成(関数NtOpenFileと関数NtCreateUserProcessが実行可能ファイルを開き、関数NtCreateSectionがセッションオブジェクトを作成する。詳細は不明だがexeファイルによって、関数NtCreateSectionが呼び出される順序が異なる模様。3で紹介するの関数NtOpenProcessが関数NtCreateSectionよりも先に呼ばれる事もある。原因については不明)
- 関数CreateProcessがプロセスオブジェクトを作成(ntdll.dll内にある関数NtOpenProcessが呼び出され、新しいプロセスが仮想アドレス空間に作られる。参考資料では、ntdll.dll内にある関数NtCreateProcessExが呼び出されると書かれていたが、実際に呼び出されているのは関数NtOpenProcessだった。未確認だが参考にした資料は2003年に作られた物なので、Windows XPの時には関数NtCreateProcessExが使われていた可能性がある。Windows XPからWindows Vista, Windows 7にバージョンアップする際に呼び出される関数が変更されたのではないかと推測する。これはあくまでも私の憶測であり、未確認である)
- 関数CreateProcessがスレッドオブジェクトを作成(インサイドWindows 第6版 上では、ntdll.dll内にある関数NtCreateThreadがプロセスの最初のスレッドを作成すると書かれているが起動した所を確認できなかった。詳細と原因については不明。関数PspCreateThreadを何らかの形で呼び出している筈だが、この関数についてはAPI Monitorではブレークポイントを貼ることが出来ず、確認できなかった)
- Windowsサブシステムがプロセスを初期化する(kernel32.dllがWindowsサブシステムにメッセージを送信)
- 最初のスレッドの実行を開始。関数KiThreadStartupを呼び出し、スレッドを初期化する(この関数についてはAPI Monitorではブレークポイントを貼ることが出来ず、確認できなかった)
- イメージローダー(ntdll.dll内にあるLdrからはじまる関数群)に制御を移す
- イメージローダーが最初のヒープの作成などのプロセスの初期化処理を行う
- イメージローダーがexeのインポートテーブルの解析を行い、必要なDLLをすべて洗い出す。
- イメージローダーが実行時、必要に応じてDLLをロード、アンロードする。ロードされているモジュールのリスト(モジュールデータベース)を管理する。ロードされているモジュールのリストにはDLLとメインの実行ファイルが含まれる
- イメージローダーによりすべてのDLLがロードされた後、IAT(インポートアドレステーブル)を解析し、インポートされた関数を調べる(この処理で.textセクションにある外部のDLLにある関数呼び出しとメモリに呼び出されたDLL内部にある関数呼び出しの名前とアドレスの解決を行うものと思われる。詳細は未調査)
- イメージローダーが依存関係を解決した後、インポート後の初期化処理が行われる(.NETアプリケーションかどうかの確認、静的なインポートのすべてのロードの処理等)
- エントリポイントからプログラムの実行を開始
以上です。今後も調査を実施し、追記があれば記事の訂正、追加等を行います。
使用したツール
API Monitor http://www.rohitab.com/apimonitor
引用文献
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 3.10 イメージローダー インサイドWindows 第6版 上 265
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 実習:イメージローダーを監視する インサイドWindows 第6版 上 266
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 5.3 CreateProcessの処理の流れ インサイドWindows 第6版 上 411
Mark E. Russinovich、David A. Solomon、Alex Ionescu 2012 実習:プロセスの起動をトレースする インサイドWindows 第6版 上 431
平成15 年度夏学期集中講義 コンピュータ科学特別講義III (戦略ソフトウェア特論II) http://i-web.i.u-tokyo.ac.jp/edu/training/ss/lecture/new-documents/Lectures/13-Processes/Processes.pdf
転載元
南関東開発機構 : exeファイルをエクスプローラーでダブルクリックしてからプロセスが作られ、プログラムのエントリポイントまで移動するまでの過程(2015年7月28日版)
http://blog.livedoor.jp/south_kanto_dm/archives/52101117.html