SecurityRonin/apm-partition-forensic
GitHub: SecurityRonin/apm-partition-forensic
一个纯 Rust 实现的只读 Apple Partition Map 解析器与取证异常审计库,用于读取磁盘分区布局并按严重程度分级标记结构异常。
Stars: 0 | Forks: 0
# apm-partition-forensic
[](https://crates.io/crates/apm-partition-core)
[](https://crates.io/crates/apm-partition-forensic)
[](https://docs.rs/apm-partition-forensic)
[](LICENSE)
[](https://github.com/SecurityRonin/apm-partition-forensic/actions)
[](https://github.com/sponsors/h4x0r)
**读取 Apple Partition Map —— 然后将其结构异常评定为按严重程度排名的取证发现。**
一个只读的 APM 读取器(Driver Descriptor Map + 分区条目:名称、类型、边界),搭配一个异常审计器,专门标记取证审查员所关注的内容:映射计数不一致、重叠或越界的分区、残留(隐藏)条目,以及可能隐藏数据的未映射内部区域。纯 Rust 实现,无 `unsafe`。
```
use apm_forensic::analyse;
let report = analyse(&std::fs::read("disk.img")?)?;
for a in &report.anomalies {
println!("[{}] {}: {}", a.severity, a.code, a.note);
}
# Ok::<(), apm_forensic::Error>(())
```
```
APM Forensic Analysis
block size : 512 bytes
device blocks : 6144
Partition map (2 entries):
[0] Apple Apple_partition_map blocks 1..=63
[1] disk image Apple_HFS blocks 64..=6143
Anomalies: none
Highest severity: none (clean)
```
`apm-partition-forensic` 是一个**库**。如需一个现成的、能自动检测方案并为*任何*磁盘打印此信息的命令行工具,请安装统一的
[`disk4n6`](https://github.com/SecurityRonin/disk-forensic) 工具
(`cargo install disk-forensic`)。
## 两个 Crate
| Crate | 导入为 | 角色 |
|---|---|---|
| [`apm-partition-core`](https://crates.io/crates/apm-partition-core) | `apm` | 只读读取器:Driver Descriptor Map + 分区条目 (`parse`, `ApplePartitionMap`, `ApmPartition`) |
| [`apm-partition-forensic`](https://crates.io/crates/apm-partition-forensic) | `apm_forensic` | 异常审计器:`analyse` / `analyse_reader` → 生成评定等级的 `Anomaly` 发现,构建于读取器之上 |
forensic crate 重新导出了读取器的 `parse`、`ApplePartitionMap`、`ApmPartition` 和 `Error`,因此仅依赖它即可获得这两层功能。
## 安装
```
[dependencies]
apm-partition-forensic = "0.4" # analyzer + re-exported reader
# 或者,仅 reader:
apm-partition-core = "0.4"
```
## 快速开始
```
// `data` begins at the device's first byte (block 0 = Driver Descriptor Map).
let data: Vec = std::fs::read("disk.img")?;
if let Some(map) = apm_forensic::parse(&data) {
println!("{}-byte blocks, {} partitions", map.block_size, map.partitions.len());
for p in &map.partitions {
println!(" {:<24} {} start {} ({} blocks)", p.type_name, p.name, p.start_block, p.block_count);
}
if let Some(hfs) = map.hfs_partition() {
println!("Apple_HFS at block {}", hfs.start_block);
}
}
```
## 解析内容
| 功能 | 说明 |
|---|---|
| Driver Descriptor Map | `ER` 签名,设备块大小 |
| 分区条目 | `PM` 条目:名称、类型、起始块、块数量 |
| HFS 查找 | `hfs_partition()` 查找首个 `Apple_HFS` 切片 |
## 取证异常检测
`parse()` 为您提供布局;`analyse()`(字节切片)和 `analyse_reader()`
(任何 `Read + Seek`,用于与容器 crate 组合)添加了按严重程度排名的
异常检查:
```
let report = apm_forensic::analyse(&std::fs::read("disk.img")?)?;
for a in &report.anomalies {
println!("[{}] {}: {}", a.severity, a.code, a.note);
}
# Ok::<(), apm_forensic::Error>(())
```
| 异常 | 代码 | 严重程度 |
|---|---|---|
| 重叠分区 | `APM-PART-OVERLAP` | Critical |
| 分区越界 | `APM-PART-OOB` | High |
| 残留(已删除)条目 | `APM-PART-RESIDUAL` | High |
| 缺少 `Apple_partition_map` 自身条目 | `APM-NO-MAP-ENTRY` | High |
| `pmMapBlkCnt` 不一致 | `APM-MAP-COUNT` | Medium |
| 未映射区域(可能隐藏数据) | `APM-UNMAPPED` | Medium |
| 零长度分区 | `APM-PART-ZEROLEN` | Low |
| 未知分区类型 | `APM-PART-UNKNOWN` | Info |
分区类型字符串会根据
[`forensicnomicon`](https://github.com/SecurityRonin/forensicnomicon) 知识库
进行评定。每项异常都是一种*观察结果*(“与……一致”),绝不是最终判定 —
结论由审查员做出。
## 信任,但要验证
这些 crate 会解析不受信任的、可被攻击者控制的磁盘镜像,因此标准是
*永不 panic,永不越界读取,永不信任长度字段*:
- **无 panic** — 生产代码不包含 `unwrap`/`expect`/`panic!`,由工作区 lint 作为硬性 `deny` 强制执行;整数通过边界检查辅助函数读取,在切片过短时返回 `0` 而不是 panic;条目计数设有上限 (`MAX_PARTITIONS`) 以防止映射损坏。
- **模糊测试** — `cargo fuzz` 目标驱动 `parse` 读取器和完整的 `analyse` 审计流水线;不变量是对于任何输入都“绝不 panic”。
- **真实工件验证** — 针对由真实的 `hdiutil` 创建的 APM(`Apple_partition_map` + `Apple_HFS` 条目)进行了测试,因此布局是对照真实的 Apple 输出进行检查的,而不仅仅是合成夹具。
- **无 `unsafe`** — 整个工作区内强制 `unsafe_code = "forbid"`。
## 相关项目
[Security Ronin](https://github.com/SecurityRonin) 取证工具包的一部分。同级的分区读取器:[`gpt-forensic`](https://github.com/SecurityRonin/gpt-forensic)、[`mbr-forensic`](https://github.com/SecurityRonin/mbr-forensic)。[`disk-forensic`](https://github.com/SecurityRonin/disk-forensic) 编排器可自动检测方案,并分发给这三者中合适的一个。文件系统:[`hfsplus-forensic`](https://github.com/SecurityRonin/hfsplus-forensic)、[`udf-forensic`](https://github.com/SecurityRonin/udf-forensic)。被 [`iso9660-forensic`](https://github.com/SecurityRonin/iso9660-forensic) 用于处理 Apple 混合光盘。
[隐私政策](https://securityronin.github.io/apm-partition-forensic/privacy/) · [服务条款](https://securityronin.github.io/apm-partition-forensic/terms/) · © 2026 Security Ronin Ltd
标签:Rust, 可视化界面, 数字取证, 数据隐藏检测, 文件系统解析, 磁盘分析, 网络流量审计, 自动化脚本, 通知系统