21

DLL からエクスポートされた (C スタイル?) 関数のシグネチャ (パラメータの数/型、戻り値の型) を取得することは可能ですか? 関数名、アドレス、序数などのリストはDLL Export Viewerで表示できますが、シグネチャは表示できません。dll ファイルしかなく、.h ファイルも .def ファイルもありません。

更新: API Monitorというツールを使用して、上記の dll を使用するプロセスにアタッチし、関数の呼び出しを確認できます。これにより、パラメーターの数、戻り値、およびそれらの整数値 (ポインター?) を確認できますが、あまり役に立ちません。おそらく、呼び出し時にこれらのポインターが指している構造のタイプを判別する方法を見つける必要があります。

4

3 に答える 3

21

DLL は、エクスポートする関数の署名を保存しません。他の回答では C++ について言及されており、C++ 関数がC++ としてエクスポートされると、名前は実際にマングルされます。適切なコンパイラのマングリング方式でデマングルすると、署名が得られます。ただし、ほとんどの DLL は、C++ 名を使用して C++ 関数をエクスポートしません。代わりに、DLL がエクスポートすることを選択した関数は、C スタイルの名前を使用してエクスポートされるため、DLL が C++ で記述されていたとしても、エクスポートされた関数にはシグネチャ情報が含まれません。

ヘッダーがありませんか?ほとんどのベンダーは、SDK にそのようなものを含めています。入手できなかった場合は、ベンダーに苦情を申し立ててください。取得する必要がなかった場合は、タスクを間違った方法で行っている可能性があります。そのDLLを直接使用することになっていますか?

ヘッダー ファイルがない場合は、プログラムで DLL を使用することが法的に本当に許可されているかどうかを自問することもできます。それがあなたのシステム上で見つけた単なる任意の DLL である場合、コードを記述できたとしても、プログラムを出荷するときに再配布することはおそらく許可されていません。

于 2008-12-22T15:18:41.823 に答える
5

C 関数の場合、この情報は DLL にまったく保存されません。私が提案できる唯一のことは、関数を逆アセンブルし、それがスタック上の変数とどのように相互作用するかを調べてから、署名を特定しようとすることです。

幸運を!

于 2008-12-22T12:28:43.507 に答える
3

C++ では、関数シグネチャは、コンパイラに依存する方法で名前に"マングル" されます。これは C では発生しません。したがって、DLL に C 関数がある場合は、マングルされていない名前が表示されます。それが C++ の場合、破損したものが表示されます。

C++ では、リンカがオーバーロードされた関数を異なるシグネチャで解決できるように、マングル名が必要です。

「C」DLLから関数記号を取得する方法はないと思います。それらは単に存在しません。

于 2008-12-22T12:24:40.550 に答える