• ベストアンサー

VC2005のDLLのフォーマットについて

VC2005 DLLファイルについて質問です。 巷には、DLLに登録されている関数名とか見れるツールが あるのですが、それらってどうやって作ってるんでしょうか。 DLLのヘッダ情報、ファイル構造など、どこかのサイトで公開 されてるのでしょうか?もし、知ってる方がいらっしゃったら、 興味があるので教えて頂けないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.4

>// この辺りからが、DLLファイルに格納されている関数 >// の命令列なんですが、どこを見たら、ここからが >// 関数の命令列です!というのがわかるのでしょうか。 http://codezine.jp/article/corner/61 の 「Windows実行ファイルのバイナリ概要」「EXEファイルの内部構造(PEヘッダ)」「EXEファイルの内部構造(セクション)」を順に見ていって… .textセクションにネイティブコード(命令コード)が入っています。 もっとも、ソースに記述した各関数の開始位置まではそのままでは解らないと思いますが。 エクスポートされている関数であれば.edataセクションに関数名(エクスポート名)とアドレスの対応表があるハズです。 # EXEファイルと書かれていますが、DLLファイルでもほとんど同じです。 デバッグ情報などでシンボル情報があれば、エクスポートされていない関数やグローバル変数などの名前とアドレスの情報が得られると思います。 ごりごりとファイルアクセスで調べなくても、もしかしたらAPIがあるのかも知れませんが…… デバッガを自分で作るつもりはありませんので調査していません。

darkness22
質問者

補足

詳細なご説明ありがとうございます。 > # EXEファイルと書かれていますが、DLLファイルでもほとんど同じです。 このご説明で、私の中の何かが弾けました。 順々にバイナリコードを追っていきますと、確かに、 教えていただいたサイトの情報と私のDLLファイルの フォーマットがほぼ同じでした。(なんか微妙にズレましたが..) 最後に、IMAGE_SECTION_HEADER構造体のSizeOfRawDataメンバの アドレスに、DLL_main関数の命令列が格納されていました。 ご教授本当にありがとうございます。 最後の最後に一点質問ですが、教えて頂いたサイトのような 書籍はございませんでしょうか? よろしくお願いします。

その他の回答 (3)

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.3

>DLLファイルの内部構造を示したものがほしいです。 エクスポートされた関数がどこにあるのか…とかそういうコトですか? 実際にメモリに読み込まれてアドレスがマップされないと場所は特定できないかと…。

darkness22
質問者

お礼

すみません。 「添付のdlltest.dll」って書きましたが、 添付できませんでした^^; ただのDLLイメージとご認識してください。

darkness22
質問者

補足

何度もご回答頂きすみません。 > エクスポートされた関数がどこにあるのか…とかそういう > コトですか? いえ、違います。ちょっとDLLファイルイメージを 出して説明いたします。(下記イメージの文中に質問記載しています) ---添付のdlltest.dllバイナリイメージ抜粋 --- 4D 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 // 4D 5A(M Z)で始まり B8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F8 00 00 00 0E 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 69 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F 74 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 6D 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 02 6F 86 18 46 0E E8 4B 46 0E E8 4B 46 0E E8 4B 61 C8 93 4B 45 0E E8 4B 61 C8 95 4B 47 0E E8 4B 61 C8 86 4B 44 0E E8 4B 61 C8 85 4B 4B 0E E8 4B 85 01 B5 4B 44 0E E8 4B 46 0E E9 4B 58 0E E8 4B 61 C8 99 4B 47 0E E8 4B 61 C8 92 4B 47 0E E8 4B 61 C8 90 4B 47 0E E8 4B 52 69 63 68 46 0E E8 4B 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 50 45 00 00 4C 01 05 00 85 35 60 4A 00 00 00 00 00 00 00 00 E0 00 02 21 0B 01 08 00 00 0A 00 00 00 0C 00 00 00 00 00 00 7E 14 00 00 00 10 00 00 00 20 00 00 00 00 00 10 00 10 00 00 00 02 00 00 04 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 60 00 00 00 04 00 00 83 AC 00 00 02 00 00 00 00 00 10 00 00 10 00 00 00 00 10 00 00 10 00 00 00 00 00 00 10 00 00 00 F0 24 00 00 7A 00 00 00 DC 21 00 00 3C 00 00 00 00 40 00 00 AC 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 50 00 00 1C 01 00 00 A0 20 00 00 1C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C8 20 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2E 74 65 78 74 00 00 00 38 09 00 00 00 10 00 00 00 0A 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 60 2E 72 64 61 74 61 00 00 6A 05 00 00 00 20 00 00 00 06 00 00 00 0E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 40 2E 64 61 74 61 00 00 00 60 03 00 00 00 30 00 00 00 02 00 00 00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 C0 2E 72 73 72 63 00 00 00 AC 01 00 00 00 40 00 00 00 02 00 00 00 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 40 2E 72 65 6C 6F 63 00 00 4C 01 00 00 00 50 00 00 00 02 00 00 00 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00            ・            ・ ALL 00            ・ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 // <質問> // この辺りからが、DLLファイルに格納されている関数 // の命令列なんですが、どこを見たら、ここからが // 関数の命令列です!というのがわかるのでしょうか。 // おそらく、ファイルシステムのように // なっていると思うので、何かしらの情報 // が、このイメージファイルにあるはずかと // 思っています。 // つまり、このDLLファイルのファイルシステム // フォーマットのようなものが知りたいです。 B8 01 00 00 00 C2 0C 00 CC CC CC CC CC CC CC CC 8B D2 8B D2 8B D2 8B D2 8B D2 8B D2 8B 44 24 08 8B 4C 24 04 03 C1 89 44 24 08 8B 54 24 08 85 D2 75 03 33 C0 C3 53 8B DB 8B DB 8B DB 8B DB 8B DB 8B DB 5B C3 CC CC CC CC CC CC CC CC CC CC CC CC 8B D2 8B D2 8B D2 8B D2 8B D2 8B D2 8B 44 24 04 8B 4C 24 08 8B D0 2B D1 89 54 24 04 8B 54 24 04 85 D2 75 02 8B C1 53 8B DB 8B DB 8B DB 8B DB 8B DB 8B DB 03 C1 5B C3 CC CC CC CC CC CC CC CC CC 8B D2 8B D2 8B D2 8B D2 8B D2 8B D2 8B 44 24 04 ・ ・ ・

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

>DLLのファイル構造みたいな...。 前回掲示した参考サイトに… >PEファイルには、EXEファイル、DLLファイルなどの実行可能ファイル(イメージ)と、コンパイル後の機械語を収めたオブジェクトファイル(オブジェクト)の2種類があります。 とありますが……。

darkness22
質問者

補足

すみません、よく分かりません。 DLLファイルなどの実行可能ファイル(イメージ)ではなく、 DLLファイルの内部構造を示したものがほしいです。 PEファイルを実行することで、 このDLLファイルの内部構造を知ることが出来るということでしょうか?

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.1

>巷には、DLLに登録されている関数名とか見れるツールが >あるのですが、それらってどうやって作ってるんでしょうか。 http://codezine.jp/article/detail/416 ソレ用のAPI等がある…ようです。

darkness22
質問者

補足

こんなAPIがあるんですね。 ちょっと内部を追っかけてみます。 教えていただいたサイト内に、「EXEのファイル構造」 の説明しているものがありましたが、似たようなサイト はないですかね^^; DLLのファイル構造みたいな...。 お返事ありがとうございました。

関連するQ&A