c++ - 函数钩子(Hook)地址复制错误

标签 c++ c windows hook reverse-engineering

我正在尝试使用我注入(inject)的 dll Hook 应用程序。目前,dll 包含一个钩子(Hook)、一个函数 trampoline 和一个空函数。但是,当调用 Hook 函数时,目标应用程序崩溃。我看了看哪里出了问题,似乎替换的跳转指令跳转到了我没有指定的未知地方。仔细检查后,我意识到这个未知地址看起来与正确地址非常相似。未知地址似乎是正确的地址向右移动,前面有 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位。

最佳答案

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

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

关于c++ - 函数钩子(Hook)地址复制错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32743059/

相关文章:

c++ - 如何在 Linux 上使用 Boost/Json

c++ - 具有新数据成员的多态性

c - Linux 系统调用与 C 库函数

c - 从 execvp 将 stdout 写入文件

C 如何改变单词的颜色

c++ - 为什么 ADL 不能使用未命名的 initializer_list?

windows - 如何获取与进程关联的 GDI 对象

c++ - 将文本打印到 Windows 输入文本框中

windows - 在 Windows 中使用 lua os.execute 启动程序,无需 CMD 闪现

c++ - 获得自适应迭代器的快速而肮脏的方法是什么?