小小沫涵 发表于 2022-1-16 14:16

C++17、x86/x64 挂钩库

运行环境:
如 WIN10
涉及工具:VS2017/VS2019
如 VS2008、eclipse
编程语言:C++
如 C、java

以下为主题内容:
[*]capstone 和 zydis 都支持作为反汇编后端,并且是完全抽象的。
[*]内联挂钩(x86/x64 Detour)

[*]在序言处放置一个 jmp 到回调,然后分配一个蹦床以继续执行原始函数
[*]完全在中间指令对象上运行,反汇编引擎是可交换的,默认包含顶点
[*]编译时未知调用 conv 时的 JIT 回调(参见 ILCallback.cpp)
[*]遵循已经挂钩的功能
[*]解决间接调用,例如通过 iat 和 hooks 底层函数
[*]重新定位序言并解析所有位置相关的代码

[*]分支到覆盖部分被解析到新的移动位置
[*]从移动的序言回到原始部分的 jmp 是通过 jmp 表解决的
[*]已移动部分内的重定位已解决(不使用重定位表,使用引擎反汇编)
[*]x64 trampoline 不限于 +- 2GB,可以在任何地方,避免阴影空间 + 没有寄存器被破坏。
[*]如果内联钩子在中间步骤失败,则原始函数不会格式错误。所有写入都是批处理的,直到我们知道后面的步骤成功为止。
[*]完全支持跨架构挂钩。包括覆盖内存访问例程以允许从 32 位进程读取/写入 64 位内存。如果您足够聪明地编写回调所需的 shellcode,您可以从 32 位进程中挂钩 64 位。
[*]实现了有效的重新挂钩逻辑。这可用于对抗第三方将序言覆盖回原始字节。这被优化为几个简单的 memcpy,而不是在 hook() 中重新执行整个逻辑。
[*]运行时内联挂钩

[*]普通内联挂钩的所有优点,但 JIT 是与给定 typedef 和 A??BI 兼容的翻译存根。翻译存根会将参数移动到一个小结构中,该结构作为指向回调的指针传递,并允许欺骗返回值。这允许工具在运行时生成钩子翻译存根,允许在运行时才知道 typedef 的函数的完全内联钩子。
[*]虚拟功能交换 (VFuncSwap)

[*]交换 C++ VTable 中给定索引处的指针以指向回调
[*]虚拟表交换 (VTableSwap)

[*]在 c++ VTable 上执行深拷贝,并用新分配的副本替换指向表的指针。然后交换副本中的指针条目以指向回调
[*]软件断点挂钩(BreakpointHook)

[*]用 0xCC 覆盖函数的第一个字节并在异常处理程序中调用回调。为用户提供一种自动恢复原始覆盖字节的方法
[*]硬件断点挂钩(HWBreakpointHook)

[*]设置 CPU 的调试寄存器,为调用线程添加一个硬件执行 BP。在异常处理程序中调用回调。请记住,HW BP 是每个线程的,调用 hook() 的线程必须与被挂钩的线程相同。您可能会发现一个快速绕道,然后在绕道回调中设置 HWBP,然后取消挂钩成为一个有用的构造。
[*]导入地址表挂钩 (IatHook)

[*]通过 PEB 解析加载的模块,找到 IAT,然后将 thunk 指针交换到回调。
[*]导出地址表挂钩(EatHook)

[*]通过 PEB 解析加载的模块,找到 EAT,然后交换指针以导出到回调。由于这是一个 32 位的偏移量,我们可以选择分配一个蹦床存根,以在超过 32 位时将其完全传输到回调。`

下载地址 https://lomo.lanzouo.com/ipW1Jyucm4h


1265029462 发表于 2022-1-22 08:36

大佬无敌

高贵与白羊 发表于 2022-1-22 22:43

被标题吸引进来了,回复看看

糟糕笑 发表于 2022-1-22 22:53

谢谢分享

独特迎豆芽 发表于 2022-1-22 22:54

威武霸气!

gesq32957 发表于 2022-1-23 16:33

大佬牛批!顶!!

含羞草41 发表于 2022-1-23 16:34

大佬无敌

omgTsQ6917 发表于 2022-1-24 01:39

好家伙,我直接好家伙!!

hZW13 发表于 2022-1-24 01:40

谢谢分享

NZbn70245 发表于 2022-1-24 05:56

感谢楼主
页: [1] 2 3 4 5 6 7 8
查看完整版本: C++17、x86/x64 挂钩库