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

1

这在 C++ 级别是不可能的(你的代码也是令人作呕的 C,而不是真正的 C++)。您的示例代码甚至不适用于functionWrapper所有可变参数必须在堆栈上传递,但 ABI 要求常规参数(前几个)在寄存器中传递。

你将不得不去组装。

于 2013-05-07T11:59:10.177 回答
0

感谢这里的答案

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

我想,你的代码几乎就在那里......你只需要让你的蹦床函数不会>损坏堆栈......首先应该声明该函数是裸的(没有默认序言,在 >studio 我相信它会像__declspec(naked) 或其他东西)...其次,您需要>考虑在调用原始函数后是否需要做某事...如果没有,我认为 > 最好只是简单地进行 jmp 而不是调用(使用内联汇编程序或其他东西)...

这是我的代码。在 Windows 7 64 位但 32 位编译时使用 vs2012。简单的 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 回答