BushidoCyb3r/Remora
GitHub: BushidoCyb3r/Remora
一个基于 Volatility3 的图形界面工具,使内存取证工作流可发现且可审计,无需命令行经验。
Stars: 0 | Forks: 0
# Remora
## 目录
- [概述](#overview)
- [系统要求](#requirements)
- [安装说明](#installation)
- [界面布局](#interface-layout)
- [加载内存映像](#loading-a-memory-image)
- [插件浏览器](#plugin-browser)
- [MITRE ATT&CK / 威胁行为者筛选器](#mitre-attck--threat-actor-filter)
- [插件配置面板](#plugin-configuration-panel)
- [运行插件](#running-plugins)
- [结果标签页](#results-tabs)
- [导出结果](#exporting-results)
- [MITRE 覆盖矩阵](#mitre-coverage-matrix)
- [自定义符号表](#custom-symbol-tables-linux--macos)
- [内置 Volshell](#embedded-volshell)
- [自动日志文件](#automatic-log-files)
- [主题](#theme)
- [键盘快捷键](#keyboard-shortcuts)
- [菜单参考](#menu-reference)
- [目录结构](#directory-structure)
- [故障排除](#troubleshooting)
- [许可协议](#license)
## 概述
`remora.py` 是一个位于你克隆的 Volatility3 仓库内的单文件图形化前端,它封装了 `vol.py` 和 `volshell.py` 入口点。它通过分类、可搜索的浏览器暴露所有已发现的插件,根据每个插件声明的需求自动生成参数表单,将输出流式传输到标签页式的结果视图中,并为针对内存映像的每一个操作写入持久化带时间戳的审计日志。
每个插件都映射到了 MITRE ATT&CK 框架和已知威胁行为者组织,使得插件选择和结果导出从一开始就具备情报感知能力。
**适用人群:**
- **数字取证检查员**:需要可辩护的分析步骤保管链记录
- **事件响应人员**:需要根据已知的对手战术、技术和程序快速、可重复地执行插件,以进行实时或已获取内存的分诊
- **威胁猎人**:将内存工件与特定威胁行为者的工具包关联
- **恶意软件分析师**:在结构化的插件输出和交互式 Volshell 访问之间切换
- **培训师和学生**:在可视化、可发现的界面中学习内存取证
## 系统要求
| 依赖项 | 版本 | 备注 |
|---|---|---|
| Python | ≥ 3.8 | 推荐 3.10+ |
| PyQt6 | ≥ 6.4 | 必需 |
| Volatility3 | 最新 | 从 GitHub 克隆 |
| openpyxl | 任意 | 可选 — 仅用于 XLSX 导出 |
| PyQt6.QtPrintSupport | 大多数 PyQt6 安装自带 | 可选 — 仅用于 PDF 导出 |
## 安装说明
### 1. 克隆 Volatility3
```
git clone https://github.com/volatilityfoundation/volatility3.git
cd volatility3
```
### 2. 安装 GUI 依赖项
```
pip install PyQt6
# 可选:Excel 导出
pip install openpyxl
```
### 3. 放置 remora.py
`remora.py` 必须位于**克隆的 Volatility3 仓库的根目录**下——与 `vol.py` 和 `volshell.py` 在同一目录中。Remora 在启动时会将自己的父目录插入 `sys.path`,因此无需额外配置即可导入 Volatility3。
```
volatility3/
├── vol.py
├── volshell.py
├── remora.py ← place here
├── volatility3/
│ ├── framework/
│ ├── plugins/
│ │ ├── windows/
│ │ ├── linux/
│ │ └── mac/
│ └── symbols/
├── requirements.txt
└── setup.py
```
### 4. 启动
```
python3 remora.py
```
## 界面布局
```
┌─────────────────────────────────────────────────────────────────────────┐
│ ▌ REMORA / memory forensics [image · size] ▶ plugin [ LIGHT ] │ ← header bar (40px)
├────────────────────────────────────────────────────────────────────────-│
│ IMG Drop a memory image here — or click to browse │ ← drop zone (52px)
├───────────────┬──────────────────┬─────────────────────────────────────-│
│ PLUGINS [N] │ CONFIGURE │ (results tabs) │
│ ───────── │ ─────────────── │ │
│ [Filter…] │ Plugin name │ plugin · N rows · image.raw │
│ MITRE FILTER │ Description │ [Filter rows…] [Columns▾] [Export▾] │
│ [Combo ▾] │ │ ┌─────────────────────────────────┐ │
│ │ * Required arg │ │ col1 col2 col3 col4 ... │ │
│ ▶ WINDOWS │ Optional arg │ │ ... │ │
│ malfind │ │ └─────────────────────────────────┘ │
│ pslist │ OUTPUT DIR │ N rows timestamp │
│ netscan │ [path…] [Browse]│ │
│ ▶ LINUX │ │ ─────────────────────────────────── │
│ ▶ MACOS │ [▶ Run Plugin] │ LOG → image_2026-01-01.log [Clear]│
│ ▶ OTHER │ │ [HH:MM:SS] log output... │
├───────────────┴──────────────────┴─────────────────────────────────────-│
│ ░░░░░░░░░░░░░░ (2px indeterminate progress bar — visible when running) │
│ Ready Running Malfind… [■ Stop] │ ← status bar
└─────────────────────────────────────────────────────────────────────────┘
```
窗口默认为 **1480 × 920** 像素。三个主要窗格由可拖动的分隔条分隔:
- **左侧** — 插件浏览器 (190–300px):分类树、文本搜索、MITRE/行为者筛选器
- **中间** — 插件配置区 (260–400px):自动生成的参数表单、输出目录、运行按钮
- **右侧** — 垂直分隔:结果标签页(上)位于日志面板上方(72–180px,下)
## 加载内存映像
**方法一 — 拖放:** 将任何支持的内存映像文件直接拖放到拖放区栏上。栏在拖入时会高亮显示强调边框。
**方法二 — 文件菜单:** `文件 > 打开映像…` (`Ctrl+O`)。
**方法三 — 点击拖放区:** 点击栏上的任意位置打开文件浏览器。上次使用的目录会在会话间记住。
**支持的扩展名:** `.dmp` `.mem` `.vmem` `.raw` `.img` `.bin` `.lime` `.dd` `.E01` `.e01`
加载后:
- 文件名和大小以绿色显示在标题栏
- 日志文件在证据文件旁边创建(或追加)—— 会话分隔符会立即写入
- **▶ 运行插件** 按钮激活
- 拖放区标签更改为 `映像已加载 — 拖放另一个以替换`
- 状态栏更新以显示文件名和大小
要加载不同的映像,可拖入另一个文件或再次使用 `文件 > 打开映像…`。
## 插件浏览器
插件浏览器占据左侧面板。所有 Volatility3 插件在启动时通过后台线程(`PluginDiscoveryThread`)发现,并组织成四个类别:
| 类别 | 内容 |
|---|---|
| **WINDOWS** | 所有 `windows.*` 插件 |
| **LINUX** | 所有 `linux.*` 插件 |
| **MACOS** | 所有 `mac.*` 插件 |
| **OTHER** | 跨平台插件:`timeliner`, `yarascan`, `banners`, `regexscan` 等 |
面板标题中的计数徽章显示插件总数,或当任何筛选器激活时显示 `可见数/总数`。
### 导航
- **单击** 插件可在中间面板加载其配置表单
- **双击** 插件可立即使用默认设置运行(必须先加载映像)
- **右键点击** 插件会显示一个上下文菜单,有两个选项:**配置** 和 **使用默认值运行**
### 文本搜索
**筛选插件…** 栏通过子字符串匹配在插件名称中实时缩小树视图范围。匹配的类别会自动展开;空类别将隐藏。
### 插件工具提示
将鼠标悬停在任何插件上会显示一个工具提示,包含:
- 插件自身文档字符串的第一行(在 140 个字符处截断)
- 插件映射到的所有 MITRE ATT&CK 技术 ID 和名称
## MITRE ATT&CK / 威胁行为者筛选器
文本搜索下方的下拉菜单可筛选插件树,仅显示**映射到所选 ATT&CK 技术或威胁行为者组织的插件**。
### 使用方法
1. 点击下拉菜单 — 它会打开三个部分:
- `— 所有插件 —`(清除筛选器)
- **── MITRE ATT&CK 技术 ──** — 65 个技术 ID 列为 `T1055 – 进程注入`
- **── 已知威胁行为者/组织 ──** — 26 个配置文件
2. 选择一个技术 ID 或行为者名称
3. 插件树立即筛选;计数徽章更新为 `可见数/总数`
4. 文本搜索和 MITRE 筛选器以 **AND 逻辑** 结合使用 — 你可以同时在 APT29 插件中搜索 "scan"
### 技术筛选逻辑
选择一个技术也会显示映射到相关子技术的插件,反之亦然 — 匹配在两个方向上使用 `startswith` 检查。例如,选择 `T1003` 会显示映射到 `T1003.001`、`T1003.002`、`T1003.004` 和 `T1003.005` 的插件。选择 `T1003.002` 则仅显示具有该特定映射的插件。
### 威胁行为者配置文件
每个威胁行为者配置文件是一组技术 ID。选择一个行为者会显示与该行为者工具包中**任何**技术相关的所有插件(行为者集合内技术之间的 OR 逻辑)。
**包含的威胁行为者配置文件(共 26 个):**
| 行为者 | 又称 |
|---|---|
| APT1 | Comment Crew, Unit 61398 |
| APT28 | Fancy Bear, Sofacy, Pawn Storm |
| APT29 | Cozy Bear, The Dukes |
| APT32 | OceanLotus, Cobalt Kitty |
| APT38 / Lazarus Group | Hidden Cobra |
| APT41 | Winnti, BARIUM, Double Dragon |
| BlackCat / ALPHV | — |
| Carbanak / FIN7 | Navigator Group |
| Cl0p Ransomware | — |
| Conti Ransomware | — |
| DarkHotel | Tapaoux |
| Equation Group | NSA/GCHQ-linked |
| Gamaredon | Primitive Bear |
| Hive Ransomware | — |
| Kimsuky | Thallium, Black Banshee |
| LockBit Ransomware | — |
| MuddyWater | Static Kitten |
| NotPetya / Sandworm | GRU Unit 74455 |
| REvil / Sodinokibi | — |
| Ryuk Ransomware | — |
| ShadowPad | APT41-linked |
| TA505 | Evil Corp-linked |
| Turla | Venomous Bear, Waterbug |
| WannaCry | Lazarus Group |
| Winnti Group | APT41 overlap |
| Wizard Spider | Ryuk / TrickBot |
### MITRE 数据一览
| 数据集 | 计数 |
|---|---|
| 已映射的 ATT&CK 技术 ID | 65 |
| 插件到技术映射键 | 137 |
| 威胁行为者/组织配置文件 | 26 |
### 未映射的内容
仅用于**取证基础架构**的插件 — `windows.info`、`windows.crashinfo`、`windows.statistics`、`windows.virtmap`、`windows.poolscanner` 及类似插件 — **没有 ATT&CK 映射**。这些插件建立系统的基本事实;它们不检测对手行为。映射它们会用噪音污染威胁行为者筛选器。
### 技术细节 — 映射架构
该映射在 `remora.py` 文件顶部附近的四个数据结构中实现:
```
MITRE_TECHNIQUES Dict[str, str] 65 technique IDs → names
PLUGIN_MITRE_MAP Dict[str, List[str]] 137 plugin keys → technique ID lists
PLUGIN_MITRE_CONFIDENCE Dict[str, Dict[str, str]] per-plugin per-technique H/M/L ratings
THREAT_ACTORS Dict[str, List[str]] 26 actor names → technique ID sets
MITRE_TACTICS Dict[str, List[str]] 10 tactic groupings → technique prefixes
```
插件名称键通过在完整的点分隔插件名称上滑动匹配段窗口来匹配。例如,键 `"hashdump"` 可以匹配 `windows.hashdump` 和 `windows.registry.hashdump`,而无需单独条目。
## 插件配置面板
中间面板通过 `cls.get_requirements()` 根据每个插件声明的需求自动生成参数表单。基础设需求类型(`TranslationLayerRequirement`、`SymbolTableRequirement`、`ModuleRequirement`、`VersionRequirement`、`LayerListRequirement`、`MultiRequirement`、`PluginRequirement`)和自动填充的参数(`single_location`,根据加载的映像路径填充)在表单中隐藏。
### 字段类型
| 需求类型 | 控件 |
|---|---|
| `BooleanRequirement` | 复选框 |
| `IntRequirement` | 微调器(范围 −2³⁰ 到 2³⁰) |
| `ChoiceRequirement` | 填充了有效值的下拉菜单;可选字段包括 `(any)` |
| `URIRequirement` | 带有 `file:///path` 占位符的文本字段 + `…` 浏览按钮 |
| `ListRequirement` | 空格分隔的文本字段 |
| String / 其他 | 自由文本字段,描述作为占位符 |
必填字段在标签前标有 `*`。可选字段可以留空。每个标签显示一个包含需求描述字符串的工具提示。
面板顶部的插件信息块显示插件的短名称(以强调色显示)及其在 220 个字符处截断的文档字符串。
### 输出目录
在参数表单下方,一个**输出目录**字段接受路径,用于会写入转储文件的插件(`windows.dumpfiles`、`windows.pedump` 等)。文件将写入该位置,而非证据映像旁边。留空表示不传递 `-o` 标志。
## 运行插件
### 标准运行
在配置面板中点击 **▶ 运行插件**。插件在后台线程(`PluginRunnerThread`)中执行并运行命令:
```
python3 vol.py -q --renderer json -f
[--symbols ...] [-o ] [args...]
```
执行是非阻塞的 — 插件运行时 GUI 保持完全响应。
### 快速运行
双击浏览器中的任何插件可立即使用默认设置运行,绕过配置表单。
### 运行期间
- 标题栏以琥珀色显示 `▶ 插件名`
- 窗口底部出现 2 像素的不确定进度条
- 状态栏中出现 **■ 停止** 按钮 — 随时点击可干净地终止插件进程
- 来自 Volatility3 的所有 stderr 输出实时流入日志面板,包含单词 "error" 的行会相应高亮显示
### 运行多个插件
同一时间只运行一个插件。如果在一个插件活动时尝试运行第二个插件,会弹出对话框提议先停止当前插件。如果确认,正在运行的线程将中止,新插件开始运行。
### 输出解析
Remora 处理来自 `vol.py --renderer json` 的多种输出格式:
- 行字典的 JSON 数组(标准 Volatility3 输出)
- JSON 行(每行一个字典)
- 具有 `"columns"` 和 `"rows"` 键的单个 JSON 字典
- 具有 `"__children"` 的嵌套记录(在第一列中显示缩进)
- 如果 JSON 解析完全失败,则回退到原始文本
## 结果标签页
每个完成的插件运行都会在右侧面板中打开一个新的可关闭、可移动的标签页。标签页显示插件的短名称作为标签。
### 标签页工具栏
```
plugin · N rows · image.raw [Filter rows…] [Columns ▾] [Export ▾]
```
- **筛选行** — 在所有可见列中进行全文搜索;行计数实时更新
- **列** — 切换单个列的可见性;隐藏的列在所有导出中均被排除
- **导出** — 打开导出格式菜单
### 表格特性
- 交替行颜色(主题感知)
- 等宽字体:`JetBrains Mono` → `Fira Code` → `Cascadia Code` → `Consolas`
- 行高:26px;列宽上限为 360px;所有列在加载时按内容调整大小
- 点击任何列标题可进行升序/降序排序
- 语义单元格着色:`true`/`yes` → 绿色,`false`/`no` → 红色,`N/A`/`None`/`-` → 灰色
- 页脚栏显示行计数(左侧)和运行时间戳(右侧)
### 右键上下文菜单
右键单击任何单元格提供:
- **复制单元格** — 将单元格文本复制到剪贴板
- **复制行(TSV)** — 将整行作为制表符分隔值复制
- 导出子菜单(与工具栏导出按钮选项相同)
### 管理标签页
- 使用每个标签页上的 `✕` 关闭单个标签页
- **结果 > 关闭所有标签页** 清除所有内容并返回欢迎屏幕
- 当所有标签页关闭时,会自动显示欢迎屏幕
- 关闭 Volshell 标签页会终止 volshell 进程
## 导出结果
每个结果标签页都可以用七种格式导出。所有导出均遵守**活动列可见性**和**活动行筛选器** — 仅导出可见的列和可见的行。
每种格式都嵌入了 MITRE ATT&CK 元数据:与插件映射重叠的技术 ID/名称和威胁行为者名称。
### CSV
```
# 插件:windows.malfind.Malfind
# 镜像:memdump.raw
# 时间戳:2026-04-10 14:32:19
# MITRE 技术:T1055 – 进程注入;T1055.001 – DLL 注入;...
# 威胁行为者:APT28 (Fancy Bear);APT29 (Cozy Bear);...
PID,Process,Start VPN,End VPN,...
```
`#` 注释行出现在空分隔符和数据标题之前。可以毫无问题地导入 Excel 和 LibreOffice。
### TSV
与 CSV 结构相同:MITRE 注释头块、空行,然后是制表符分隔的数据。适用于 `cut`、`awk` 和数据库导入。
### JSON
```
{
"plugin": "windows.malfind.Malfind",
"image": "/cases/exhibit_001/memdump.raw",
"timestamp": "2026-04-10 14:32:19",
"mitre": {
"techniques": [
{ "id": "T1055", "name": "Process Injection" },
{ "id": "T1055.001", "name": "Process Injection: DLL Injection" }
],
"threat_actors": [
"APT28 (Fancy Bear / Sofacy / Pawn Storm)",
"APT29 (Cozy Bear / The Dukes)"
]
},
"rows": [
{ "PID": "1234", "Process": "svchost.exe", ... }
]
}
```
`"mitre"` 块是机器可解析的,可用于摄入 SIEM 或案例管理工具。
### TXT(纯文本)
```
Plugin : windows.malfind.Malfind
Image : /cases/exhibit_001/memdump.raw
Timestamp : 2026-04-10 14:32:19
Rows : 14
MITRE : T1055 – Process Injection; T1055.001 – DLL Injection; ...
Actors : APT28 (Fancy Bear); APT29 (Cozy Bear); APT38 / Lazarus Group; ...
Carbanak / FIN7; Conti Ransomware; ...
PID Process Start VPN End VPN ...
--------- ------------- ------------------ ------------------ ...
```
行为者名称在每行四个的情况下换行到续行(缩进)。适用于复制粘贴到报告中或作为证据附件。
### HTML
一个自包含、深色主题的 HTML 报告,没有外部 CSS 或 JavaScript 依赖。当插件具有 ATT&CK 映射时,数据表上方会出现一个 **MITRE 徽章部分**:
```
┌──────────────────────────────────────────────────────────────────┐
│ MITRE ATT&CK [T1055] [T1055.001] [T1055.002] [T1620] [...] │
│ Threat Actors [APT28] [APT29] [APT38] [Carbanak] [...] │
└──────────────────────────────────────────────────────────────────┘
```
- 技术 ID 渲染为深蓝色单色芯片;悬停时以浏览器工具提示形式显示完整技术名称
- 威胁行为者名称渲染为深红色芯片
- 如果插件没有 ATT&CK 映射,则完全省略徽章部分
### PDF
```
windows.malfind.Malfind
/cases/exhibit_001/memdump.raw · 2026-04-10 14:32:19 · 14 rows
MITRE Techniques T1055 – Process Injection; T1055.001 – DLL Injection; ...
Threat Actors APT28 (Fancy Bear); APT29 (Cozy Bear); ...
PID Process Start VPN ...
```
输出为 A4 横向。如果 `PyQt5.QtPrintSupport` 不可用,PDF 导出菜单项将被禁用(灰色显示)。
### XLSX(Excel)
需要 `pip install openpyxl`。
**主数据工作表** — 以插件的短名称命名 — 在数据上方包含样式化的元数据行:
| 行 | 标签 | 值 |
|---|---|---|
| 1 | 插件 | `windows.malfind.Malfind` |
| 2 | 映像 | `/cases/exhibit_001/memdump.raw` |
| 3 | 时间戳 | `2026-04-10 14:32:19` |
| 4 | 行数 | `14` |
| 5 | MITRE 技术 | `T1055 – 进程注入; ...` |
| 6 | 威胁行为者 | `APT28 (Fancy Bear); ...` |
| 7 | *(空)* | |
| 8+ | *(列标题 + 数据)* | |
列宽自动调整(上限为 50 个字符)。单元格使用深色主题调色板。
**“MITRE 覆盖范围”工作表** — 当插件具有 ATT&CK 映射时自动添加:
| A 列 | B 列 |
|---|---|
| 插件 | `windows.malfind.Malfind` |
| 时间戳 | `2026-04-10 14:32:19` |
| | |
| 技术 ID | 技术名称 |
| T1055 | 进程注入 |
| T1055.001 | 进程注入:DLL 注入 |
| ... | |
| | |
| 威胁行为者 | |
| APT28 (Fancy Bear / Sofacy / Pawn Storm) | |
| ... | |
## MITRE 覆盖矩阵
**工具 > MITRE 覆盖矩阵…** (`Ctrl+Shift+M`)
打开一个独立窗口 (1280 × 820),显示每个具有 ATT&CK 映射的 Volatility3 插件,以 10 个 ATT&CK 战术列的网格形式展示。
### 显示内容
```
┌──────────────────────────────────────────────────────────────────────────────────────┐
│ MITRE ATT&CK COVERAGE MATRIX ● H = primary ◉ M = secondary ○ L = circumstantial │
│ [Filter plugins…] [All Tactics ▾] [All Confidence ▾] [Export CSV ▾] │
├──────────────────────────────┬─────────┬──────┬───────┬───────┬──────┬───────┬──────┤
│ Plugin │ OS │ Exec │ Perst │ PrivE │ DefE │ Cred │ Disc │
├──────────────────────────────┼─────────┼──────┼───────┼───────┼──────┼───────┼──────┤
│ windows.malfind.Malfind │ Win │ │ │ ● H │ ◉ M │ │ │
│ windows.hashdump.Hashdump │ Win │ │ │ │ │ ● H │ │
│ windows.netscan.NetScan │ Win │ │ │ │ │ │ ● H │
│ linux.check_syscall.Check_.. │ Linux │ │ │ │ ● H │ │ │
└──────────────────────────────┴─────────┴──────┴───────┴───────┴──────┴───────┴──────┘
│ 181 plugins mapped │
└──────────────────────────────────────────────────────────────────────────────────────┘
```
### 置信度等级
每个战术单元格显示该插件在该战术列中映射到的技术的**最高置信度等级**:
| 符号 | 等级 | 含义 | 颜色 |
|---|---|---|---|
| `● H` | 高 | 插件是专门为此检测设计的 | 红色/强调色 |
| `◉ M` | 中 | 强次级信号(未明确评级时的默认值) | 琥珀色 |
| `○ L` | 低 | 仅旁证或间接证据 | 灰色 |
| *(空)* | 无 | 该战术无映射 | — |
### 战术列
| 列 | ATT&CK 战术 | 示例高置信度插件 |
|---|---|---|
| 执行 | TA0002 | `cmdline`, `cmdscan`, `bash`, `direct_system_calls` |
| 持久化 | TA0003 | `scheduled_tasks`, `svcscan`, `shimcachemem`, `callbacks` |
| 权限提升 | TA0004 | `malfind`, `hollowprocesses`, `processghosting`, `privileges` |
| 防御规避 | TA0005 | `ssdt`, `etwpatch`, `check_idt`, `unhooked_system_calls` |
| 凭据访问 | TA0006 | `hashdump`, `cachedump`, `lsadump`, `skeleton_key_check` |
| 发现 | TA0007 | `netscan`, `pslist`, `filescan`, `hivelist` |
| 横向移动 | TA0008 | `netscan`, `netstat`, `sessions` |
| 收集 | TA0009 | `dumpfiles`, `mftscan`, `pedump` |
| 命令与控制 | TA0011 | `netscan`, `netstat`, `mutantscan` |
| 影响 | TA0040 | `truecrypt` |
### 筛选矩阵
所有三个筛选器以 AND 逻辑组合:
- **文本搜索** — 按插件名称子字符串筛选
- **战术下拉菜单** — 仅显示在所选战术中具有任何覆盖的插件;置信度筛选器仅应用于该战术列
- **置信度下拉菜单** — `所有置信度` / `仅高` / `高 + 中`
### 导出矩阵
点击 **导出 CSV ▾** 保存当前可见的矩阵。单元格包含原始的 `H`、`M`、`L` 或空值 — 而非显示符号 — 以便后续处理。
## 自定义符号表(Linux 和 macOS)
Volatility3 需要 ISF(中间符号格式)JSON 文件来分析 Linux 和 macOS 内存映像。这些文件必须与正在检查的映像的精确内核版本匹配。
### 通过 GUI 加载
1. 打开 **符号 > Linux 符号表** 或 **符号 > macOS 符号表**
2. 选择 **添加符号表文件…** 以选择一个或多个 `.json` / `.json.gz` / `.isf` / `.isf.gz` 文件,或 **添加符号表目录…** 指向一个文件夹
3. 菜单项更新显示为 `已加载:N 个路径 — 查看…` — 点击可在对话框中查看所有已加载的路径
4. 后续所有插件运行会自动为每个加载的路径包含 `--symbols <路径>`
5. 使用 **清除 Linux 符号**、**清除 macOS 符号** 或 **清除所有自定义符号** 来移除路径
上次使用的符号目录会在会话间记住。
### 生成符号表
```
# 安装 dwarf2json
git clone https://github.com/volatilityfoundation/dwarf2json.git
cd dwarf2json && go build
# 从带有调试符号的 Linux 内核生成
./dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-$(uname -r) \
> linux-$(uname -r).json
```
预构建的表也可从 [Volatility3 符号仓库](https://github.com/volatilityfoundation/volatility3-symbols) 获取。
## 内置 Volshell
**工具 > 打开 Volshell…** (`Ctrl+Shift+S`)
打开一个由 `volshell.py` 支持的交互式 Python REPL 标签页,允许直接访问 Volatility3 针对已加载映像的层、上下文和符号 API。与进程的通信使用 Qt 的 `QProcess`,合并 stdout/stderr。
### 要求
- 在打开 Volshell 之前必须加载内存映像
- 同一时间只能打开一个 Volshell 标签页;当一个已存在时调用菜单项会切换到该标签页,而不是打开第二个
### 使用 Volshell
在 `>>>` 输入栏中输入 Python 表达式并按 **Enter** 或点击 **发送**。输出流式传输到上方的显示区。
```
# 列出所有正在运行的进程
for proc in context.modules["primary"].object_table:
print(f"PID {proc.UniqueProcessId} {proc.ImageFileName}")
# 检查特定 PID
ps = next(p for p in context.modules["primary"].object_table
if p.UniqueProcessId == 1234)
print(ps.ImageFileName, hex(ps.obj_offset))
# 直接访问内核模块
krnl = context.modules["kernel"]
```
**命令历史:** 输入栏中的 ↑ / ↓ 箭头键可在当前会话中循环显示之前输入的命令。
### 标签页工具栏控件
| 按钮 | 操作 |
|---|---|
| **重启** | 终止当前进程并针对相同映像启动一个新的 Volshell |
| **杀死** | 终止进程而不重启 |
关闭 Volshell 标签页会自动终止该进程。
## 自动日志文件
在加载内存映像的那一刻就会创建日志文件。无需配置。
### 文件命名和位置
```
_.log
```
保存在**证据映像旁边**,使工件与证据保持同位:
| 映像路径 | 日志路径 |
|---|---|
| `/cases/exhibit_001/memdump.raw` | `/cases/exhibit_001/memdump_2026-04-10.log` |
| `/mnt/evidence/WIN10.vmem` | `/mnt/evidence/WIN10_2026-04-10.log` |
映像主干名中非文件系统安全的字符将被替换为 `_`。
### 会话分隔符
如果在同一天重新检查同一个映像,条目将被追加。每个会话由以下分隔:
```
========================================================================
Session started : 2026-04-10 09:14:22
Image : /cases/exhibit_001/memdump.raw
========================================================================
```
### 条目格式
每个日志条目使用完整的 ISO 8601 时间戳和固定宽度的级别标签:
```
[2026-04-10 14:32:01] [SUCCESS] Loaded: /cases/exhibit_001/memdump.raw
[2026-04-10 14:32:07] [INFO ] → windows.malfind.Malfind
[2026-04-10 14:32:08] [CMD ] $ python3 vol.py -q --renderer json -f /cases/exhibit_001/memdump.raw windows.malfind.Malfind
[2026-04-10 14:32:19] [SUCCESS] ← Malfind 14 rows
[2026-04-10 14:35:01] [WARNING] Plugin stopped by user.
```
### 日志级别
| 级别 | 出现时机 |
|---|---|
| `SUCCESS` | 插件完成、映像加载 |
| `INFO` | 插件已分派、状态消息 |
| `CMD` | 执行的精确 `vol.py` 命令 |
| `WARNING` | 插件被用户停止、非致命问题 |
| `ERROR` | Volatility3 错误输出、进程失败 |
| `DEBUG` | 详细的 Volatility3 stderr |
### GUI 内日志面板
日志面板实时镜像条目,并按严重程度进行颜色编码。当前日志文件名显示在面板标题中。**结果 > 清除日志**(或 **清除** 按钮)仅清除 GUI 内显示 — 磁盘上的文件不受影响。
如果证据目录是只读的,日志写入会静默失败(使用 `pass`),以避免 GUI 崩溃。
## 主题
标题栏中的 **[ 浅色 ] / [ 深色 ]** 切换按钮在两个调色板之间切换。所选主题通过 `QSettings` 在会话间持久化。
**深色(默认):** 专为长时间分析会话设计的近黑色炭灰背景。背景 `#0d0f14`,面板 `#11141a`,强调色 `#1f9cd8`。锐边、密集布局、大写部分标签 — 模仿专业安全工具。
**浅色:** 冷色调石板灰。背景 `#f0f3f7`,提升色 `#ffffff`,强调色 `#1470a8`。
切换主题时,所有打开的结果标签页、浏览器类别项和覆盖矩阵(如果打开)会立即重新设置样式,无需重启。
应用程序字体为 `Inter` / `SF Pro Text` / `Segoe UI` / `Ubuntu`,11pt。等宽区域使用 `JetBrains Mono` / `Fira Code` / `Cascadia Code` / `Consolas`。
## 键盘快捷键
| 快捷键 | 操作 |
|---|---|
| `Ctrl+O` | 打开内存映像 |
| `Ctrl+Q` | 退出 |
| `Ctrl+Shift+S` | 打开 Volshell |
| `Ctrl+Shift+M` | 打开 MITRE 覆盖矩阵 |
| `F5` | 刷新插件列表 |
| `↑` / `↓` | 在 Volshell 输入栏中循环命令历史 |
## 菜单参考
| 菜单 | 项目 | 快捷键 | 操作 |
|---|---|---|---|
| **文件** | 打开映像… | `Ctrl+O` | 通过文件浏览器打开内存映像 |
| **文件** | 退出 | `Ctrl+Q` | 关闭应用程序 |
| **符号** | Linux 符号表 > 添加符号表文件… | — | 为 Linux 分析添加 .json/.json.gz/.isf/.isf.gz 文件 |
| **符号** | Linux 符号表 > 添加符号表目录… | — | 添加 Linux 符号表的目录 |
| **符号** | Linux 符号表 > 已加载:N 个路径 — 查看… | — | 显示已加载的 Linux 符号路径 |
| **符号** | Linux 符号表 > 清除 Linux 符号 | — | 移除所有 Linux 符号路径 |
| **符号** | macOS 符号表 > (相同结构) | — | 与 Linux 相同,用于 macOS |
| **符号** | 清除所有自定义符号 | — | 移除所有 Linux 和 macOS 符号路径 |
| **结果** | 关闭所有标签页 | — | 关闭所有结果标签页并显示欢迎屏幕 |
| **结果** | 清除日志 | — | 清除 GUI 内日志显示(文件不受影响) |
| **插件** | 刷新插件列表 | `F5` | 重新运行插件发现 |
| **工具** | 打开 Volshell… | `Ctrl+Shift+S` | 打开交互式 Volshell 标签页 |
| **工具** | MITRE 覆盖矩阵… | `Ctrl+Shift+M` | 打开覆盖矩阵窗口 |
| **帮助** | 关于 | — | 显示版本信息对话框 |
## 目录结构
设置完成后,你的仓库根目录将如下所示:
```
volatility3/
├── vol.py ← Volatility3 CLI
├── volshell.py ← Volatility3 interactive shell
├── remora.py ← GUI frontend (this tool)
├── requirements.txt
├── setup.py
├── volatility3/
│ ├── framework/
│ ├── plugins/
│ │ ├── windows/ ← Windows plugins
│ │ ├── linux/ ← Linux plugins
│ │ └── mac/ ← macOS plugins
│ └── symbols/
│ ├── generic/
│ └── (your .json symbol files)
└── (case directory — logs written here, alongside evidence)
```
## 取证稳健性
取证稳健性是核心设计原则,而非事后考虑。
### 只读证据处理
- `remora.py` 仅通过 `-f` 标志将证据文件传递给 Volatility3
- 任何时候执行写操作
- 工具从不复制、修改或移动原始文件
- 加载时显示文件名和大小,以便检查员在运行任何插件之前确认正确的映像
### 精确命令透明度
每个插件调用都记录完整的 `vol.py` 命令,包括所有标志。任何发现都可以通过原样重新运行记录的命令来独立重现。
### 非破坏性停止
**■ 停止** 按钮通过 `proc.terminate()` 终止正在运行的插件进程。停止插件不会影响证据文件,不会损坏进行中的输出,并会向审计日志写入一条 `[WARNING] Plugin stopped by user.` 条目。
### 输出目录隔离
转储文件的插件(例如 `windows.dumpfiles`)写入明确指定的输出目录,而非证据映像旁边。
### 无网络访问
## 故障排除
### `错误:需要 PyQt6`
```
pip install PyQt6
```
### 浏览器中未出现插件
确保你是在克隆的 `volatility3/` 目录内运行 `remora.py` — 具体来说,`vol.py` 和 `volshell.py` 必须存在于同一文件夹中。按 `F5` 重试插件发现。检查日志面板以获取具体的导入错误消息。
### Linux/macOS 插件失败并显示 `No symbol table`
你需要一个匹配目标内核的 ISF 符号文件。通过 **符号 > Linux 符号表 > 添加符号表文件…** 加载它。
### MITRE 筛选器对某个技术未显示任何插件
少数技术仅映射到少量插件。尝试父技术(例如选择 `T1003` 而不是 `T1003.001`)。同时确认插件发现已完成 — 状态栏应显示插件计数。如果列表为空,请按 `F5` 刷新。
### MITRE 覆盖矩阵为空
插件发现必须在打开矩阵之前完成。等待状态栏显示插件计数,然后重试。
### PDF 导出按钮为灰色
### XLSX 导出显示 `pip install openpyxl`
```
pip install openpyxl
```
### Volshell 标签页显示 `Failed to start volshell.py`
确认 `volshell.py` 与 `remora.py` 存在于同一目录中,并且 Volatility3 的依赖项已完全安装:
```
pip install -r requirements.txt
```
### 日志文件未创建
日志文件写入在证据映像旁边。如果该目录是只读的(例如挂载的 ISO 或写保护的共享),日志写入会静默失败以避免 GUI 崩溃。将映像复制到可写位置,或检查目录权限。
### 主题每次启动时恢复为深色
主题首选项通过 `QSettings` 存储在组织名称 `vol3gui` 下。在 Linux 上,这通常是 `~/.config/vol3gui/prefs.conf`。如果该文件不可写,则无法保存首选项。
## MITRE ATT&CK 映射 — 设计说明
该映射基于以下原则构建:
**1. 映射插件检测的内容,而非插件本身。**
`netscan` 由分析师使用。它*检测到的证据*是对手的网络活动 (T1049, T1071, T1021)。映射反映的是对手技术,而非分析师操作。
**2. 取证基础架构没有映射。**
诸如 `windows.info`、`windows.crashinfo`、`windows.statistics` 和 `windows.virtmap` 之类的插件建立系统的基本事实。它们不检测对手行为。将它们映射到 T1082(系统信息发现)将意味着“对手运行了 remora.py”,这是不正确的。它们被有意排除。
**3. 置信度等级是保守的。**
只有当插件是专门为该检测设计时,才获得 `High` — `skeleton_key_check` → T1556.001 是 `High`;`strings` → T1071 是 `Low`,因为在字符串输出中找到 C2 URI 是旁证。当 `PLUGIN_MITRE_CONFIDENCE` 中没有显式条目时,默认置信度为 `Medium`。
**4. 父技术选择会级联。**
在筛选器中选择 T1003 会显示映射到 T1003、T1003.001、T1003.002、T1003.004 和 T1003.005 的插件。这反映了 ATT&CK 本身的结构。
**5. 已知的局限性。**
以下技术只能通过自定义 Volatility3 插件或手动 VAD 分析检测 — 目前没有原生插件映射到它们:
- T1055.013(进程替身)
- T1134.003/004/005(令牌模拟子技术)
- T1070.001(清除 Windows 事件日志 — 工件在事件日志中,而非内存中)
## 许可协议
Remora 根据 [MIT 许可证](LICENSE) 发布。版权所有 (c) 2026 BushidoCyb3r。
MITRE ATT&CK® 是 The MITRE Corporation 的注册商标。技术描述和行为者配置文件源自公开可用的 ATT&CK 知识库。
*为补充 [Volatility3](https://github.com/volatilityfoundation/volatility3) — 世界领先的开源内存取证框架而构建。*标签:Cloudflare, DAST, JARM, MITRE ATT&CK, Python, SecList, Volatility3, Volshell, 内存分析, 内存取证, 取证工具, 图形用户界面, 威胁情报, 威胁行为者过滤, 审计日志, 工作流自动化, 开发者工具, 恶意软件分析, 插件浏览器, 数字取证, 数据导出, 无后门, 桌面应用, 用户界面, 自动化脚本, 逆向工具