使用GCC/Mingw创建代理DLL



使用Visual C 编译器,可以创建一个DLL文件,该文件可以模仿另一个DLL文件并将所有函数调用重定向到原始DLL。这是一篇文章,该文章的工具可以自动生成Visual C 代码。

生成的函数台词工作(已测试),看起来像这样:

extern "C" __declspec(naked) void __stdcall __E__0__()
{
    __asm
    {
        jmp p[0]; // p[0] = GetProcAddress(hL,"AcceptEx");
    }
}

现在,我想使用mingw/gcc而不是MSVC做同样的事情。

__ extspec(Naked)在I386上不支持GCC,因此我们需要另一种方式。如下所示,我可以通过在全局范围中编写汇编代码来覆盖功能。这是我的代码应该解决问题:

__asm__
(
    "jmp *%0"
    : /* empty output list */
    : "r" (pointer_to_original_function) /* p[0] in the example above */
);

我的摘要使用GCC的扩展ASM。但是不幸的是,这仅允许在函数的内部中,而不允许在全局范围内!

那么...我该怎么做?我的下一个方法是在不扩展ASM的情况下尝试它,但是如何在汇编中获取指针地址?

在这里,我正在尝试从全局变量获取它,但是它可以在repace_this_stub():

上进行segfault。
#include <stdio.h>
void try_to_jump_to_me()
{
    printf("you made the jumpn");
}
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");
}

如果指针在全局变量中,则可以使用其名称。确保应用任何名字杂乱无章。还将您的代码放在适用的代码部分中,并给它一个名称。示例代码:

#include <stdio.h>
void* p = printf;
asm(
    ".section .textnt"
    "proxy: jmp *pnt"
    ".previousnt");
extern void proxy();
int main()
{
    proxy("Hello world!n");
    return 0;
}

如果要使用数组,只需添加适当的位移即可。扩展样品:

#include <stdio.h>
#include <string.h>
void* p[] = { printf, strcpy };
#define str(x) #x
#define PROXY(name, index) asm( 
    ".section .textnt" 
    str(proxy_##name) ": jmp *p + " str(index) " * 4nt" 
    ".previousnt"); 
    extern void proxy_##name()
PROXY(printf, 0);
PROXY(strcpy, 1);
int main()
{
    char buf[128];
    proxy_strcpy(buf, "Hello world!n");
    proxy_printf(buf);
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新