c++ - 试图理解一个绕道(钩子)函数
问题描述
嗨,我想了解一个函数,它是关于 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);
}
下面是钩子之前和之后的表示。
解决方案
该函数工作正常,只需要帮助理解函数后面部分发生的事情。我不确定从这里会发生什么 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
)
推荐阅读
- xpath - XPath 来跟踪一个产品是否是:有货/它的价格
- node.js - res.send() 发送空对象
- eclipse - 我一直在 MacOS Mojave 上收到类似“无法创建 Java 虚拟机”的消息
- react-native - 图像未在具有承载令牌身份验证的本机反应中加载
- bluetooth-lowenergy - BlueZ BLE 加密特性读取在绑定和连接后失败
- r - 如何用数值替换分类值?
- parallel-processing - 在 MPI_Send 或 MPI_Ssend 之后立即调用 MPI_Finalize 是否安全?
- r - 在 r 中使用双 x 轴绘制刻度数据
- arrays - 无法在颤动中显示图标 onTap
- python - 如何在 Pandas DataFrame 中按单个行添加新列数据