Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
DLLHijackHunter — 自动化的DLL劫持发现、验证和确认。将本地错误配置转化为武器化的、已确认的攻击路径。 | Kitploit
工具/GitHubGitHub/ghostvectoracademy/dllhijackhunter
权限提升漏洞扫描器Payload生成持久化机制动态代码分析 (DAST)漏洞利用横向移动渗透测试二进制分析学习与教育红队
39644701天前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
GitHub
ghostvectoracademy/dllhijackhunter

DLLHijackHunter

自动化的DLL劫持发现、验证和确认。将本地错误配置转化为武器化的、已确认的攻击路径。

查看仓库
<p align="center">
  <img src="https://img.shields.io/badge/Platform-Windows-blue?style=for-the-badge&amp;logo=windows" />
  <img src="https://img.shields.io/badge/.NET-8.0_%7C_10.0-purple?style=for-the-badge&amp;logo=dotnet" />
  <img src="https://img.shields.io/badge/License-MIT-green?style=for-the-badge" />
  <img src="https://img.shields.io/badge/Version-2.6.0-orange?style=for-the-badge" />
  <img src="https://img.shields.io/badge/Black%20Hat%20Arsenal-Europe%202026-CC0000?style=for-the-badge" />
  <img src="https://img.shields.io/badge/Black%20Hat%20Arsenal-SecTor%202026-CC0000?style=for-the-badge" />
</p>

<h1 align="center">DLLHijackHunter</h1>
<h4 align="center">作者:<a href="https://projectmerai.com">ProjectMerai</a></h4>

<p align="center">
  <strong>面向 Windows 的自动化 DLL 劫持发现、验证与确认</strong><br/>
  <em>从“这个 DLL 可能被劫持”到“标准用户可以诱使 SYSTEM 加载它——这里是证据。”</em>
</p>

---

## 目录

