C++ 复制的函数挂钩地址不正确

C++ 复制的函数挂钩地址不正确,c++,c,windows,hook,reverse-engineering,C++,C,Windows,Hook,Reverse Engineering,我正试图用我注入的dll钩住一个应用程序。目前,dll包含一个钩子、一个函数蹦床和一个空函数。但是,当调用挂钩函数时,目标应用程序崩溃。我查看了出错的地方,似乎替换的跳转指令跳转到了我没有指定的未知位置。经过仔细检查,我发现这个未知的地址与正确的地址非常相似。似乎未知地址是向右移动的正确地址,前面有4个垃圾位。所以我的问题是这是怎么发生的,我能纠正吗 #define FUNC_JMP 0x00433504 #define FUNC_ADDR (FUNC_JMP+1) // Tramp

我正试图用我注入的dll钩住一个应用程序。目前,dll包含一个钩子、一个函数蹦床和一个空函数。但是,当调用挂钩函数时,目标应用程序崩溃。我查看了出错的地方,似乎替换的跳转指令跳转到了我没有指定的未知位置。经过仔细检查,我发现这个未知的地址与正确的地址非常相似。似乎未知地址是向右移动的正确地址,前面有4个垃圾位。所以我的问题是这是怎么发生的,我能纠正吗

#define FUNC_JMP    0x00433504
#define FUNC_ADDR   (FUNC_JMP+1)

// Trampoline
__declspec(naked) void setup (void) { ... }    

void hook (void)
{
    DWORD protect, buf;
    DWORD adr = (DWORD) ((BYTE*) &setup - (FUNC_ADDR + 4));

    VirtualProtect ((void*) FUNC_ADDR, 4, PAGE_EXECUTE_READWRITE, &protect);
    memcpy ((void*) FUNC_ADDR, &adr, 4);
    VirtualProtect ((void*) FUNC_ADDR, 4, protect, &buf);
}
0x00433504之前:
jmp dword ptr ds:[0x1F8BAC4]

0x00433504之后:
jmp fword ptr ds:[0x10B51DC]

adr的实际值:
0x0B51DC2D


TLDR;为什么I memcpy'd的值不完整并向右移动了4位。

A
jmp dword
指令有一个2字节的操作码,您只跳过其中的一个字节。 (参见
#定义函数地址(FUNC_JMP+1)

因此,您正在覆盖指令的一部分,而忽略地址的一部分。
这也被你所发布的第二条指令所指示,因为它现在是一个<代码> JMP-fWord <代码>,而不是<代码> JMP-dWord < /C> >。< /P>这看起来不像C++代码。不要添加无关的标签。@奥拉夫,你可以知道它是C++或者C。不要添加无关的注释。答案可能取决于实际语言,如你所想的那样。如果你不知道,你显然不知道C++,但是,你调用了未定义的Baaviv,所以在进一步的研究中没有用。