ヘッダファイルやソースコードのないdllのバイナリからヘッダ情報を引き出せるツールってありますか?

(もしくは不可能でしたらその解説をしていただけますでしょうか。)
OSはwindows xp proです。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/06/22 16:12:03
  • 終了:--

回答(3件)

id:virus No.1

virus回答回数182ベストアンサー獲得回数12005/06/22 16:26:04

ポイント20pt

http://www.vector.co.jp/vpack/filearea/win/prog/asm/index.html

Download: Windows > プログラミング > アセンブラ・逆アセンブラ

C/C++ を前提で書きますが、他の言語でも似たようなもの(or そもそもヘッダーファイルなどない)です(^^ゞ

オリジナルの、と言う意味では不可能です。

ヘッダーファイルには一般的に多くの定数定義がありますが、バイナリになってしまえば定数は単なる数値ですから、機械的に推測することは不可能です。

ただ、限定的な意味で関数定義などを再現することは、逆アセンブラ、逆コンパイラなどを使えば完全ではないですが可能です。

id:anonymouspage

なるほど。そのdllについて、関数のマニュアルは持っていまして、そこで使われている変数の型が何かがわかればそれでいいのですが、その程度なら何か方法はあるかもしれない・・・? マニュアルで関数の引数として”hogeU32 variable”などと書いてあるのはU32だなとすぐわかるのですが、そうじゃないのもあるもので・・・(説明が意味不明でしたらどなたか突っ込んでいただければ幸いです・・・)

2005/06/22 17:46:47
id:kanata_ail No.2

kanata_ail回答回数98ベストアンサー獲得回数02005/06/22 16:57:22

ポイント20pt

http://www.borland.co.jp/qanda/lang/l0003027.html

Borland Answers - Borland Answers

ボーランド製品は .DLL から .LIB ファイルを作成するため,「IMPLIB」というユーティリティー・プログラムを提供しています。このツールを「大/小文字を区別する」ために, -c オプションを付けて,.LIB ファイルを生成します。この過程で,.LIB ファイルをブラウズし,関数名を探すことができます。

id:anonymouspage

もしコンパイラがVisual C++だったならこっち(http://support.microsoft.com/kb/q131313/)ということでしょうか。よく読んでみます。

2005/06/22 17:56:52
id:virus No.3

virus回答回数182ベストアンサー獲得回数12005/06/22 18:48:00

ポイント100pt

http://www.hatena.ne.jp/1119424323

人力検索はてな - ヘッダファイルやソースコードのないdllのバイナリからヘッダ情報を引き出せるツールってありますか? (もしくは不可能でしたらその解説をしていただけますでしょうか。) OS..

二回目なのでこれで最後です。ポイントも不要です(^^ゞ

IMPLIBにしてもそうですが、わかるのはあくまでも関数名だけです。C++の場合、たとえばC++としてexportしている場合は引数の型なども関数名に記号化されて含まれてますので、その記号解釈のルールを適用すれば、ある程度引数まで含めた関数定義を再現することは可能です。ただし下記の問題はこの場合のも当てはまりますので完全には行きません。

そしてCとしてexportされている場合は関数名しかわかりませんので引数等も再現出来ません。

逆コンパイラなどは呼び出し形式からある程度引数の型を推測しますが、基本的には下記と同様の問題があるので完全には行きません。

関数の説明書があるとのことですが、それにどの程度書かれているのかにもよりますが、型が単に「hogeU32」等の名前しか示されておらず、しかもそれが一般的な名称でないならヘッダーファイルを推測することは難しいです。あくまでもプログラム的に整合性のある定義を再現するのが限界です。

と言うのは、元のヘッダーで


typedef long hogeU32;


と定義されていたものと、


typedef struct { short aa, bb; } hogeU32S;


と定義されていたものは、見かけ上は同じ32ビット値ですが定義も異なれば意味も違いますね。でも値としてやり取りするのは32ビットの数値でしかありませんから、どちらの定義を使おうと実際のコードの見かけは変わりません。

この同じ見かけのバイナリから、上記の二つ(あるいはそれ以外にも無限に可能性は考えられますね)のどちらであるかを決定するのは不可能です。

つまり説明書の記述以上のものを再現するのはかなり難しいと考えざるを得ないでしょう。

id:anonymouspage

なるほど、ようやく理解してきました。無知でお恥ずかしい限りです。ありがとうございます。

2005/06/22 19:59:23

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません