Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用GCC/MinGW创建代理DLL 使用Visual C++编译器,可以创建一个DLL文件,可以模仿另一个DLL文件,并将所有函数调用重定向到原始DLL。是一个工具,可以自动生成VisualC++代码。_C++_Gcc_Assembly_Dll_Dll Injection - Fatal编程技术网

使用GCC/MinGW创建代理DLL 使用Visual C++编译器,可以创建一个DLL文件,可以模仿另一个DLL文件,并将所有函数调用重定向到原始DLL。是一个工具,可以自动生成VisualC++代码。

使用GCC/MinGW创建代理DLL 使用Visual C++编译器,可以创建一个DLL文件,可以模仿另一个DLL文件,并将所有函数调用重定向到原始DLL。是一个工具,可以自动生成VisualC++代码。,c++,gcc,assembly,dll,dll-injection,C++,Gcc,Assembly,Dll,Dll Injection,生成的函数存根工作(已测试),如下所示: extern "C" __declspec(naked) void __stdcall __E__0__() { __asm { jmp p[0]; // p[0] = GetProcAddress(hL,"AcceptEx"); } } 现在我想用MinGW/GCC而不是MSVC做同样的事情 __declspec(裸体)在i386上不受GCC支持,所以我们需要另一种方法。 正如所建议的,我可以通过在全局范围内编

生成的函数存根工作(已测试),如下所示:

extern "C" __declspec(naked) void __stdcall __E__0__()
{
    __asm
    {
        jmp p[0]; // p[0] = GetProcAddress(hL,"AcceptEx");
    }
}
现在我想用MinGW/GCC而不是MSVC做同样的事情

__declspec(裸体)在i386上不受GCC支持,所以我们需要另一种方法。 正如所建议的,我可以通过在全局范围内编写汇编代码来重写函数。以下是我的代码,可以实现这一点:

__asm__
(
    "jmp *%0"
    : /* empty output list */
    : "r" (pointer_to_original_function) /* p[0] in the example above */
);
我的代码段使用。但不幸的是,这只允许在函数内部进行,而不允许在全局范围内进行

所以。。。我该怎么做?我的下一个方法是在没有扩展ASM的情况下尝试它,但是如何在汇编中获得指针地址呢

在这里,我试图从全局变量中获取它,但它在repace\u this\u stub()中出现故障:

#包括
无效尝试跳到我身上()
{
printf(“您跳转了\n”);
}
void*target\u pointer=尝试跳转到我;
__阿斯马(
“替换此\u存根:”
“jmp目标_指针”
);
无效替换此存根();
int main(int argc,字符**argv)
{   
printf(“在main中开始。\n”);
替换此存根();
printf(“返回主屏幕?\n”);
}

如果指针位于全局变量中,则只需使用其名称即可。确保应用任何名称损坏。另外,将代码放在“适用代码”部分,并为其命名。示例代码:

#include <stdio.h>

void* p = printf;

asm(
    ".section .text\n\t"
    "proxy: jmp *p\n\t"
    ".previous\n\t");
extern void proxy();
int main()
{
    proxy("Hello world!\n");
    return 0;
}
#包括
void*p=printf;
asm(
“.section.text\n\t”
“代理:jmp*p\n\t”
“.previous\n\t”);
extern void proxy();
int main()
{
代理(“你好,世界!\n”);
返回0;
}
如果要使用数组,只需添加适当的置换。扩展样本:

#include <stdio.h>
#include <string.h>

void* p[] = { printf, strcpy };
#define str(x) #x
#define PROXY(name, index) asm( \
    ".section .text\n\t" \
    str(proxy_##name) ": jmp *p + " str(index) " * 4\n\t" \
    ".previous\n\t"); \
    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;
}
#包括
#包括
void*p[]={printf,strcpy};
#定义str(x)#x
#定义代理(名称、索引)asm(\
“.section.text\n\t”\
str(代理名称):jmp*p+“str(索引)”*4\n\t\
“.previous\n\t”)\
extern void proxy_35;##name()
代理(printf,0);
委托书(strcpy,1份);
int main()
{
char-buf[128];
代理(buf,“你好,世界!\n”);
委托书(buf);
返回0;
}

指针大概位于某个全局变量中。。。所以就用它的名字吧。我不太擅长汇编,你能给我一个示例代码吗?我猜是“jmp全局变量”;不起作用——如果可能的话,我想使用某种数组,因为通常有很多函数!我研究了几个小时,你真的帮我节省了很多时间!我会给你一个投票,但我还没有足够的声誉。另外,在x86_64上编译进行测试时,需要在装配线上用8替换4,因为指针的大小是那里的两倍。它起作用了!:)
#include <stdio.h>
#include <string.h>

void* p[] = { printf, strcpy };
#define str(x) #x
#define PROXY(name, index) asm( \
    ".section .text\n\t" \
    str(proxy_##name) ": jmp *p + " str(index) " * 4\n\t" \
    ".previous\n\t"); \
    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;
}