3

シナリオは次のとおりです。

このライブラリ「library.dll」に依存するこのアプリケーション「アプリ」があるとしましょう。関数呼び出し「アプリ」が実行中に行うことを知りたいです。「App」または「library.dll」のソースコードにアクセスできないと仮定しますが、存在するすべての関数の名前と引数は「library.dll」です。「library.dll」のどの関数が「App」によって呼び出されているかをどうにかして見つける方法はありますか?

私はstackoverflowで同様の質問を見ました:dllメソッド呼び出しをインターセプトする方法は?

Ates Goral氏が興味をそそられた答えは、関数呼び出しを実際のDLLに転送するwrapperDLLを作成することについて言及しています。私は、誰かがこれをどのように達成できるかについての洞察を私に提供してくれるか、問題に関する情報を得ることができる場所を私に教えてくれることを望んでいました。

私が最も興味を持っている2つの部分は、アプリケーションに.dllをロードさせることと、関数を元の「library.dll」に実際に転送する方法です。

ありがとうございました

4

1 に答える 1

8

ラッパーDLLは完璧に機能します-これがどのように機能するかです:

library.dllエクスポートを想定してみましょうint somefunct(int i, void* o)-あなたは今、次のようなものであなた自身のDLLを作成します

#include <windows.h>

//Declare this for every function prototype
typedef int (*int_f_int_pvoid)(int,void*);

//Declare this for every function
int_f_int_pvoid lib_somefunct


//this snipplet goes into dllmain
...
HINSTANCE hlibdll = LoadLibrary("X:\PATH\TO\renamed_library.dll");
//For every function
lib_somefunct=(int_f_int_pvoid)GetProcAddress(hlibdll,"somefunct");
...


//Again for every function    
int somefunct(int i, void* o)
{
    //Log the function call and parameters
    //...

    //Call library.dll
    int result=lib_somefunct(i, o);


    //Log the result 
    //...

    return result;
}

関数をエクスポートlibrary.dllし、元の名前をに変更した後、結果のDLLに名前を付けます。renamed_library.dll

これで、ターゲットEXEが(your)library.dllをロードし、次に(元の、ただし名前が変更された)がロードされますrenamed_library.dll。ターゲットプログラムが関数を呼び出すたびに、logginコードが実行されます。

警告:ターゲットEXEはマルチスレッド化されている可能性があるため、スレッドセーフなロギングメカニズムを用意してください。

このメソッドを使用して、奇妙なMAPIの問題をデバッグすることに成功しました。

于 2012-05-27T02:23:14.643 に答える