
DLLHijackHunter v2.5.0
自动化的DLL劫持发现、验证和确认。将本地错误配置转化为武器化的、已确认的攻击路径。
DLLHijackHunter
作者 ProjectMerai
自动化 DLL 劫持发现、验证与确认
将本地错误配置转化为武器化的、已确认的攻击路径。
概述
DLLHijackHunter 是一款自动化的 Windows DLL 劫持检测工具,超越了静态分析的范畴。它通过多阶段流水线来发现、验证并确认 DLL 劫持机会:
- 发现 — 枚举服务、计划任务、启动项、COM 对象以及 AutoElevate UAC 绕过向量中的二进制文件
- 过滤 — 通过智能硬门控和软门控消除误报
- 金丝雀确认 — 部署一个无害的金丝雀 DLL 并触发目标二进制文件,以证明劫持有效
- 评分与报告 — 通过分层置信度系统按可利用性对发现结果进行排序
大多数 DLL 劫持工具止步于“这个 DLL 可能可被劫持”。DLLHijackHunter 则尝试对其进行验证,与已知的漏洞利用情报进行交叉比对,并在可能的情况下确认真实的执行路径。
架构
flowchart TB
subgraph Phase1["阶段 1:发现"]
SE["静态引擎<br/>服务、任务、启动项、<br/>COM、运行键"]
AE["AutoElevate 引擎<br/>清单 + COM UAC 绕过"]
PE["PE 分析器<br/>导入表、延迟加载、<br/>清单、导出"]
ETW["ETW 引擎<br/>实时 DLL 加载<br/>监控"]
SO["搜索顺序<br/>计算器"]
end
subgraph Phase2["阶段 2:过滤流水线"]
direction LR
HG["硬门控<br/>(二进制淘汰)"]
SG["软门控<br/>(置信度调整)"]
end
subgraph Phase3["阶段 3:加载验证(--verify-load)"]
LP["LoadProbe<br/>子进程加载器测试<br/>放置并移除探测 DLL"]
end
subgraph Phase4["阶段 4:金丝雀"]
CB["金丝雀 DLL 构建器"]
TE["触发器执行器"]
VF["验证"]
end
subgraph Phase5["阶段 5:输出"]
SC["分层评分器"]
RC["控制台报告"]
RJ["JSON 报告"]
RH["HTML 报告"]
end
SE --> PE --> SO
AE --> PE
ETW --> SO
SO --> Phase2
HG --> SG
Phase2 --> Phase3
Phase3 --> Phase4
CB --> TE --> VF
Phase4 --> Phase5
主要特性
劫持类型覆盖
| 类型 | 描述 | 隐蔽性 | 状态 |
|---|---|---|---|
| 幻影(Phantom) | DLL 在磁盘上任何位置都不存在 | 高 | 已实现 |
| 搜索顺序(Search Order) | 将 DLL 放置在 Windows 搜索顺序中更靠前的位置 | 高 | 已实现 |
| 侧加载(Side-Loading) | 滥用合法应用程序从其目录加载 DLL 的行为 | 高 | 已实现(AutoElevate 复制到临时目录路径) |
| .local 重定向 | 通过 .local 目录重定向进行劫持 | 高 | 已实现 |
| ENV PATH | 利用系统 PATH 中可写目录进行武器化 | 高 | 已实现(精选服务/DLL 映射) |
| AppInit DLL | AppInit_DLLs 注册表滥用 | 低 | 已实现 |
| AppCert DLL | AppCertDLLs 注册表滥用(加载到每个 CreateProcess/WinExec 调用者中) | 低 | 已实现 |
| CWD | 当前工作目录劫持 | 低 | 已计划 — 目前没有任何发现路径会产生此类型 |
IFEO 调试器条目会被枚举,且引用的二进制文件会被分析其 DLL 导入,但没有专门的 IFEO/KnownDLL 绕过劫持类型 — 这些不会作为独立检测进行宣传。
UAC 绕过发现
DLLHijackHunter 包含专门的 UAC 绕过发现功能:
- 清单 AutoElevate — 扫描
System32和SysWOW64中嵌入清单包含<autoElevate>true</autoElevate>的 EXE - COM AutoElevation — 扫描
HKLM\SOFTWARE\Classes\CLSID中Elevation\Enabled=1的 COM 对象 - 侧加载模拟 — 对于不调用
SetDllDirectory或SetDefaultDllDirectories的 AutoElevate 二进制文件,模拟“将 EXE 复制到可写文件夹 + 投放 DLL”的攻击路径
定向漏洞知识库
- 定向漏洞映射 — 将发现的导入与内置的 HijackLibs 数据集快照(约 590 个记录的 DLL 条目,涵盖约 700 个易受攻击的可执行文件)进行交叉比对,嵌入为
Resources/hijacklibs.json。匹配会提升置信度并将发现链接到其 HijackLibs 参考页面;没有匹配则无影响。该数据集是数据驱动的 — 通过重新下载https://hijacklibs.net/api/hijacklibs.json覆盖该资源即可刷新(无需更改代码)。数据集 © HijackLibs 项目及其贡献者。 - 自动化 PATH 利用 — 评估可写的
PATH文件夹,并为精选的原生 Windows 服务映射生成劫持候选,这些服务已知会搜索PATH以查找缺失的 DLL - 扩展幻影 DLL 搜索 — 跨多个类别搜索高价值的幻影 DLL 机会库
过滤流水线
该流水线通过两个阶段减少误报:
硬门控
- API 集架构过滤(
api-ms-*、ext-ms-*) - KnownDLL 过滤
- 攻击者相对 ACL 可写性验证 — 仅当非特权主体(
Users/Authenticated Users/Everyone,以及防泄漏的子管理员服务账户如LOCAL SERVICE/NETWORK SERVICE)具有有效写入权限时,路径才被视为可写。至关重要的是,这是独立于工具运行时所使用的令牌计算的,因此以提升权限运行不会使System32/Program Files看起来可写。这正是提升权限运行对 LPE 分类有意义的原因。
软门控
- WinSxS 清单惩罚
- 特权差异分析
LoadLibraryEx缓解措施检查- 签名验证检查
- 优雅错误处理惩罚
金丝雀确认
DLLHijackHunter 不是猜测,而是尝试证明劫持有效:
sequenceDiagram
participant H as DLLHijackHunter
participant B as 金丝雀 DLL 构建器
participant T as 触发器执行器
participant V as 受害者二进制文件
H->>B: 构建金丝雀 DLL
B->>B: 提取预编译金丝雀<br/>(或使用 MSVC 编译代理)
B-->>H: canary.dll + 确认文件路径
H->>H: 将 DLL 放置在劫持路径
H->>T: 触发二进制文件执行
T->>V: 启动服务 / 运行任务 / COM 激活
V->>V: 加载金丝雀 DLL
V-->>H: 写入确认文件<br/>PID、特权、完整性级别
H->>H: 记录:已确认(CONFIRMED)
H->>H: 清理金丝雀 DLL
金丝雀 DLL:
- 同时为 x64 和 x86 预编译,嵌入在扫描器中,因此扫描时无需编译器。会根据受害者的位数选择正确的架构并按需提取。
- 自定位:它在运行时从自身加载的模块路径推导确认文件路径(
%ProgramData%\DLLHijackHunter\canary_<hash>.confirm),因此一个二进制文件即可服务于所有候选。扫描器从部署路径计算相同的哈希并轮询该文件。 - 使用基于文件的确认机制
- 捕获执行元数据,如用户、完整性级别和特权指示符
- 不包含恶意负载;它严格是一种检测和验证机制
- 静态链接 CRT,因此在受害者主机上没有运行时依赖(ucrtbase/vcruntime)。
捆绑的二进制文件由 src/DLLHijackHunter/Resources/canary_src.c 中的可审计源代码构建,可通过 Resources/build_canary.bat 重新生成(需要 MSVC C++ 工具链;扫描器不需要)。
功能代理例外: 当搜索顺序劫持针对一个存在并暴露导出的 DLL 时,在确认后保持主机存活需要导出转发代理,该代理使用 MSVC(
cl.exe,通过vswhere/vcvarsall定位)按 DLL 编译。如果没有工具链,则使用预编译的金丝雀 — 它仍然确认加载(DllMain 触发)但不转发导出,因此主机进程可能在确认记录后崩溃。幻影 DLL 和其他无导出候选完全不需要编译器。
签名: 嵌入的金丝雀未签名。对其进行代码签名(以便在更严格的政策下加载并可归属)需要签名证书,这留给维护者作为发布时步骤。
关于代理/导出转发模式的重要说明
代理/导出转发金丝雀是实验性的且尽力而为。某些目标可能无法正确加载或可能因以下原因出现意外行为:
- 仅序号导出
- 修饰的导出名称
- 调用约定不匹配
- 目标进程中的加载器/运行时假设
这意味着失败的代理金丝雀并不总是意味着底层劫持路径不可能。
加载顺序验证(--verify-load)
一种可选加入的标准用户验证,位于过滤流水线和金丝雀阶段之间。对于每个适用的候选,它会短暂地将一个良性探测 DLL 写入可写的劫持位置,然后要求真实的 Windows 加载器 — 在一个短暂存活的子进程中 — 按名称解析该 DLL。加载器解析的位置决定判定结果:
- 验证通过 — 加载器选择了可写位置。搜索顺序声明已被证明(此佐证使发现达到高(High)层级;金丝雀执行仍然是达到**已确认(Confirmed)**的唯一路径)。
- 输给受保护项 — 加载器选择了 KnownDLL、System32 副本或 SxS 重定向副本。该位置几乎肯定不可劫持,因此候选被大幅降级。这捕获了静态搜索顺序计算器遗漏的经典误报(例如,KnownDLL 使
ntdll.dll无法利用的.local/搜索顺序“发现”)。
设计和安全说明:
- 在子进程中运行,因此已加载到扫描器中的名称不会短路结果,并且任何加载副作用或崩溃都会被隔离。无需提升权限。
- 每个探测都会被放置、解析,然后移除;任何预先存在的文件都会被备份并恢复。
- 它模拟现代
LOAD_LIBRARY_SEARCH排序,因此仅适用于幻影 / 搜索顺序 / 侧加载候选。.local、PATH 和 AppInit/AppCert 候选使用不同的机制,并报告为已跳过(Skipped)。 - 它会瞬态地向候选位置写入文件(中等影响);对于完全被动、只读的分类,请保持关闭。
# 使用加载器验证搜索顺序的标准用户分类(无金丝雀、无 ETW)
.\DLLHijackHunter.exe --lpe-only --no-canary --no-etw --verify-load
对比
| 特性 | DLLHijackHunter | Robber | DLLSpy | WinPEAS | Procmon |
|---|---|---|---|---|---|
| 自动化发现 | ✅ | ✅ | ✅ | ✅ | ❌ |
| 幻影 DLL 检测 | ✅ | ❌ | ✅ | ❌ | ✅ |
| 搜索顺序分析 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 基于 ACL 的可写性检查 | ✅ | 部分 | ❌ | 基础 | ❌ |
| ETW 实时监控 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 金丝雀确认 | ✅¹ | ❌ | ❌ | ❌ | ❌ |
| 特权提升检查 | ✅ | ❌ | ❌ | ❌ | ❌ |
| UAC 绕过发现 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 误报减少 | ✅² | 无 | 基础 | 无 | 无 |
| 重启持久性检查 | ✅³ | ❌ | ❌ | ❌ | ❌ |
| 代理 DLL 生成 | ✅⁴ | ❌ | ❌ | ❌ | ❌ |
| 置信度评分 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 自动触发(服务/任务/COM) | ✅⁵ | ❌ | ❌ | ❌ | ❌ |
| HTML/JSON 报告 | ✅ | ❌ | ❌ | TXT | ❌ |
| 威胁情报关联 | ✅⁶ | ❌ | ❌ | ❌ | ❌ |
| 自动化 PATH 利用 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 目标特定扫描 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 自包含二进制文件 | ✅ | ❌ | ❌ | ✅ | ❌ |
² 通过攻击者相对 ACL 可写性(见过滤流水线)。它减少 — 但不消除 — 误报;软门控启发式(清单/SxS/LoadLibraryEx)仍存在不确定性。未经验证的静态发现现在被限制在**高(High)**层级以下。
³ 从自动启动状态推导,而非经过验证的重启测试。
⁴ 导出转发代理是实验性/尽力而为的(见上文说明)。
⁵ 仅限服务/任务/COM 触发器;UAC 绕过发现不会触发金丝雀。
⁶ 由内置的 HijackLibs 数据集快照支持(约 590 个条目);可从 hijacklibs.net 刷新。
使用方法
先决条件
- Windows 10/11 或 Windows Server 2016+
- .NET 8.0 或 10.0 运行时(或使用自包含构建)
- 管理员权限(推荐,ETW、金丝雀部署和某些服务触发器需要)
构建
git clone https://github.com/ghostvectoracademy/DLLHijackHunter.git
cd DLLHijackHunter
# 构建(自包含单文件)
dotnet publish src/DLLHijackHunter/DLLHijackHunter.csproj `
-c Release -r win-x64 --self-contained `
-p:PublishSingleFile=true -o ./publish
# 或使用构建脚本
.\build.ps1
快速开始
# 全面激进扫描(推荐,需要管理员权限)
.\DLLHijackHunter.exe --profile aggressive
# 安全扫描(无文件投放、无触发)
.\DLLHijackHunter.exe --profile safe
# UAC 绕过聚焦扫描
.\DLLHijackHunter.exe --profile uac-bypass
# 针对特定二进制文件
.\DLLHijackHunter.exe --target "C:\Program Files\MyApp\app.exe"
# 按文件名定位(部分匹配)
.\DLLHijackHunter.exe --target notepad.exe
# 仅显示已确认的发现
.\DLLHijackHunter.exe --profile redteam --format json -o report.json
CLI 选项
DLLHijackHunter — 自动化 DLL 劫持检测
选项:
-p, --profile <profile> 扫描配置文件 [默认: aggressive]
aggressive | strict | safe | redteam | uac-bypass
-o, --output <path> 输出文件路径(自动检测格式)
-f, --format <format> 输出格式 [默认: console]
console | json | html
-t, --target <target> 针对特定二进制文件、目录或文件名
--min-confidence <value> 最低置信度阈值 0-100。省略时,使用各配置文件的
自身阈值;传入此参数将覆盖它。
--no-canary 禁用金丝雀确认
--no-etw 禁用 ETW 运行时发现
--verify-load 使用真实加载器验证搜索顺序(见下文)。
标准用户;瞬态写入良性探测。
--confirmed-only 仅显示金丝雀确认的发现
--lpe-only 严格 LPE 搜索:忽略 System32/Program Files,仅显示
标准用户可写的漏洞
--log-file <path> 将诊断扫描日志写入文件
-v, --verbose 详细输出
注意:
--min-confidence仅在您显式传入时才被视为覆盖。否则使用所选配置文件的阈值(例如safe= 50%,strict= 80%)。
扫描配置文件
| 配置文件 | 使用场景 | 金丝雀 | ETW | UAC 绕过 | 最低置信度 | 触发器 |
|---|---|---|---|---|---|---|
| aggressive | 全面审计、实验室环境 | ✅ | ✅ | ✅ | 15% | 服务、任务、COM |
| strict | 仅高置信度发现 | ✅ | ✅ | ❌ | 80% | 服务、任务 |
| safe | 生产系统、只读 | ❌ | ❌ | ❌ | 50% | 无 |
| redteam | 仅已确认可利用 | ✅ | ✅ | ❌ | 50% | 服务、任务、COM |
| uac-bypass | 仅 UAC 绕过向量 | ❌ | ❌ | ✅ | 20% | 仅 AutoElevate |
评分
每个发现都会收到置信度和影响信号,这些信号被组合成最终的优先级层级。
典型的影响考量包括:
- 获得的特权
- 触发器可靠性
- 隐蔽性
- 重启持久性
已确认的金丝雀执行应被视为最强的验证信号。
层级门控: 高(High) 和 已确认(Confirmed) 层级保留给有证明信号支持的发现 — 已触发的金丝雀、ETW 运行时加载观察或文档化的知识库匹配。纯粹的静态搜索顺序匹配,无论多么干净,都被限制在**中(Medium)**层级的顶部,并标注为 仅静态(Static-only),以便未经验证的启发式永远不会呈现为高置信度。
推荐的分类配置
由于可写性按攻击者相对进行评估,提升权限和标准用户运行都有意义:
- 对于 LPE 分类,最可信的配置是使用
--lpe-only的标准用户运行(如果没有编译器,则加上--no-canary)— 每个幸存的发现都确实可由非特权主体写入。 - 提升权限运行是 ETW 和金丝雀确认所必需的,并且现在已摆脱历史上“System32 中一切看起来都可写”的倒置问题。
安全性
DLLHijackHunter 专为防御性安全研究、实验室验证、审计以及授权环境中的红队模拟而设计。
仅在对您拥有或明确授权评估的系统和网络上使用。
操作说明
- 金丝雀模式会向候选位置写入测试 DLL
- 某些触发器可能在验证期间短暂启动或停止服务/任务
- 代理/导出转发金丝雀可能使脆弱目标不稳定
- 当文件投放和触发器不可接受时,安全(safe)配置文件是生产分类的首选模式
输出
DLLHijackHunter 支持:
- 控制台报告
- JSON 导出
- HTML 导出
推荐工作流程:
- 运行广泛扫描
- 审查高置信度发现
- 对高价值路径选择性使用金丝雀确认
- 保留 JSON/HTML 输出用于报告和分类
许可证
MIT
致谢
由 ProjectMerai 构建。