# Detecting Rootkit Activity

> 通过识别隐藏进程、被钩挂的系统调用、被修改的内核结构、隐藏文件和隐蔽网络连接， 检测受攻陷系统上的 Rootkit 存在情况，使用内存取证、交叉视图检测和完整性校验技术。 适用于 Rootkit 检测、隐藏进程发现、内核完整性校验或系统调用钩挂分析等请求场景。

- Skill: `killvxk/detecting-rootkit-activity` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add killvxk/detecting-rootkit-activity`
- Raw SKILL.md: https://api.skillmd.com/api/skills/killvxk/detecting-rootkit-activity/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: Apache-2.0
- Author: killvxk (https://skillmd.com/u/killvxk)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/killvxk/detecting-rootkit-activity

---


# 检测 Rootkit 活动

## 适用场景

- 系统出现入侵迹象，但标准工具（任务管理器、netstat）未显示异常
- 防病毒/EDR 检测到 Rootkit 签名，但无法识别具体的隐藏机制
- 内存取证发现内核数据结构与用户态工具输出之间存在差异
- 调查能在修复尝试和系统重启后存活的持久性威胁
- 在疑似内核级别失陷后验证系统完整性

**不适用**于作为一线检测方法；应先进行标准恶意软件分类，当怀疑存在隐藏行为时再升级为 Rootkit 分析。

## 前置条件

- Volatility 3，用于内存取证和内核结构分析
- GMER 或 Rootkit Revealer（Windows），用于实时系统扫描
- rkhunter 和 chkrootkit（Linux），用于文件系统和进程完整性检查
- Sysinternals 工具（Process Explorer、Autoruns、RootkitRevealer），用于 Windows 分析
- 来自被怀疑系统的内存转储（WinPmem、LiME）
- 用于对比的干净操作系统基线（已知正常的内核模块哈希）

## 工作流程

### 步骤 1：针对隐藏进程进行交叉视图检测

比较来自不同数据源的进程列表以发现差异：

```bash
# Volatility：比较进程枚举方法
# pslist - 遍历 ActiveProcessLinks（EPROCESS 链表，Rootkit 操纵的目标）
vol3 -f memory.dmp windows.pslist > pslist_output.txt

# psscan - 扫描物理内存中的 EPROCESS 池标签（具有 Rootkit 抵抗性）
vol3 -f memory.dmp windows.psscan > psscan_output.txt

# 比较输出以发现隐藏进程
python3 << 'PYEOF'
pslist_pids = set()
psscan_pids = set()

with open("pslist_output.txt") as f:
    for line in f:
        parts = line.split()
        if len(parts) > 1 and parts[1].isdigit():
            pslist_pids.add(int(parts[1]))

with open("psscan_output.txt") as f:
    for line in f:
        parts = line.split()
        if len(parts) > 1 and parts[1].isdigit():
            psscan_pids.add(int(parts[1]))

hidden = psscan_pids - pslist_pids
if hidden:
    print(f"[!] HIDDEN PROCESSES DETECTED (in psscan but not pslist):")
    for pid in hidden:
        print(f"    PID: {pid}")
else:
    print("[*] No hidden processes detected via cross-view analysis")
PYEOF
```

### 步骤 2：检测系统调用钩挂

识别系统服务描述符表（SSDT）和导入地址表（IAT）中的钩子：

```bash
# 检查 SSDT 中被钩挂的系统调用
vol3 -f memory.dmp windows.ssdt

# 识别指向 ntoskrnl.exe 或 win32k.sys 之外的钩子
vol3 -f memory.dmp windows.ssdt | grep -v "ntoskrnl\|win32k"

# 检查内联钩子（绕道修补）
vol3 -f memory.dmp windows.apihooks --pid 4  # System 进程

# IDT（中断描述符表）分析
vol3 -f memory.dmp windows.idt

# 检查驱动程序上的 IRP（I/O 请求包）钩挂
vol3 -f memory.dmp windows.driverscan
vol3 -f memory.dmp windows.driverirp
```

```
Rootkit 钩挂类型：
━━━━━━━━━━━━━━━━━━━━━
SSDT 钩挂：    修改系统服务描述符表条目，将系统调用重定向
               至 Rootkit 代码（过滤进程/文件列表）

IAT 钩挂：     修补进程的导入地址表，在 API 调用到达内核
               之前拦截它们

