2

dll ファイル内の関数の呼び出しに関する質問があります。私がよく理解している場合、dll ファイルでは、.exe ファイルによって呼び出される可能性のある多くのさまざまな関数を定義できます。たとえば、a.dllファイルから呼び出すことができる関数には、次の関数が含まれます。

void fun1(int k);
int  fun2(float value);
float fun3(double sig);

たとえば、特定のプログラムの場合、他の関数を使用せずに関数をa.exe呼び出すだけです。それから私の質問は、.exe プログラムの実行時に呼び出される関数をどのように知ることができるかということです。fun1a.dll

4

2 に答える 2

4

実行可能ファイルのシンボルテーブルで、インポートされたシンボルを確認できます。Windows(.exeファイル)の場合は、ここで説明するようにDUMPBINユーティリティを/IMPORTS使用できます。

更新:コメントで述べたように、実行可能ファイルはDLLをロードし、コンパイル時にシンボルを作成しない方法でDLLに動的にアクセスできます。たとえば、LoadLibraryを使用してDLLをロードした後にGetProcAddressを呼び出す。この場合、シンボルは存在せず、リストされませんが、関数は呼び出される場合と呼び出されない場合があります。DUMPBIN

exeがどのように機能するかを多かれ少なかれ知っていて、動的に処理を行っていないように見える場合(プラグインDLLからのコードのロードなど)、動的ロードが発生していないと想定しても安全です。さらに、exeのシンボルテーブルに特定のDLLの一部の関数が表示されている場合、exeが同じDLLの関数に動的にアクセスしている可能性はほとんどありません。

また、関数がシンボルテーブルに表示されるという事実は、その関数がexeによって呼び出されることを保証するものではありませんが、通常の静的な場合には、その可能性が非常に高くなります。

于 2013-01-07T15:49:41.953 に答える
1

依存関係ウォーカーを使用できます

「Dependency Walker は、32 ビットまたは 64 ビットの Windows モジュール (exe、dll、ocx、sys など) をスキャンし、すべての依存モジュールの階層ツリー図を作成する無料のユーティリティです。見つかったモジュールごとに、すべてのモジュールを一覧表示します。そのモジュールによってエクスポートされた関数、およびそれらの関数のどれが実際に他のモジュールによって呼び出されているか. 別のビューには、必要なファイルの最小セットが、ファイルへのフルパス、ベースアドレス、バージョン番号、マシンタイプ、デバッグ情報など。」

于 2013-01-07T15:50:51.763 に答える