函数钩子地址复制不正确

时间:2015-09-23 15:01:27

标签: c++ c windows hook reverse-engineering

我正在尝试使用我注入的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;为什么我的memcpy值不完整并向右移4位。

1 个答案:

答案 0 :(得分:1)

jmp dword指令有一个2字节的操作码,你只跳过一个字节。 (参见#define FUNC_ADDR (FUNC_JMP+1)

因此,您要覆盖指令的一部分,并忽略地址的一部分。 您发布的第二条说明也表明了这一点,因为它现在是jmp fword而不是jmp dword