- [概述](#概述)
- [快速开始](#快速开始)
- [工作原理](#工作原理)
- [检测内容](#检测内容)
- [减少误报](#减少误报)
- [验证:加载探测与金丝雀](#验证加载探测与金丝雀)
- [评分、等级与攻击链](#评分等级与攻击链)
- [用法参考](#用法参考)
- [安全性与操作影响](#安全性与操作影响)
- [从源码构建](#从源码构建)
- [测试实验室(HijackRange)](#测试实验室hijackrange)
- [已知限制](#已知限制)
- [对比](#对比)

---

## 概述

DLLHijackHunter 在 Windows 主机上发现 DLL 劫持机会,并致力于证明这些机会,而不仅仅是列出它们。它会:

1. **发现**二进制程序被自动启动的每一处位置——服务、计划任务、Run 注册表键、启动文件夹、COM 服务器、AppInit/AppCert DLL、IFEO 条目以及自动提升权限的 UAC 二进制程序——并计算每个导入的 DLL 会在哪些位置被搜索。
2. **过滤**掉攻击者实际无法利用的位置:API set、KnownDLLs、标准用户无法写入的目录、受保护进程等。
3. **验证**(可选):使用真实的 Windows 加载器,放置一个无害的探测 DLL,并检查哪一份副本在搜索中胜出。
4. **确认**(可选):部署一个无害的金丝雀 DLL,触发服务/任务/COM 对象,并记录它实际运行时所使用的身份。
5. **评分并报告**每项发现的置信度和影响,并将发现关联成攻击链(例如 *标准用户 → SYSTEM*)。

每一项判断都**从攻击者的视角**——即无特权的标准用户——作出,无论扫描器本身是否以提升权限运行。以管理员身份运行可以让工具获得更多可见性(ETW、金丝雀、服务触发);它绝不会让受保护目录看起来可写,也不会夸大所获得的权限。

---

## 快速开始

下载或构建 `DLLHijackHunter.exe`(自包含;无需安装 .NET),然后在**提升权限**的命令提示符中运行:

```powershell
# Passive, read-only triage: no file drops, no service/task starts
.\DLLHijackHunter.exe --profile safe

# Full static analysis without touching the system, JSON report
.\DLLHijackHunter.exe --profile aggressive --no-canary --no-etw -o report.json

# Static analysis + real-loader verification (writes probe DLLs transiently)
.\DLLHijackHunter.exe --profile aggressive --no-canary --no-etw --verify-load -o report.html

# Everything, including ETW and canary confirmation — lab / authorised targets only
.\DLLHijackHunter.exe --profile aggressive -o report.html

# Focus on one application
.\DLLHijackHunter.exe --target "C:\Program Files\MyApp\app.exe" --no-canary
```

> **杀毒软件:** 金丝雀 DLL 和探测 DLL 均未签名,且行为类似劫持载荷,因此 Microsoft Defender 可能会将其隔离。该工具会检测到这种情况,并将这些结果报告为**不确定**,而非“不可劫持”。在测试机上,请将目标目录和 `%ProgramData%\DLLHijackHunter` 加入排除项,以获得确定的结果。

---

## 工作原理

```mermaid
flowchart TB
    subgraph S1["1 · Discovery"]
        direction LR
        EN["Launch points<br/>services · tasks · Run keys<br/>startup · COM · AutoElevate"] --> PE["PE analysis<br/>imports · delay loads<br/>manifest"] --> SO["Search order<br/>identity-aware PATH"]
        ETW["ETW runtime trace<br/>optional, elevated"]
    end
    subgraph S2["2 · Filter pipeline"]
        direction LR
        HG["Hard gates<br/>API sets · KnownDLLs<br/>writability"] --> SG["Soft gates<br/>manifest · privilege<br/>PPL · LoadLibraryEx"] --> DD["Dedup and<br/>profile filters"]
    end
    subgraph S3["3 · Verification (optional)"]
        direction LR
        LP["Load probe<br/>real Windows loader"] --> CN["Canary<br/>deploy, trigger, confirm"]
    end
    subgraph S4["4 · Output"]
        direction LR
        SC["Scoring and tiers"] --> AC["Attack chains"] --> RP["Console · JSON · HTML"]
    end
    S1 --> S2 --> S3 --> S4
```

| 阶段 | 需要管理员权限 | 修改系统 |
|---|:---:|---|
| 静态发现 + 过滤 | 否(管理员可见更多) | 否 |
| ETW 运行时发现 | **是** | **启动**自动启动服务(最多 100 个)并运行计划任务(最多 30 个)以触发 DLL 加载 |
| 加载探测(`--verify-load`) | 否 | 在每个候选位置短暂写入一个无害的探测 DLL,然后将其删除并恢复任何原始文件 |
| 金丝雀确认 | **是** | 写入一个金丝雀 DLL,停止/启动服务,运行任务,激活 COM 对象,然后进行清理 |

---

## 检测内容

### 劫持类型

| 类型 | 含义 | 备注 |
|---|---|---|
| **幻影(Phantom)** | 该 DLL 在搜索路径中的任何位置都不存在 | 可将其放置于二进制文件搜索的任何位置 |
| **搜索顺序** | 在合法副本之前搜索了可写目录 | 包括覆盖可写目录中的 DLL |
| **ENV PATH** | 在 `PATH` 中的可写目录中搜索缺失的 DLL | 服务仅针对**机器** PATH 进行评估——服务永远不会搜索用户自己的 PATH 条目 |
| **.local 重定向** | `<app>.exe.local\<dll>` 重定向 | 仅对**没有清单**的可执行文件报告(或当 IFEO `DevOverrideEnable=1` 时);否则加载器会忽略 `.local`,并且它永远不会重定向 KnownDLLs |
| **侧加载(UAC)** | 将自动提升的 EXE 复制到植入的 DLL 旁边 | 仅适用于清单中包含 `<autoElevate>true</autoElevate>` 的 EXE。自动提升需要受信任的位置,因此副本必须通过该检查(例如模拟的 `C:\Windows \System32\` 文件夹) |
| **AppInit DLLs** | `AppInit_DLLs` 指向一个可写的 DLL | 加载到每个加载 `user32.dll` 的进程中 |
| **AppCert DLLs** | `AppCertDLLs` 指向一个可写的 DLL | 加载到每个 `CreateProcess`/`WinExec` 调用方中 |

IFEO `Debugger` 和 `SilentProcessExit\MonitorProcess` 二进制文件会像任何其他启动点一样被枚举和分析。目前不会产生基于 CWD 的劫持。

### 目标以谁的身份运行

正确的身份决定了权限提升判定和影响评分:

- **服务** — `ObjectName`(LocalSystem、Local Service、Network Service 或某个账户);svchost 服务还会分析其 `ServiceDll`。
- **计划任务** — 任务主体。诸如 `S-1-5-18` 的 SID 形式会映射到 `NT AUTHORITY\SYSTEM`;组主体以登录成员身份运行(只有*管理员 + 最高权限*才计为已提升)。包装在 `rundll32`、`cmd /c` 或 `powershell -File` 中的载荷也会被分析。
- **Run 键 / 启动文件夹** — 针对**每个已加载的用户配置文件**(`HKEY_USERS`)和每个配置文件的启动文件夹进行枚举,并归属于该用户——而不仅仅是运行扫描器的账户。
- **COM** — 进程外服务器遵循 `AppID` → `RunAs` / `LocalService`;进程内服务器以加载它们的客户端身份运行。

### 知识库与 PATH 武器化

- 会交叉引用捆绑的 **[HijackLibs](https://hijacklibs.net/)** 数据集快照(约 590 个 DLL,覆盖约 700 个可执行文件,`Resources/hijacklibs.json`)。匹配会提高置信度并链接参考;不匹配则无影响。可通过将文件替换为 `https://hijacklibs.net/api/hijacklibs.json` 来刷新。数据集 © HijackLibs 项目及贡献者。
- 对于**机器** PATH 上的每个可写目录,会为已知的 SYSTEM 服务生成候选,这些服务会探测 PATH 以查找缺失的 DLL(`IKEEXT → wlbsctrl.dll`、`Spooler → ualapi.dll`、`Schedule → WptsExtensions.dll`、`SessionEnv → tsmsisrv.dll`、`WlanSvc → wlanhlp.dll`)。

---

## 减少误报

**硬性门槛**(候选被丢弃):

- **API 集** — 每个 `api-ms-*` / `ext-ms-*` 契约名称都通过 API 集架构解析,绝不依赖搜索顺序。
- **KnownDLLs** — 从活动的 `\KnownDlls` 和 `\KnownDlls32` 对象目录读取(不仅仅是注册表种子列表),外加 `ntdll.dll`,后者始终最先映射。
- **攻击者相对可写性** — 仅当 `Users`、`Authenticated Users`、`Everyone` 或 `INTERACTIVE`(外加非特权服务账户,如 `LOCAL SERVICE`)持有相关权限时,该位置才被计入:DLL 投放需要**创建文件**权限,`.local` 目录需要**创建文件夹**权限。此计算基于 ACL,独立于扫描器自身的令牌,因此提权扫描绝不会将 `System32`、`Program Files` 或驱动器根目录(`C:\`)视为可写。

**软性门控**(置信度会被调整,原因记录在发现的备注中):

- DLL 的 **Manifest / WinSxS** 绑定。
- **权限增量** — 以**标准用户攻击者**为基准衡量:SYSTEM、LOCAL/NETWORK SERVICE 和 UAC 提权目标属于权限提升;同等权限目标则保留为持久化 / 防御规避发现。
- **LoadLibraryEx 缓解措施** — `SetDefaultDllDirectories`、`AddDllDirectory`、`SetDllDirectory` 导入。
- **受保护进程** — 已知 PPL 二进制文件、在 SCM 配置中设置了 `LaunchProtected` 的服务(涵盖新版 Windows 及第三方 AV/EDR 服务),以及 `FORCE_INTEGRITY` 映像。
- **错误处理的可选加载。**

如果某个门控无法评估,候选者不会被扣分,但失败会记录在其备注和日志中,而非被隐藏。

---

## 验证:加载探测与金丝雀

### 加载探测(`--verify-load`)

对于 Phantom、Search-order 和 Side-load 候选者,一个良性的探测 DLL 会被复制到可写位置,一个短生命周期的子进程会请求**真实的 Windows 加载器**解析该名称:

| 结果 | 含义 | 影响 |
|---|---|---|
| **Wins** | 加载器选择了可写位置 | 搜索顺序得到证实;发现可能达到 **High** |
| **LosesToProtected** | KnownDLL、System32 或 SxS 副本胜出 | 可能是误报;−40 置信度 |
| **NotResolved** | 名称未能解析;加载器错误被记录 | 无定论 |
| **Error** | 探测无法运行——包括探测被**杀毒软件隔离** | 无定论,不扣分 |
| **Skipped** | `.local`、PATH、AppInit/AppCert 使用不同的机制 | — |

该探测模拟位置的真实所在:二进制文件**自身目录**中的 DLL 会在 System32 之前被测试(正如加载器所做的那样);其他位置则根据情况使用经典或现代搜索顺序。以标准用户身份运行;每个探测都会被移除,任何原始文件都会被恢复。

### 金丝雀确认

```mermaid
sequenceDiagram
    autonumber
    participant H as DLLHijackHunter
    participant P as Hijack position
    participant T as Service / task / COM
    Note over H: Pick canary for target bitness,<br/>or build an export-forwarding proxy
    H->>P: Back up original DLL, write canary
    H->>T: sc start / schtasks /run / COM activation
    T->>P: Load DLL by name (search order)
    Note over P,T: Canary DllMain records user,<br/>integrity level and SeDebug
    T-->>H: Confirmation file written
    Note over H: Finding marked CONFIRMED
    H->>P: Remove canary, restore original DLL
    H->>T: Restore original service state
```

- **无需编译器。** 已嵌入预编译的 x64/x86 canary;当被劫持的 DLL 具有导出时,会在运行时通过 PE 手术合成一个导出转发代理,使宿主继续正常工作。
- **自定位。** canary 从其自身加载路径推导出确认路径(`%ProgramData%\DLLHijackHunter\canary_<hash>.confirm`),因此一个二进制文件即可服务于所有候选目标。
- **无载荷。** 它只记录谁加载了它。源码:`src/DLLHijackHunter/Resources/canary_src.c`(使用 `Resources/build_canary.bat` 重新构建,仅此步骤需要 MSVC)。
- **结果:** `Fired`、`Timeout`(已触发,但从未被加载)、`Failed`(无法触发/部署)、`Blocked`(canary 被防病毒软件隔离——结果不确定)、`NotTested`(Run 键、启动项、UAC 绕过和手动目标需要登录/重启)。
- **COM 注意事项:** 进程内 COM 对象由扫描器启动的客户端激活,因此已触发的 canary 证明了加载发生,但其身份属于扫描器——它被记录为*调用方上下文*,不会夸大影响。

对于仅有序号导出、修饰导出名称或需要真实 DLL 常驻的宿主,代理 canary 仍可能得出不确定结果。不确定的 canary **并不**意味着劫持不可能。

---

## 评分、层级与攻击链

每个发现都会获得一个**置信度**(来自过滤器、探测、canary 和知识库)和一个**影响**评分(获得的权限、触发可靠性、隐蔽性、重启持久性),合并为 0–10 的最终分数。

| 层级 | 要求 |
|---|---|
| **Confirmed** | Canary 已触发 |
| **High** | ≥ 80% **且**有证明信号:探测成功、ETW 观察或 HijackLibs 匹配 |
| **Medium** | ≥ 50%(未验证的静态发现上限为此层级,并标记为 `Static-only`) |
| **Low** | ≥ 20% |
| **Informational** | 低于 20% 但高于配置文件的 `--min-confidence` |

**攻击链**将发现关联为叙事:

- **直接路径(用户 → SYSTEM)**——任何标准用户可植入的 SYSTEM 发现。
- **阶梯(用户 → 管理员 → SYSTEM)**——静默 UAC 绕过,仅当不存在直接路径时显示。
- **长线布局(持久化)**——最佳的自启动、非服务发现(Run 键、启动项、任务)。

---

## 使用参考

```text
-p, --profile <name>          aggressive | strict | safe | redteam | uac-bypass   [default: aggressive]
-o, --output <path>           Write a report; format from extension (.json / .html / .htm)
-f, --format <format>         console | json | html                              [default: console]
-t, --target <target>         Binary path, directory, or file name (partial match). Scopes discovery
                              and ETW to that target and skips system-wide PATH weaponisation.
    --min-confidence <0-100>  Override the profile's threshold (only when explicitly passed)
    --no-canary               Disable canary confirmation
    --no-etw                  Disable ETW runtime discovery (no service/task starts)
    --verify-load             Real-loader verification of search order (transient probe DLLs)
    --confirmed-only          Report only canary-confirmed findings
    --lpe-only                Ignore System32 / Program Files / Windows positions
    --canary-settle <sec>     Seconds to wait for a canary to fire after triggering
    --log-file <path>         Write a diagnostic log (enumeration, filter, and probe failures)
-v, --verbose                 Verbose console output
```

### 配置文件

| 配置文件 | 用途 | Canary | ETW | AutoElevate | COM | 同权限发现项 | PPL 发现项 | 最低置信度 |
|---|---|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| **aggressive** | 完整审计、实验环境 | ✅ | ✅ | ✅ | ✅ | 保留 | 保留 | 15% |
| **strict** | 仅高置信度提权 | ✅ | ✅ | — | — | 丢弃 | 丢弃 | 80% |
| **safe** | 生产环境、只读 | — | — | — | — | 保留 | 丢弃 | 50% |
| **redteam** | 仅已确认的提权(隐含 `--confirmed-only`) | ✅ | ✅ | — | ✅ | 丢弃 | 丢弃 | 50% |
| **uac-bypass** | 自动提权向量 | — | — | ✅ | — | 丢弃 | 丢弃 | 20% |

### 输出

- **控制台**(默认):摘要、层级图表、发现项、攻击链。除非传入 `--output`,否则不会向磁盘写入任何内容(非 `.json`/`.html` 路径在存在发现项时会接收 JSON 报告)。
- **JSON / HTML**:包含备注的完整发现项、过滤结果、加载探测与 canary 结果、知识库引用以及攻击链。即使未发现任何内容也会写入报告,因此空文件绝不意味着运行失败。

### 退出码

| 退出码 | 含义 |
|---|---|
| `0` | 扫描完成(无论是否发现项) |
| `1` | 未处理的错误 |
| `3` | 请求了 `--confirmed-only`(或 `redteam` 配置文件),但 canary 无法运行——未提权,或 canary 已禁用。拒绝执行,而不是报告虚假的“0 发现项”。 |

---

## 安全与操作影响

仅在您拥有或获得明确授权评估的系统上使用 DLLHijackHunter。

- `--profile safe`(或 `--no-canary --no-etw`)为**只读**——适用于生产环境分诊。
- **ETW 模式会启动服务并运行计划任务**以触发 DLL 加载,即使未启用 canary 也是如此。
- **Canary 模式**会替换 DLL(带备份/恢复)、停止并重启服务、运行任务并激活 COM 对象。在加载代理 canary 期间,脆弱服务可能出现异常行为。
- **`--verify-load`** 会将探测 DLL 临时写入可写位置。
- 未签名的 canary/探测 DLL 可能被防病毒软件隔离;此类结果会报告为不确定(`Blocked` / 探测 `Error`),绝不会报告为“不受影响”。

---

## 从源码构建

要求:.NET 8 SDK(如果同时构建 `net10.0-windows` 目标,还需要 .NET 10 SDK)。在 Linux/macOS 上构建时使用 `-p:EnableWindowsTargeting=true` 即可正常工作。

```powershell
git clone https://github.com/projectmerai/DLLHijackHunter.git
cd DLLHijackHunter

# Self-contained single-file executable (no .NET runtime needed on the target)
dotnet publish src/DLLHijackHunter/DLLHijackHunter.csproj `
    -c Release -f net8.0-windows -r win-x64 --self-contained `
    -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true `
    -o ./publish
```

该项目多目标定 `net8.0-windows` 和 `net10.0-windows`,因此 `dotnet publish` 需要显式指定 `-f`。

---

## 测试实验室(HijackRange)

`HijackRange/` 包含一个故意存在漏洞的实验室,用于演示和回归测试:

- **Alpha** — 一个 SYSTEM 服务,其二进制目录可被 `BUILTIN\Users` 写入。
- **Beta** — 一个采用相同模式的 SYSTEM 计划任务。
- **Gamma** — 一个被添加到系统 PATH 的可写目录。

使用 `HijackRange\build-all.bat` 构建,使用 `HijackRange\setup.ps1`(需提权)部署,并使用 `HijackRange\teardown.ps1` 移除。参见 `HijackRange/demo-script.md`。请使用一次性虚拟机。

---

## 已知限制

- **静态搜索顺序是一种近似。** 运行时行为(`LoadLibraryEx` 标志、`SetDefaultDllDirectories`、清单)是从导入推断出来的;请使用 `--verify-load` 或金丝雀进行验证。
- **ETW** 只能看到在跟踪窗口(默认 120 秒)内发生的进程和加载。
- **持久化**(“重启后仍然存活”)是从自启动配置推导出来的,而非通过重启测试验证。
- **Run 键 / 启动文件夹 / UAC 侧加载**的发现无法自动通过金丝雀确认。
- **金丝雀和探测 DLL 未签名**,可能会被防病毒软件或应用程序控制策略阻止。

---

## 对比

| 能力 | **DLLHijackHunter** | Robber | DLLSpy | WinPEAS | Procmon |
|---|:---:|:---:|:---:|:---:|:---:|
| 自动发现 | ✅ | ✅ | ✅ | ✅ | ❌ |
| 幻影 DLL 检测 | ✅ | ❌ | ✅ | ❌ | ✅ |
| 搜索顺序分析 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 攻击者相对 ACL 检查 | ✅ | 部分 | ❌ | 基础 | ❌ |
| ETW 运行时监控 | ✅ | ❌ | ❌ | ❌ | ✅ |
| 真实加载器验证 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 金丝雀执行证明 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 权限提升分析 | ✅ | ❌ | ❌ | ❌ | ❌ |
| UAC 绕过发现 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 运行时代理 DLL 生成 | ✅ | ❌ | ❌ | ❌ | ❌ |
| 置信度评分与攻击链 | ✅ | ❌ | ❌ | ❌ | ❌ |
| HijackLibs 关联 | ✅ | ❌ | ❌ | ❌ | ❌ |
| HTML / JSON 报告 | ✅ | ❌ | ❌ | TXT | ❌ |
| 自包含二进制文件 | ✅ | ❌ | ❌ | ✅ | ❌ |

---

## 许可证

MIT

## 致谢

由 **[ProjectMerai](https://projectmerai.com)** 构建。知识库数据来自 [HijackLibs](https://hijacklibs.net/) 项目。
下载工具