内联钩挂：     用跳转指令覆写函数开头的字节，跳转至 Rootkit
               代码（绕道/跳板技术）

IRP 钩挂：     在驱动层拦截 I/O 请求包，过滤磁盘/网络操作

DKOM：         直接内核对象操控——无需钩挂即可解除
               EPROCESS 等结构的链接
```

### 步骤 3：分析内核模块和驱动

识别可能是 Rootkit 组件的未授权内核驱动：

```bash
# 列出所有已加载的内核模块
vol3 -f memory.dmp windows.modules

# 扫描内存中的驱动（包括隐藏/已解链的驱动）
vol3 -f memory.dmp windows.driverscan

# 比较模块列表以发现隐藏驱动
vol3 -f memory.dmp windows.modscan > modscan.txt
vol3 -f memory.dmp windows.modules > modules.txt

# 检查驱动签名并与已知正常基线进行验证
vol3 -f memory.dmp windows.verinfo

# 转储可疑驱动以进行静态分析
vol3 -f memory.dmp windows.moddump --base 0xFFFFF80012340000 --dump
```

### 步骤 4：检测文件和注册表隐藏

识别被 Rootkit 隐藏的文件和注册表键：

```bash
# Linux Rootkit 检测（使用 rkhunter）
rkhunter --check --skip-keypress --report-warnings-only

# chkrootkit 扫描
chkrootkit -q

# Windows：比较文件系统视图
# 实时系统文件列表 vs Volatility filescan
vol3 -f memory.dmp windows.filescan > mem_files.txt

# 检查隐藏的注册表键
vol3 -f memory.dmp windows.registry.hivelist
vol3 -f memory.dmp windows.registry.printkey --key "SYSTEM\CurrentControlSet\Services"

# 查找隐藏服务（已加载但不在服务注册表中）
vol3 -f memory.dmp windows.svcscan | grep -i "kernel"
```

### 步骤 5：网络连接分析

发现隐藏的网络连接和后门：

```bash
# 基于内存的网络连接枚举
vol3 -f memory.dmp windows.netscan

# 与实时 netstat 对比（如可用）以发现隐藏连接
# 隐藏连接：存在于内存中但不被 netstat 显示

# 查找原始套接字（Rootkit 常用于隐蔽通信）
vol3 -f memory.dmp windows.netscan | grep RAW

# 检查网络过滤驱动（NDIS 钩挂）
vol3 -f memory.dmp windows.driverscan | grep -i "ndis\|tcpip\|afd"

# 分析驱动注册的回调例程
vol3 -f memory.dmp windows.callbacks
```

### 步骤 6：完整性验证

验证系统文件和内核完整性：

```bash
# 检查内核代码完整性（对比内存中的内核与磁盘副本）
vol3 -f memory.dmp windows.moddump --base 0xFFFFF80070000000 --dump
# 比较转储的 ntoskrnl.exe 的 SHA-256 与已知正常副本

# Windows：系统文件检查器（在实时系统上）
sfc /scannow

# Linux：软件包完整性验证
rpm -Va  # 基于 RPM 的系统
debsums -c  # 基于 Debian 的系统

# 对比关键系统二进制文件
find /bin /sbin /usr/bin /usr/sbin -type f -exec sha256sum {} \; > current_hashes.txt
# 与基线对比：diff baseline_hashes.txt current_hashes.txt

