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