• ベストアンサー

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

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

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答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% (2177/4070)
回答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% (2177/4070)
回答No.2

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

darkness22
質問者

補足

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

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

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

darkness22
質問者

補足

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

関連するQ&A

  • BCBでVC++のDLLを利用するために

    C++Builder5で、VC++で作ったDLLを利用する必要に駆られてしまいました。 提供されているのはDLL本体とヘッダの2点で、BCBからリンクするために、implibを使ってdllからlibの作成をし、プロジェクトに加え、ヘッダをインクルードしました。続けて試しにコードを書いたところ、 '外部シンボル_initialize_libraryが未解決' との表示。(initialize_libraryとはDLL内にある関数です。) 調べてみたところ、 1.呼び出し規約は標準で __stdcall 2.VC++ では、_ がシンボル名の頭に付く 3.Builder ではつかない これで食い違いが生じているんだと思うのですが、更に調べると、モジュール定義ファイルにて再定義をすれば良いとの結論になりました。 BorlandのFAQも見たのですが、書式が理解できなくて・・・そこで質問させて頂きたいのですが、単純にproject名.defを作って、 >IMPORTS >initialize_library=_initialize_library とやってプロジェクトに加えれば良いのでしょうか? ソース本体にextern "C" というのも必要なようですが、こちらの記述も教えて頂けたら嬉しいです。

  • VC2005のDLLを6.0で呼び出すには

    VC 2005 Pro Editionで作ったライブラリ(ヘッダ、lib、dll)を頂きました。    頂いたDLLの形式は定義ファイル.defを使わない形式、declspec(dllexport)を使う形式の方です。  呼び出し側はVC6.0EnterPrize(SDK)を使います。 (諸事情により6.0以上にUPすることは不可能)     まず、静的リンクをし、関数を呼び出してみました。  (設定のリンクよりlibをリンクさせ、ヘッダをインクルードして)  すると以下のメッセージが出てしまいます。 リンク中... Dialog1.obj : error LNK2001: 外部シンボル ""__declspec(dllimport) void __cdecl Init(unsigned char *,unsigned char *,unsigned char *,unsigned char *)" (__imp_?Init_Card@@YAXPAE000@Z)" は未解決です Debug/CardMake.exe : fatal error LNK1120: 外部参照 1 が未解決です 。 link.exe の実行エラー    色々やってみましたが、このエラーから回避できませんでした。  ヘッダ自体に #ifdef _USRDLL #define DLL_PORT __declspec(dllexport) #else #define DLL_PORT __declspec(dllimport) #endif    の宣言があるので、別に特別なことをしなくても、大丈夫そうなのですが、何故か出来ません。  次に動的リンクを行っていました。  するとLoadLibraryでエラーになり、GetLastErrrorで14001(エラーメッセージはつかめず)が返ってきました。 (色々調べたところ定義ファイルがないと動的リンクはできないようですね)    というわけでにっちもさっちも行かなくなった状況です。  そこでご質問です。 (1)定義ファイルを使わない形式のライブラリ(暗示的に定義されているもの)はどのように呼び出させばよいでしょうか? (2)2005のライブラリを6.0から呼び出すことは可能ですか?  また呼び出す方法は?  すいませんがご回答をお願いします。

  • VCで作成したDLLの使用

    VCで作成したDLLの使用 VC6.0で作成されたDLLファイルを使いたいのですが _stdcallで記述されたものではなく DllMainで記述されたものなのですが、 VBから呼び出す事は可能でしょうか? 普通にdeclare functionで呼び出そうとすると、 「エントリfnchogeがDLLファイル hoge.dll内に関数が見つかりません。」 とエラーがでるだけでした。 VB6.0SP3 Windows2000

  • VC++でDLL、エントリポイントが出来ない?

    VisualStudio2010 VC++でDLLを作成し既存のDelphiXE2アプリで利用したいのですが MSのサンプルソースそのままでDLLを作成しても、__stdcall;しても、Delphiの読み込み時に 「エントリポイントが見つかりません」と言われます。 http://msdn.microsoft.com/ja-jp/library/ms235636.aspx ソースはMSのチュートリアルそのままです。 ためしに VS2010のツール dumpbin.exe /exports ????.dll と中身を覗くと 1 0 ooo11104 ?Add@MyMathFuncs@MathFuncs@@SGNNN@Z 2 1 ,,,,,,,,,,,,,, のような表示とSummary 以下しか表示されずスタティックライブラリにしても中身は同じです。 それでは、と他のDLLをいくつか覗いてみましたが、大概のDLLやLIBファイルを覗くと すっきりしたきれいな関数名の一覧がdumpbin /exports で表示されます。 では、DLLになっていないのかというと、作ったDLLを同じVC++でチュートリアル通りに 呼び出すと何の問題もなく使えますので、多分正常なのでしょう。 しかし、どうして エントリポイントの一覧が見える形にならないのか分かりません。多言語で利用するには 必要かと思います。 VC++で作成したDLLやLibが他の環境で使えないとは考えられないので、なにか、常識的な 部分を知らないのだと思いますが、どなたかよろしくお願いします。

  • VC++で作成したDLLについて

    すみません、 VC++6.0で作成したDLLについて教えていただきたいのですが。 TEST_A.DLLというDLLと、TEST_B.DLLというDLLファイルを作成したとして これをC:\TEST\DLL\に格納してるとします。 このとき、TEST_B.DLLからはTEST_A.DLLの関数を呼び出しています。 次に、TEST_B.DLLの関数を使用しているTEST.EXEという実行ファイルを VB6.0で作成します。 このファイルをC:\TEST\EXE\に格納します。 そして、TEST.EXEを実行すると、 「TEST_B.EDLLが見付かりません」と言って怒られてしまいます。 VBでは、TEST_B.DLLをフルパスで指定しております。 しかし、TEST_A.DLLをEXEと同じ場所に置いてあげると 正常に動きます。 これは、TEST_B.DLLからTEST_A.DLLが見えていないということなのでしょうか? TEST_B.DLLの設定がおかしいのでしょうか? それとも、TEST.EXEでもTEST_A.DLLをフルパス指定してあげないといけないのでしょうか? ちなみに今回、プロジェクトマネージャーから「環境変数(PATH)の設定はしたくない」と言われていますので、PATHの指定はしてません。 すみませんが、どなたか教えていただけますでしょうか?

  • VC++で作成したDLLのデバッグ

    VC++6.0で作成したDLLファイルのデバッグ作業でVBでコンパイルした EXEファイルを使うと、例外エラーが発生してしまいます。 EXEファイルにデバッグ情報が書き込まれるのでしょうか? 次からそのEXEファイルを利用すると、やはり例外エラーがおきます。 (それに長い間気づかず、ずっとバグ探しをしてました。) VC++のDLLファイルのデバッグモードはVBのEXEファイルでは利用できないのでしょうか?

  • VC++のDLLファイルをVBで読み出せません。

    お世話になります。 プログラムをやり始めて3か月の初心者です。仕事で以下のような事をしていますが、うまくいかず悩んでいます。 プログラム(1):VB 2008年版 メインプログラム プログラム(2):C言語 2006年版 プログラム(3):VC++ VISUAL STUDIO2012 EXPRESSを使用 ■今のプログラム (2)のdllファイルを(1)で呼び出しています。問題なく動きます。 ■やりたい事 (2)のプログラム内容を変更したのが(3)です。そのdllファイルを(1)で呼び出したいです。 ⇒しかし、(3)のdllファイルを読み込むことができません。((3)のdllファイルは作れました。) (3)はVC単独では正しく動作します。 (1)のプログラムに、(2)を呼び出すときと同じように(3)用のプログラムを追加しました。作った(3)のdllファイルは指定したフォルダにきちんと入れています。 コンピューターに詳しい先輩が時間をかけてみてくれたのですが、結局わからずじまいでした。 ■質問 VBの型が古い、EXPRESSを使っているからできないのでしょうか? VCでdllを作って、VBで呼び出すまでの流れをわかりやすく紹介した書籍やWEBなどあればご教示頂けませんでしょうか? よろしくお願いいたします。

  • VC2005のDLL明示的リンク

    VC2005のDLL明示的リンクについて質問です。 <前提> DLLファイルに宣言されている関数(Export関数)が、 4ファンクションあるとします。そのDLLファイルを、 Dependency Walkerで確認すると、以下のようになります。 --------------------------- 関数名 エントリポイント --------------------------- add1 0x00001010 sub2 0x00001030 mul3 0x00001060 div4 0x00001090 <質問> このDLLファイルがexeファイルからLoadLibraryで 読み込まれた場合、プロセスメモリ上には、 上記のエントリポイントの順番で必ず配置されるのでしょうか? 補足ですが、この時、プロセスメモリ上にロードされる位置 は、気にしていません(ベースアドレスは変わることがあるのは認識しています)。 要は、エントリポイントの順番が変わったりしないかを、知りたいです。 <プロセスメモリ上に、エントリポイント順に配置されたイメージ> 0000_0000h --------------------------- (略) --------------------------- add1 --------------------------- sub2 --------------------------- mul3 --------------------------- div4 --------------------------- (略) --------------------------- FFFF_FFFFh <プロセスメモリ上に、エントリポイント順に配置されなかったイメージ> 0000_0000h --------------------------- (略) --------------------------- sub2 --------------------------- add1 --------------------------- div4 --------------------------- mul3 --------------------------- (略) --------------------------- FFFF_FFFFh それとも、こんな感じで、OS依存(実行環境依存)で、色々な配置に なるのでしょうか?

  • BCBで作成したDLLを、VC++で静的リンクさせる方法

    BCBで作成したDLLを、VC++で静的リンクさせる方法 Borland C++ Builderで作成したDLLを、VC++アプリケーションで利用できるように LIBファイルに変換したいのですが、上手くいきません。 下記の手順を踏みました。 1. BCBでDLL作成   「VC++スタイルのDLL」で作成、   「VCLを使う」「CLXを使う」「マルチスレッドを使う」はチェックせず 2. コマンドラインで「IMPDEF.exe」を使用して、dllからdefファイル作成   (IMPDEF.exeは、\Borland\CBuilder6\Binに格納されていた) 3. コマンドラインで「LINK.exe」「LIB.exe」を使用して、defからlibファイル作成   (LINK.exeとLIB.exeは、\Microsoft Visual Studio\VC98\Binに格納されていた) 4. VC++プロジェクトファイルを保存したフォルダに、DLLファイルとlibファイルをコピー 5. VC++の「プロジェクト」-「設定」-「リンク」-「オブジェクト/ライブラリモジュール」に   作成したlibファイルを追加 VC++プロジェクトをビルドすると、下記のエラーメッセージが表示されます。 ///////////////////////////////////////////////////////////////////////////////// dllread.obj : error LNK2001: 外部シンボル "__imp__(関数名)@0" は未解決です LIBC.lib(wincrt0.obj) : error LNK2001: 外部シンボル "_WinMain@16" は未解決です Release/dllread.exe : fatal error LNK1120: 外部参照 2 が未解決です。 link.exe の実行エラー ///////////////////////////////////////////////////////////////////////////////// BCBとVC++のバージョンは、下記の通りです。 BCB Professional 6.0 VC++ 6.0 ちなみに、同じDLLを動的リンクで利用することは出来ました。 初心者の質問で申し訳ございませんが、解決策が分かる方がいらっしゃいましたら 教えていただけないでしょうか?

  • VBのDLLの関数をVC++で使う

    VC++でDLLファイル(Test.dll)の関数を使いたいですが、下記の三つの関数を呼び出す場合はどうすればいいですか? 教えてください。 Test.dllの内容は以下のとおりです。 _ExportGCMS : IDispatch { _bstr_t CreateGCMSFile ( _bstr_t pCustomerName, _bstr_t pOutType, _bstr_t pOutDir ); _bstr_t AppendGCMSFile ( SAFEARRAY * * pData, _bstr_t pAppendFileName ); _bstr_t ExportCSV ( _bstr_t pSourceFile, _bstr_t pOutFileName ); } よろしくお願いします。