使用Visual C++编译器,可以创建一个DLL文件,该文件可以模拟另一个DLL文件并将所有函数调用重定向到原始DLL。这里是一篇文章,介绍了一种可以自动生成Visual C++代码的工具。
生成的函数存根已经测试通过,并且看起来像这样:
现在我想使用MinGW/GCC而不是MSVC来做同样的事情。
__declspec(naked)在i386上不受GCC支持,因此我们需要另一种方法。正如这里建议的那样,我可以通过在全局范围内编写汇编代码来覆盖函数。以下是应该起作用的代码:
我的代码片段使用了GCC扩展的ASM。但是不幸的是,这只允许在函数内部使用,而不是在全局范围内使用!
那么...我该怎么办?我的下一个尝试是尝试在没有扩展ASM的情况下进行,但是如何在汇编中获取指针地址呢?
这里我正在尝试从全局变量中获取它,但是它在replace_this_stub()处崩溃了:
生成的函数存根已经测试通过,并且看起来像这样:
extern "C" __declspec(naked) void __stdcall __E__0__()
{
__asm
{
jmp p[0]; // p[0] = GetProcAddress(hL,"AcceptEx");
}
}
现在我想使用MinGW/GCC而不是MSVC来做同样的事情。
__declspec(naked)在i386上不受GCC支持,因此我们需要另一种方法。正如这里建议的那样,我可以通过在全局范围内编写汇编代码来覆盖函数。以下是应该起作用的代码:
__asm__
(
"jmp *%0"
: /* empty output list */
: "r" (pointer_to_original_function) /* p[0] in the example above */
);
我的代码片段使用了GCC扩展的ASM。但是不幸的是,这只允许在函数内部使用,而不是在全局范围内使用!
那么...我该怎么办?我的下一个尝试是尝试在没有扩展ASM的情况下进行,但是如何在汇编中获取指针地址呢?
这里我正在尝试从全局变量中获取它,但是它在replace_this_stub()处崩溃了:
#include <stdio.h>
void try_to_jump_to_me()
{
printf("you made the jump\n");
}
void* target_pointer = try_to_jump_to_me;
__asm__ (
"replace_this_stub:"
"jmp target_pointer"
);
void replace_this_stub();
int main(int argc, char** argv)
{
printf("starting in main. \n");
replace_this_stub();
printf("back in main?\n");
}