このページの本文へ

前へ 1 2 次へ

あなたの知らないWindows 第24回

MinWinとVirtual DLLで変わるWindowsカーネル

2010年03月18日 12時00分更新

文● 山本雅史

  • この記事をはてなブックマークに追加
  • 本文印刷

Virtual DLLの仕組みは?

 非常に重要な役割を担うVirtual DLLだが、その仕組みに関しては、マイクロソフトのドキュメントでも詳しく説明されていない。しかし、セキュリティーソフトメーカーのマカフィーが公開している「McAfee Labs Blog」 にて、解析の結果が詳細に解説されている。そこで本稿では同社の許可を得て、同ブログの内容を元にVirtual DLLの動作を解説してみる。

 まず、APIセットのリスト(スキーマー)は、「Apisetschema.dll」に実装されている。OSカーネルは起動時に、このスキーマーを各プロセスにマッピングする。

Virtual DLLからLogical DLL(実際のDLL)へのマッピングは、システムドライブのWindows¥system32(32bit版Windows 7の場合)にあるapisetschema.dll内部にマッピングデータが実装されている

 DLLの依存関係を確認できるツール「Dependency Walker」でWindows 7のKernel32.dllを調べてみると、Kernel32.dllは「Kernelbase.dll」と「api-ms-win-XXXX.dll」というDLLにリンクしていることがわかる。このapi-ms-win-XXXX.dllが、MinWinのDLLの実体である。

「Dependency Walker」で解析したKernel32.dll。左上部のウィンドウにKernelbase.dllとapi-ms.win-XXXX.dllというDLLが並んでいる。Kernel32はこれらのDLLにジャンプしているだけ(McAfee Labs Blogより引用、以下同)

 例えば、「api-ms-win-core-processthreads-l1-1-0.dll」はプロセス/スレッド関係APIのDLLで、「api-ms-win-core-heap-l1-1-0.dll」はユーザーモード/ヒープ管理関係APIのDLLだ。ちなみにDLL名の数字は、以下のような構造になっている。

  • L[System Layer]-[API Major Ver]-[API Minor Ver

 「api-ms-win-core-heap-l1-1-0.dll」なら、「ユーザーモード/ヒープ管理関係」で「Layer1」(最も基本部分)に位置し、APIバージョンとしては「1.0」という意味になる。

 Kernel32.dllの動作を逆アセンブラで追っていくと、「Kernel32!OpenProcess」は内部でほとんど処理をせず、「api-ms-win-core-synch-l1-1-0.dll」内部の「OpenProcess_0」へジャンプしていることがわかる。さらに、「api-ms-win-core-synch-l1-1-0!OpenProcess」を逆アセンブルしてみると、この関数が実は空で、単に0を返しているだけということもわかった。

api-ms-win-core-synch-l1-1-0!OpenProcess関数は、空で単に0を返している

 2つとも実際は何もしていないのに、どうやって正しい処理が実現されるのかと言えば、DLLロード処理内部に秘密がある。Kernel32!OpenProcessを実行すると、OpenProcess中のインポート・テーブル・エントリー(ジャンプ先リスト)を参照して、Kernelbase!OpenProcessにジャンプする。さらにKernelbase!OpenProcessの中では、実際のOpneProcessのコードとして「Ntdll!ZwOpenProcess」が実行される。

 そのため、Kernel32!OpenProcessを実行中している最中は、api-ms-win-core-synch-l1-1-0!OpenProcessへはジャンプしないし、実行中のアドレス空間にロードもしない。このような仕掛けで、Vista APIをMinWinのAPIにマッピングしている。

api-ms-win-core-synch-l1-1-0!OpenProcessを逆アセンブルすると、OpenProcess API自体がエクスポート・エントリーとして登録されている

デバッガーでトレースすると、Kernel32!OpenProcessからKernelbase!OpenProcessにジャンプしている

 Windows 7ではこういった複雑な仕組みを用意することで、APIとDLLの依存関係を排除し、カーネルを進化させても、既存のAPIには悪影響が出ないように互換性を保てるようになった。その意味では、Windows 7のMinWinはVistaカーネルベースと言っても、内部的にはまったく新しいカーネルと言える。

 また、Windows 7でこのような仕組みを採用することで、今後はカーネルをチューンナップしたり、新しい機能を入れたとしても、上位のVirtual DLL部分で今までのAPIとの互換性を保つことが可能になる。MinWinとVirtual DLLの採用は、今後のWindowsカーネルにおける大きなターニングポイントとなるだろう。

■関連サイト

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン