SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

DbgHelpを利用してDLLがエクスポートしている関数を列挙する

DLLやEXEなどのPE形式のファイルから情報を取得する

  • X ポスト
  • このエントリーをはてなブックマークに追加

本稿では、DbgHelpを利用してDLLがエクスポートしている関数を表示するプログラムを作成し、DLLやEXEなどのPE形式のファイルから情報を得るための手法を示します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 本記事では、DbgHelpを利用してDLLがエクスポートしている関数を表示するプログラムを作成し、DLLやEXEなどのPE形式のファイルから情報を得るための手法を示します。

対象読者

 本記事の対象読者は、WindowsでC++を利用してツールを作成したり、プログラムの実行時障害の解析を行ったりする方です。

 また、Windowsでバイナリを直接操作することに興味をお持ちのバイナリアンも対象です。

必要な環境

 サンプルプログラムは、Visual Studio 2005のソリューションとして構成してあります。利用したプロジェクトテンプレートはWin32コンソールアプリケーションです。ビルドするには、Platform SDKをインストールしておく必要があります。

 同様にPlatform SDKをインストールした環境であれば、Visual C++ 6やVisual Studio 2003でもプロジェクトを設定することでビルドできます。

依存するヘッダとライブラリ

 サンプルプログラムはDbgHelpを利用するため、ビルド時に「DbgHelp.h」と「DbgHelp.lib」を参照します。これらはPlatform SDKに含まれます。

 なお、「DbgHelp.dll」は、Windows 2000以降のWindowsには標準で付属していますが、古いWindowsには別途用意する必要があります。

サンプルプログラムについて

 添付アーカイブを展開すると、「showexports」ディレクトリをルートとした以下のツリーが作成されます。

ファイル構成
showexports
  |
  +debug        …デバッグビルド済みファイル
  |
  +release      …リリースビルド済みファイル
  |
  +showexports  …ソースファイル
    |
    +debug      …ビルド用空ディレクトリ
    |
    +release    …ビルド用空ディレクトリ

 動作を確認するには、「showexports\debug」または「showexports\release」のいずれかのディレクトリで、「showexports dll名」を実行してください(例1)。

例1
C:\temp\showexports>cd release

C:\temp\showexports\release>showexports c:\windows\system32\atl71.dll
name=ATL71.DLL
10 fname=AtlAdvise
41 fname=AtlAxAttachControl
(略)
45 fname=AtlWinModuleRegisterWndClassInfoW
66 fname=AtlWinModuleTerm

C:\temp\showexports\release>

 これは、「dumpbin.exe」を/exportsオプション付きで実行した場合に得られる結果(例2)のサブセットです。

例2
C:\temp\showexports\release>dumpbin /exports c:\windows\system32\atl71.dll
Microsoft (R) COFF Binary File Dumper Version 6.00.8447

(略)
    ordinal hint RVA      name

         10    0 000050AA AtlAdvise
(略)
         66   34 000012FA AtlWinModuleTerm
(略)
C:\temp\showexports\release>

用語説明

PE

 PE(Portable Executable)ファイルは、マイクロソフト社の実行ファイルの形式のうち、アーキテクチャ非依存フォーマットを利用したファイルです。PEファイルの内部には、プログラムのコード、インポート情報、エクスポート情報、リソースなど種々の情報が格納されています。

 PEファイルには、EXEファイル、DLLファイルなどの実行可能ファイル(イメージ)と、コンパイル後の機械語を収めたオブジェクトファイル(オブジェクト)の2種類があります。

 PEファイルの仕様については、参考資料を参照してください。

PEファイル
PEファイル

RVA

 PEファイル上の情報は、各情報に固有のヘッダ上で、オフセットと長さのペアによって管理されます。オフセット値は、ファイル上のオフセットではなく、プロセス内に配置された場合の境界に基づいた値です。このため、イメージをプロセス空間へ配置する作業は高速に行える反面、ファイル内でポインタをたどるのを難しくしています。なお、このオフセットをRVA(Relative Virtual Address)と呼びます。仕様書で、RVAと書かれているものについては、ファイルポインタとして直接扱うことができないので注意が必要です。

SDKヘッダファイルとPEファイルの構造体

 ヘッダファイルのうち、PEファイルの各種ヘッダなどの構造体が定義されているのは、「WinNT.H」です。

 「WinNT.H」で特に重要なのは、IMAGE_FILE_HEADER構造体(仕様書ではCOFF File Header)と、IMAGE_OPTIONAL_HEADER構造体(仕様書ではOptional Header)の2つです。両者は先頭のシグネチャ("PE"という文字列)と合わせてIMAGE_NT_HEADERS構造体のフィールドです。

 IMAGE_NT_HEADERSの直後には、実際のバイナリデータのインデックスを提供するIMAGE_SECTION_HEADER構造体(仕様書ではSection Header)が、IMAGE_FILE_HEADER構造体のNumberOfSectionsフィールドで指定された数だけ続きます。

 実際のコード、定数、リソースといったデータは、IMAGE_SECTION_HEADER構造体の後ろに配置されます。

 「WinNT.H」は、「Windows.H」がincludeする「WinDEF.H」によってincludeされています。このため、プログラムからは「Windows.H」をincludeすれば特に明示的にincludeする必要はありません。

DbgHelp

 「DbgHelp.dll」は、WindowsアプリケーションがEXEやDLLなどのバイナリファイルを簡単に扱えるように提供されています。デバッグ用のシンボル情報や、スタックトレースを取得するためのAPIや、本記事で利用するイメージファイル操作APIなどが実装されています。

 プログラムで「DbgHelp.dll」のAPIを利用するには、「DbgHelp.lib」をリンクします。また、APIは「DbgHelp.H」に定義されています。これらはいずれもPlatform SDKに収録されています。

 DbgHelpを利用する場合の注意点は、DbgHelpがマルチスレッディングを考慮していないことです。このため、同時に複数のスレッドからAPIを呼び出すと正しい結果を得られないことがあります。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
プログラムの説明

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

arton(アートン)

専門は業界特化型のミドルウェアやフレームワークとそれを利用するアプリケーションの開発。需要に応じてメインフレームクラスから携帯端末までダウンサイジングしたりアップサイジングしたりしながらオブジェクトを連携させていくという変化に富んだ開発者人生を歩んでいる。著書に『Ruby③ オブジェクト指向とはじめての設計...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/416 2006/06/19 00:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング