站点背景图
头像
Tsingten

偶尔记录一点.

首页 » 默认分类 » [Windows][内核攻防] Inline Hook与Hotfix Hook

[Windows][内核攻防] Inline Hook与Hotfix Hook

作者: Tsingten 时间: 41天前 评论: 0 条

Inline Hook vs. Hotpatch Hook

在软件安全、系统监控、调试和打补丁领域,Hook (钩子) 技术是核心工具之一。它允许我们在不修改程序源代码的情况下,改变函数的执行流程。

1. Inline Hook (内联钩子)

Inline Hook 是最通用、最直接的 Hook 方法,它通过直接修改目标函数入口处的代码来实现劫持。

原理概述

Inline Hook 的核心思想是用一条跳转指令覆盖目标函数起始处的若干字节

  1. 覆盖 (Overwriting): 读取目标函数起始的 $N$ 个字节(通常 $N \ge 5$ 字节,足以容纳一个 $\text{JMP}$ 或 $\text{CALL}$ 指令)。
  2. 跳转 (Jumping): 将这 $N$ 个字节替换成一条 长 $\text{JMP}$ 或 $\text{CALL}$ 指令,使其跳转到我们预先写好的 Hook 处理函数
  3. 跳板 (Trampoline): 为了让原始函数在 Hook 逻辑执行完毕后能够继续执行,我们需要创建一个 跳板函数。跳板函数内部包含:

    • 被覆盖的 $N$ 个原始指令。
    • 一条 $\text{JMP}$ 指令,跳转回原始函数中被覆盖指令的下一条指令处。

优点与缺点

优点缺点
普适性强: 适用于任何没有特殊保护、代码长度足够长(能被 $\text{JMP}$ 指令覆盖)的函数。线程不安全/非原子性: 替换指令时,如果另一个线程恰好在执行被替换的指令,可能导致崩溃或行为异常。
拦截能力强: 可以拦截非导出函数(没有在导入表中的函数)。复杂性高: 必须精确计算和处理被覆盖的原始指令(Trampoline 的实现)。

2. Hotpatch Hook (热补丁钩子)

Hotpatch Hook 是 Inline Hook 的一种特殊形式,它专为实现 不停机打补丁 (Hotfix) 而设计,因此要求目标函数在编译时就做出特殊准备。

原理概述

Hotpatch Hook 利用了操作系统厂商在编译 DLL 时刻意预留的结构,通常是在函数真正的起始点之前。

对目标函数的要求:
目标函数必须使用特定编译器选项(如 MSVC 的 /hotpatch/FUNCTIONPADMIN)编译。这会使得函数入口具有以下结构:

  1. 预留空间: 在函数入口地址之前,编译器预留了几个字节(通常是 $\text{NOP}$ 或 MOV EDI, EDI 等无副作用指令)。
  2. 短 $\text{JMP}$ 结构: 有时函数入口本身是一条短 $\text{JMP}$ 指令。

核心区别与流程

Hotpatch Hook 的关键在于它 不破坏 函数的原始功能代码。

  1. 修改预留指令: 将函数入口地址前的预留指令(通常是 2 字节的 $\text{NOP}$ 或 MOV EDI, EDI原子性地 替换为一条短 $\text{JMP}$ 指令。
  2. 跳转到 Hook: 这条短 $\text{JMP}$ 指令跳转到 Hook 逻辑。

优点与缺点

优点缺点
高安全性/原子性: 修改预留的 $\text{NOP}$ 空间比修改原始执行代码更安全,更易于实现原子操作。依赖性强: 目标函数必须是使用特定编译器选项编译的,否则无法使用此方法。
官方支持: 是 Windows 等操作系统官方打补丁(Hotfix)采用的主要方式。适用范围窄: 不能用于未经特殊编译的第三方程序或自行编译的组件。

评论
插入
插入
😀😃😄😁😆😅🤣😂🙂🙃😉😊😇🥰😍🤩😘😗😚😙😋😛😜🤪😝🤑🤗🤭🤫🤔🤐🤨😐😑😶😏😒🙄😬🤥😌😔😪🤤😴😷🤒🤕🤢🤮🤧🥵🥶🥴😵🤯🤠🥳😎🤓🧐😕😟🙁☹️😮😯😲😳🥺😦😧😨😰😥😢😭😱😖😣😞😓😩😫🥱😤😡😠🤬
🖐️