SecurityRonin/memory-forensic
GitHub: SecurityRonin/memory-forensic
一个纯 Rust 编写的内存取证框架,支持解析多种物理内存转储格式,遍历 Linux 内核结构并提取分类字符串,适用于应急响应与数字取证场景。
Stars: 0 | Forks: 0
# memf
一个纯 Rust 的内存取证框架。可读取物理内存转储,遍历 Linux 内核结构,提取字符串,并对入侵指标进行分类。
零 `unsafe` 代码。采用 Apache-2.0 许可证。包含 237 个测试。
## 为什么选择 memf
**适合事件响应人员**,他们需要对来自 Linux 服务器的内存转储进行分类。只需将 `memf` 指向 LiME、AVML 或 ELF 核心转储,即可在几秒钟内获取进程、网络连接、内核模块和已分类的字符串。
**适合取证开发人员**,他们想要一个可控的库。每个组件都是一个具有清晰 trait 边界的独立 crate。您可以替换符号解析器、添加新的转储格式,或编写自定义的字符串分类器,而无需触及代码库的其余部分。
**核心功能无 C 语言依赖。** 该框架可在 Rust 支持的任何平台上编译。YARA-X 集成是唯一的原生依赖,并且仅当您需要基于规则的字符串匹配时才需要。
### 对比
| 功能 | memf | Volatility3 | MemProcFS |
|---|---|---|---|
| 语言 | Rust (内存安全) | Python | C/C++ |
| 许可证 | Apache-2.0 | Volatility 软件许可证 | AGPL-3.0 |
| 转储格式 | LiME, AVML, ELF core, Raw | 10+ | 10+ |
| Linux 进程遍历 | 是 | 是 | 是 |
| 网络连接 | 是 | 是 | 是 |
| 内核模块 | 是 | 是 | 是 |
| KASLR 检测 | 是 | 是 | 是 |
| 字符串分类 | YARA-X + 正则表达式 (12 个类别) | yarascan 插件 | 否 |
| 符号后端 | ISF JSON, BTF | ISF JSON | PDB |
| 页表遍历 | x86_64 (4KB/2MB/1GB) | x86_64, ARM64, x86 | x86_64, ARM64 |
| `unsafe` 代码 | 无 | 不适用 (Python) | 大量 |
memf 目前涵盖了 Linux 分析。Windows 支持、rootkit 检测和文件重建正在积极开发中。
## 快速开始
### 从源码安装
```
git clone https://github.com/SecurityRonin/memory-forensic.git
cd memory-forensic
cargo build --release
```
二进制文件位于 `target/release/memf`。
### 检查内存转储
```
# 显示格式、大小和物理内存范围
memf info server.lime
# 输出:
# 格式: LiME
# 总大小: 8589934592 字节 (8.00 GB)
# 范围: 3
# # ┌───┬────────────────┬────────────────┬──────────┐
# │ # │ 开始 │ 结束 │ 大小 │
# ├───┼────────────────┼────────────────┼──────────┤
# │ 0 │ 0x000000001000 │ 0x00000009f000 │ 632.00KB │
# │ 1 │ 0x000000100000 │ 0x00007fff0000 │ 2.00 GB │
# │ 2 │ 0x000100000000 │ 0x000280000000 │ 6.00 GB │
# └───┴────────────────┴────────────────┴──────────┘
```
### 提取和分类字符串
```
# 从内存转储中提取 (ASCII + UTF-16LE, 最小长度 4)
memf strings server.lime --output table
# 从预先提取的 strings 文件中提取
memf strings --from-file memory-strings.ascii --output json
# 使用自定义 YARA 规则
memf strings server.lime --rules ./yara-rules/ --output csv
```
字符串分类识别 12 种指标类别:URL、IPv4 地址、电子邮件地址、Unix 路径、Windows 路径、注册表键、加密货币地址、PEM 私钥、base64 数据块和 shell 命令。YARA 规则在此基础之上增加了无限的自定义模式。
### 列出进程(需要 ISF 符号)
```
memf ps server.lime --symbols linux-6.1.0.json --output table
```
### 列出内核模块
```
memf modules server.lime --symbols linux-6.1.0.json
```
### 列出网络连接
```
memf netstat server.lime --symbols linux-6.1.0.json
```
### 输出格式
每个子命令都支持 `--output table`(默认)、`--output json`(NDJSON,每行一个对象)和 `--output csv`。
## 架构
```
memf (CLI binary)
├── memf-format Physical memory providers (LiME, AVML, ELF core, Raw)
├── memf-symbols Symbol resolution (ISF JSON, BTF)
├── memf-core Virtual address translation + object reader
├── memf-linux Linux kernel walkers (processes, modules, network)
└── memf-strings String extraction + classification (regex, YARA-X)
```
### crate 职责
**memf-format** 从转储文件中读取原始字节。每种格式都实现了 `PhysicalMemoryProvider`,提供 `read_phys(addr, buf)` 和 `ranges()`。`open_dump()` 函数使用由 `inventory` crate 支持的插件评分系统自动检测格式。
**memf-symbols** 解析内核结构布局和符号地址。`SymbolResolver` trait 抽象了 ISF JSON (Volatility3 格式) 和 BTF (Linux 内核内置类型信息)。您可以获取字段偏移量、结构体大小以及符号虚拟地址。
**memf-core** 处理 x86_64 4 级页表遍历和内核对象读取。`VirtualAddressSpace` 将虚拟地址转换为物理地址。`ObjectReader` 从内核结构体中读取类型化字段,跟踪指针,并带有循环检测地遍历循环链表。
**memf-linux** 遍历内核数据结构。进程枚举跟踪来自 `init_task` 的 `task_struct` 链表。模块枚举遍历 `modules` 列表。网络枚举扫描 `tcp_hashinfo.ehash` 哈希桶。KASLR 偏移检测在物理内存中扫描 `"Linux version "` 标志。
**memf-strings** 以 64KB 块从物理内存中提取 ASCII 和 UTF-16LE 字符串,并带有用于跨边界字符串的重叠处理。`classify_strings()` 管道运行所有已注册的分类器(正则表达式模式 + 可选的 YARA 规则),并使用匹配的类别和置信度分数标记每个字符串。
### 插件系统
格式提供程序和字符串分类器在编译时通过 Rust 的 `inventory` crate 进行注册。添加新格式:
```
use memf_format::{FormatPlugin, PhysicalMemoryProvider};
pub struct MyFormat { /* ... */ }
impl PhysicalMemoryProvider for MyFormat { /* ... */ }
pub struct MyPlugin;
impl FormatPlugin for MyPlugin {
fn name(&self) -> &str { "MyFormat" }
fn probe(&self, data: &[u8]) -> u8 { /* return 0-100 confidence */ }
fn open(&self, data: Vec) -> memf_format::Result> { /* ... */ }
}
inventory::submit!(Box::new(MyPlugin) as Box);
```
### 符号文件
memf 读取与 Volatility3 符号包兼容的 ISF JSON 文件。可以从带有调试信息的 Linux 内核生成它们:
```
# 使用 Volatility3 的 dwarf2json
dwarf2json linux --elf /usr/lib/debug/boot/vmlinux-$(uname -r) > symbols.json
# 将 memf 指向文件
memf ps dump.lime --symbols symbols.json
# 或指向包含符号文件的目录
memf ps dump.lime --symbols /path/to/symbols/
# 或设置环境变量
export MEMF_SYMBOLS_PATH=/path/to/symbols/
memf ps dump.lime
```
## 支持的转储格式
| 格式 | 来源 | 检测方式 |
|---|---|---|
| **LiME** | [LiME 内核模块](https://github.com/504ensicsLabs/LiME) | 魔术字节 `EMiL` (0x4C694D45) |
| **AVML** | [Microsoft AVML](https://github.com/microsoft/avml) | 魔术字节 `AVML` + 版本 2 |
| **ELF core** | QEMU, libvirt, crash dumps | ELF 头 + PT_LOAD 段 |
| **Raw** | dd, /dev/mem, 各种工具 | 回退 (平面内存映像) |
格式检测是自动的。`open_dump()` 会探测每个已注册的插件,并选择置信度最高的匹配项。
## 构建和测试
```
# 构建
cargo build --release
# 运行所有测试
cargo test --workspace
# 运行特定 crate 的测试
cargo test -p memf-format
cargo test -p memf-linux
# 使用真实转储数据运行
MEMF_TEST_DATA=/path/to/dumps cargo test --test real_data -- --ignored
# Lint
cargo clippy --workspace -- -D warnings
```
## 项目状态
**稳定且经过测试:** 格式检测、字符串提取、正则表达式 + YARA 分类、ISF/BTF 符号解析、x86_64 页表遍历、Linux 进程/模块/网络枚举、KASLR 检测。
**开发中:** Windows 转储格式(crashdump、hiberfil.sys、VMware VMSS/VMSN)、Windows 内核遍历、ARM64 页表、rootkit 检测、从 VADs 进行文件重建、凭据提取、FUSE 虚拟文件系统。
## 许可证
Apache-2.0。详情请参阅 [许可证](LICENSE)。
标签:AVML, BTF, DAST, ELF core, IP 地址批量处理, ISF JSON, JARM, KASLR检测, LiME, Mr. Robot, Rust, SecList, x86_64, YARA-X, 内存分析, 内存取证, 内存安全, 内核模块, 分页表遍历, 原始内存转储, 可视化界面, 妥协指标分类, 字符串提取, 安全资源, 库, 应急响应, 开源安全框架, 恶意软件分析, 数字取证, 无C依赖, 无线安全, 符号解析, 纯Rust, 网络安全, 网络流量审计, 网络连接提取, 自动化脚本, 进程遍历, 通知系统, 隐私保护, 零unsafe