木村屋です。この記事は私のブログからの転載です。
Windowsでプロセスが作られ、プログラムが実際に動き出すまでの過程について調査を行ったのでメモをまとめました。
あくまで暫定版なので、あっさりした内容になっています。一部省略した記述もあります。
また間違いや勘違いも含まれていると思われます。予めご了承ください。
正確性を期した積もりですが誤りがあった場合は文責はすべて私にあります。
- 親プロセスからexeファイルが起動される(普通のユーザーがexeファイルを起動する場合、親プロセスはエクスプローラーやコマンドプロンプトである場合が多いと思います。エクスプローラーから起動した場合、エクスプローラーが親プロセスになります)
- 関数CreateProcessがexeファイル(イメージファイル)を開き、セッションオブジェクトを作成(関数NtOpenFileがファイルを開き、関数NtCreateSectionがセッションオブジェクトを作成する)
- 関数CreateProcessがプロセスオブジェクトを作成(ntdll.dll内にある関数NtCreateProcessExが呼び出され、新しいプロセスが仮想アドレス空間に作られる)
- 関数CreateProcessがスレッドオブジェクトを作成(ntdll.dll内にある関数NtCreateThreadがプロセスの最初のスレッドを作成する)
- Windowsサブシステムがプロセスを初期化する(kernel32.dllがWindowsサブシステムにメッセージを送信)
- 最初のスレッドの実行を開始。関数KiThreadStartupを呼び出し、スレッドを初期化する
- イメージローダー(ntdll.dll内にあるLdrからはじまる関数群)に制御を移す
- イメージローダーが最初のヒープの作成などのプロセスの初期化処理を行う
- イメージローダーがexeのインポートテーブルの解析を行い、必要なDLLをすべて洗い出す。
- イメージローダーが実行時、必要に応じてDLLをロード、アンロードする。ロードされているモジュールのリスト(モジュールデータベース)を管理する。ロードされているモジュールのリストにはDLLとメインの実行ファイルが含まれる
- イメージローダーによりすべてのDLLがロードされた後、IAT(インポートアドレステーブル)を解析し、インポートされた関数を調べる(この処理で.textセクションにある外部のDLLにある関数呼び出しとメモリに呼び出されたDLL内部にある関数呼び出しの名前とアドレスの解決を行うものと思われる。詳細は未調査)
- イメージローダーが依存関係を解決した後、インポート後の初期化処理が行われる(.NETアプリケーションかどうかの確認、静的なインポートのすべてのロードの処理等)
- エントリポイントからプログラムの実行を開始
以上です。今後も調査を実施し、追記があれば記事の訂正、追加等を行います。
引用文献
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月11日暫定版)
http://blog.livedoor.jp/south_kanto_dm/archives/52099041.html