# 使用 YARA 扫描已知 Rootkit 签名
vol3 -f memory.dmp yarascan.YaraScan --yara-file rootkit_rules.yar
```

## 核心概念

| 术语 | 定义 |
|------|------|
| **Rootkit** | 旨在维持持久特权访问同时对系统管理员和安全工具隐藏自身存在的恶意软件 |
| **DKOM** | 直接内核对象操控；通过修改内核数据结构（如解除 EPROCESS 链接）来隐藏对象而无需钩挂 |
| **SSDT 钩挂** | 替换系统服务描述符表中的条目以拦截和过滤系统调用结果（隐藏进程、文件、连接） |
| **内联钩挂** | 用跳转到 Rootkit 代码的指令修补函数的起始指令；Rootkit 可以在返回之前过滤函数输出 |
| **交叉视图检测** | 比较多种枚举方法的结果（链表遍历 vs 内存扫描）以识别因隐藏而产生的差异 |
| **内核驱动** | 在内核态（Ring 0）运行、具有完整系统访问权限的代码；Rootkit 使用恶意驱动获得内核级控制权 |
| **Bootkit** | 感染启动过程（MBR、VBR 或 UEFI 固件）以在操作系统和安全工具之前加载的 Rootkit |

## 工具与系统

- **Volatility**：内存取证框架，提供交叉视图检测、SSDT 分析和内核结构检查以用于 Rootkit 检测
- **GMER**：免费的 Windows Rootkit 检测工具，扫描 SSDT 钩子、IDT 钩子、IRP 钩子及隐藏的进程/文件/注册表
- **rkhunter**：Linux Rootkit 检测工具，检查已知 Rootkit 签名、可疑文件和系统二进制文件修改
- **chkrootkit**：通过基于签名和基于异常的检测来检测 Rootkit 存在的 Linux 工具
- **Sysinternals RootkitRevealer**：微软工具，通过比较 Windows API 结果与原始文件系统/注册表扫描来发现差异

## 常见场景

### 场景：调查标准工具显示无入侵的系统

**背景**：防火墙日志显示终端向已知 C2 IP 发出信标，但本地 EDR、任务管理器和 netstat 未显示任何可疑进程或连接。已获取内存转储进行分析。

**方法**：
1. 运行 Volatility `psscan` 并与 `pslist` 对比，识别通过 DKOM 隐藏的进程
2. 运行 `windows.ssdt` 检查过滤进程和网络列表的系统调用钩子
3. 运行 `windows.malfind` 检测合法进程中的注入代码
4. 运行 `windows.netscan` 发现对用户态工具隐藏的网络连接
5. 运行 `windows.driverscan` 识别启用隐藏的恶意内核驱动
6. 转储 Rootkit 驱动并使用 Ghidra 分析其钩挂机制
7. 检查启动持久化（MBR/VBR 修改、UEFI 固件植入）

**注意事项**：
- 不要在已受攻陷的实时系统上运行检测工具（Rootkit 可能对其隐藏或颠覆）
- 不要因未发现 SSDT 钩子就假设内核完整（Rootkit 可能使用 DKOM 或内联钩子）
- 不要只检查用户态或内核态 Rootkit 组件（许多 Rootkit 两者兼有）
- 不要相信在实时系统上运行的 Rootkit 扫描器结果；务必通过离线内存取证进行验证

## 输出格式

```
ROOTKIT 检测分析报告
====================================
转储文件：      memory.dmp
系统：          Windows 10 21H2 x64
分析工具：      Volatility 3.2

交叉视图检测
进程列表对比：
  pslist 进程数：  127
  psscan 进程数：  129
  [!] 隐藏进程：2 个
    PID 6784：sysmon64.exe（隐藏的 Rootkit 组件）
    PID 6812：netfilter.exe（隐藏的网络过滤器）

SSDT 钩挂分析
[!] 条目 0x004A（NtQuerySystemInformation）被钩挂 -> driver.sys+0x1200
[!] 条目 0x0055（NtQueryDirectoryFile）被钩挂 -> driver.sys+0x1400
[!] 条目 0x0119（NtDeviceIoControlFile）被钩挂 -> driver.sys+0x1600
钩挂目标：driver.sys 位于 0xFFFFF800ABCD0000（未签名，可疑）

内核驱动分析
[!] driver.sys - 无数字签名，加载于 0xFFFFF800ABCD0000
    大小：45,056 字节
    SHA-256：abc123def456...
    IRP 钩挂：IRP_MJ_CREATE, IRP_MJ_DEVICE_CONTROL
    注册表：HKLM\SYSTEM\CurrentControlSet\Services\MalDriver

隐藏网络连接
PID 6812：10.1.5.42:49152 -> 185.220.101.42:443（ESTABLISHED）
  - 无法通过 netstat 或用户态工具看到
  - 被 NtDeviceIoControlFile SSDT 钩子过滤

ROOTKIT 功能
- 进程隐藏（DKOM + SSDT）
- 文件隐藏（NtQueryDirectoryFile 钩子）
- 网络连接隐藏（NtDeviceIoControlFile 钩子）
- 内核态持久化（驱动服务）

修复措施
- 从干净介质启动进行离线修复
- 从离线注册表中移除恶意驱动
- 验证 MBR/VBR/UEFI 完整性以排查启动持久化
- 对于内核级别的入侵建议完整重建系统
```

