15

dll からメソッドを呼び出したいのですが、ソースもヘッダー ファイルもありません。メソッドの名前を確認するために dumpbin /exports を使用しようとしましたが、メソッドのシグネチャを見つけることができますか?

このメソッドを呼び出す方法はありますか?

ありがとう、

4

6 に答える 6

10

関数が C++ の関数である場合、マングルされた名前から関数のシグネチャを導き出すことができる場合があります。Dependency Walkerは、これを行うツールの 1 つです。ただし、DLL が C リンケージで作成された場合 (Dependency Walker がこれを教えてくれます)、運が悪いです。

于 2009-02-16T21:18:02.170 に答える
7

C++ 言語は dll について何も知りません。

これはWindows上ですか?1つの方法は次のとおりです。

  • depends.exe付属の dll を開きます(Visual Studio)
  • 呼び出したい関数の署名を確認します
  • この dll をロードするために使用LoadLibrary()します (パスに注意してください)。
  • GetProcAddress()呼び出したい関数へのポインタを取得するために使用します
  • この関数へのポインターを使用して、有効な引数で呼び出しを行います
  • を使用FreeLibrary()してハンドルを解放します

libところで: この方法は、関連ファイルを使用してソースをコンパイルするコンパイル時の動的リンクとは対照的に、一般にランタイム動的リンクとも呼ばれます。

*nixes を使用した同様のメカニズムがいくつかありますがdlopen、その後、メモリが失敗し始めます。何かが呼び出されるobjdumpnm、関数の検査を開始する必要があります。

于 2009-02-16T21:18:57.050 に答える
5

おわかりのように、DLL のエクスポート リストには名前のみが格納され、署名は格納されません。DLL が C 関数をエクスポートする場合、関数を逆アセンブルしてリバース エンジニアリングし、メソッド シグネチャを特定する必要があります。ただし、C++ はエクスポート名のメソッド シグネチャをエンコードします。メソッド名と署名を結合するこのプロセスは、「名前マングリング」と呼ばれます。 この Stackoverflow questionには、マングルされたエクスポート名からメソッド シグネチャを判断するためのリファレンスがあります。

無料の「Dependency Walker」(別名「depends」)ユーティリティを試してください。「C++ 関数の装飾を解除」オプションは、C++ メソッドのシグネチャを決定する必要があります。

于 2009-02-16T21:25:16.363 に答える
4

その分解の始まりを分析することにより、C関数のシグネチャを理解することが可能です。関数の引数はスタック上にあり、関数はそれらを逆の順序で読み取るためにいくつかの「ポップ」を実行します。引数の名前は見つかりませんが、引数の数とタイプはわかるはずです。戻り値を使用すると、状況がさらに難しくなる可能性があります。これは、「eax」レジスタを介するか、最後の疑似引数(スタックの最上位)として関数に渡される特別なポインタを介する場合があります。

于 2009-03-08T07:10:06.457 に答える
1

関数がそこにあることを実際に知っているか、強く疑っている場合は、loadLibrary を使用して DLL を動的にロードし、getProcAddress を使用して関数へのポインターを取得できます。MSDNを参照

これはライブラリを手動で動的にロードする方法であることに注意してください。関数ポインターを使用するには、関数ポインターにマップするための正しい関数シグネチャを知る必要があります。私の知る限り、ロード時の機能でdllを使用し、ヘッダーファイルなしで関数を使用する方法はありません。

于 2009-02-16T21:20:23.117 に答える
1

非外部関数の呼び出しは、サード パーティの DLL が更新されるたびにプログラムを中断させる優れた方法です。

そうは言っても、undnameユーティリティも役立つ場合があります。

于 2009-02-16T21:25:38.877 に答える