1

dll インジェクションを使用して外部プログラムを監視したいのですが、このチュートリアルに従うことができました 。http://www.codeproject.com/Articles/4118/API-Monitoring-Unleashed

外部プログラムの任意の関数を、署名を知らなくても監視できるようにしたい元の関数に送信されたパラメータをコピーして、ラッパー関数に渡し、元の関数に戻すことができるようにしたい

それはどのように行うことができますか?私はアセンブリ言語に慣れていないので、あまり使いません。

私がやろうとしていることを示すコードは次のとおりです。

#include "stdafx.h"
void (*pointerToOriginalFunctionForOverride)(...);
void (*copyPointerOfOriginalFucntion)(...);
//let say we dont know the signature of this function
void _cdecl originalFunction(char *s)
{
    printf("%s",s);
}

void functionWrapper(void *first)
{
    printf("Some debug info\n");
    //HERE IS MY PROBLEM
    copyPointerOfOriginalFucntion(?????????????);
}




int _tmain(int argc, _TCHAR* argv[])
{
    pointerToOriginalFunctionForOverride = (void (*)(...))(&functionWrapper);
    copyPointerOfOriginalFucntion = (void (*)(...))(&originalFunction);

    //let say this line runs from an external program that we injected a dll into
    pointerToOriginalFunctionForOverride("some text in external program");

}
4

2 に答える 2

0

ここの答えのおかげで

http://www.rohitab.com/discuss/topic/39969-hook-function-without-knowing-signature/

私は、あなたのコードでほとんどそこにあると思います...トランポリン関数を>スタックに損傷を与えないようにする必要があるだけです...最初に、関数は裸で宣言する必要があります(デフォルトのプロローグなしで、スタジオでは>次のようなものになると思います__declspec(naked) か何か)... 次に、元の関数を呼び出した後に何かを行う必要があるかどうかを考える必要があります...そうでない場合は、呼び出すのではなく、単純に jmp を作成する方がよいと思います(インラインアセンブラか何かを使用して)...

これが私のコードです。Windows 7 64ビットでvs2012を使用しましたが、32ビットコンパイル。シンプルな win32 コンソール アプリ。それが他の誰かに役立つことを願っています

#include "stdafx.h"
void originalFunction(int x,int y,int z)
{
    printf("running originalFunction with x=%d\n",x);
}
__declspec(naked) void trampolineFunction()
{
    __asm jmp [originalFunction]
}
int _tmain(int argc, _TCHAR* argv[])
{
    ((void (*)(...))trampolineFunction)(7,8,9);
     getchar();
    return 0;
}
于 2013-05-12T11:05:12.433 に答える