首页 > 解决方案 > 试图理解一个绕道(钩子)函数

问题描述

嗨,我想了解一个函数,它是关于 Windows API 挂钩的。我正在尝试挂钩 LoadLibraryA 以查看是否有任何作弊试图注入我的游戏。为此,我试图拦截对 LoadLibraryA 的任何调用。

我试图写评论来解释我的想法,但我不确定后面的部分

// src = address of LoadLibraryA in kernel32.dll,
// dst = my function prototype of LoadLibraryA
// len = 5, as we allocate a JMP instruction (0xE9)
PVOID Detour(BYTE* src, const BYTE* dst, const int len)
{
    BYTE* jmp = (BYTE*)malloc(len + 5); // allocate 10 bytes

    DWORD oldProtection; // change protection of 5 bytes starting from LoadLibraryA in kernel32.dll
    VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &oldProtection); // Changes the protection on a region of committed pages in the virtual address space of the calling process.

    memcpy(jmp, src, len); // save 5 first bytes of the start of LoadLibraryA in kernel32.dll from src to jmp
    jmp += len; // start from byte 6

    jmp[0] = 0xE9; // insert jump from byte 6 - 10: 
    // jmp looks like this currently: [8BFF] = 2 bytes [55] = 1 byte [8BEC] = 2 bytes [0xE9] = 5 bytes

    // ??
    *(DWORD*)(jmp + 1) = (DWORD)(src + len - jmp) - 5; // ?

    // ??
    src[0] = 0xE9;
    *(DWORD*)(src + 1) = (DWORD)(dst - src) - 5; // ?

    // Set the same memory protection as before.
    VirtualProtect(src, len, oldProtection, &oldProtection); 

    // ??
    return (jmp - len);
}

下面是钩子之前和之后的表示。

前: 在此处输入图像描述

后: 在此处输入图像描述

标签: c++winapi

解决方案


该函数工作正常,只需要帮助理解函数后面部分发生的事情。我不确定从这里会发生什么 jmp += len;

我注意到的第一件事是您的代码一次完成了绕道和 jmp 的所有操作,这与我通常看到的人们这样做不同。

memcpy(jmp, src, len);

您正在将窃取的字节复制到您的 shellcode 的位置

jmp 是你要跳转的地址

jmp += 长度;

长度是被盗字节的数量,或者你覆盖的字节数,它们也被复制到你 jmp 的区域,因为你仍然必须执行它们。所以你在你的shellcode中直接跟随你的相对jmp前进到字节

jmp[0] = 0xE9;

您正在编写相对跳转指令

(DWORD )(jmp + 1) = (DWORD)(src + len - jmp) - 5;

jmp + 1 = jmp 指令后需要放置相对地址的地址

(src + len - jmp) - 5是获得相对地址所需的等式

源[0] = 0xE9; (DWORD )(src + 1) = (DWORD)(dst - src) - 5;

除了在这种情况下您只是绕道而行之外,您所做的事情与您在 shellcode 中所做的事情相同。

返回(jmp - len);

您正在返回 shellcode 的地址(这有点奇怪,但您必须这样做,因为您的代码确实如此jmp +=len


推荐阅读