ebrig/ewf-image
GitHub: ebrig/ewf-image
一个纯 Rust 编写的数字取证磁盘镜像库,提供 EWF/E01(含 EWF1 和 EWF2)格式镜像的完整读写能力、元数据检查和完整性校验功能。
Stars: 0 | Forks: 0
# ewf-image
**一个纯 Rust 库,用于读取和写入专家证人格式(Expert Witness Format, EWF)取证镜像。**
[](https://crates.io/crates/ewf-image)
[](https://docs.rs/ewf-image)
[](LICENSE)

`ewf-image` 读取和写入数字取证中使用的 EWF/E01 镜像格式 —— 包括物理、逻辑、SMART 和 EWF2 系列 —— 没有任何
unsafe 代码,也没有外部工具依赖。它暴露了用于原始流访问、元数据检查、逻辑单文件目录和 EWF 输出创建的专用 API。
## 亮点
- **全格式覆盖。** 读取和写入 EWF1 (`.E01`, `.L01`, `.S01`) 和
EWF2 (`.Ex01`, `.Lx01`),包括 raw、zlib、BZip2 和 pattern-fill chunks。
- **流式读取。** 不可变的 `Image` handle 提供定位读取、
`Read + Seek` 游标,以及有界的解码 chunk 缓存。
- **丰富的元数据。** 检查获取头、存储的 MD5/SHA1 哈希、
获取错误、会话和轨道。
- **完整性校验。** 通过一次
`Image::verify()` 调用即可重新计算并比对存储的哈希。
- **灵活的写入。** 支持压缩、segment 分割、
secondary/shadow 镜像、自定义元数据,以及通过重写实现的恢复。
- **构造上的安全性。** `#![forbid(unsafe_code)]`,在 clippy
pedantic/nursery 下进行了 lint 检查,并针对外部 EWF 工具预言机进行了测试。
## 安装说明
```
[dependencies]
ewf-image = "0.1"
```
默认的 `verify` 特性通过
`Image::verify()` 启用流式 MD5/SHA1 验证。如果您不需要该 API,可以将其去掉:
```
[dependencies]
ewf-image = { version = "0.1", default-features = false }
```
## 快速入门
打开一个镜像,检查其格式,并从逻辑媒体流中读取:
```
use std::io::Read;
let image = ewf_image::Image::open("case.E01")?;
let info = image.info();
println!("{:?}: {} bytes across {} segment(s)",
info.format, info.logical_size, info.segment_count);
// Read the first sector from the cursor...
let mut first_sector = vec![0; 512];
image.cursor().read_exact(&mut first_sector)?;
// ...or read directly at any offset.
let mut sector_at_offset = vec![0; 512];
image.read_at(&mut sector_at_offset, 4096)?;
```
读取取证元数据并验证存储的哈希:
```
let image = ewf_image::Image::open("case.E01")?;
if let Some(case_number) = image.header_value("case_number") {
println!("case: {case_number}");
}
let result = image.verify()?;
println!("MD5 match: {:?}", result.md5_match);
```
从 raw 字节写入新的压缩 EWF2 镜像:
```
use std::fs::File;
let mut input = File::open("disk.raw")?;
let mut options = ewf_image::WriteOptions::default();
options.format = ewf_image::WriteFormat::Ewf2Physical;
options.compression = ewf_image::WriteCompression::Zlib;
options.metadata.set_header_value("case_number", "CASE-001");
let mut writer = ewf_image::EwfWriter::create("case.Ex01", options)?;
std::io::copy(&mut input, &mut writer)?;
let result = writer.finish()?;
println!("wrote {} segment(s)", result.segment_paths.len());
```
有关完整的、可运行的程序,请参阅 [`examples/`](examples),包括读取、
raw 导出、逻辑检查和镜像次要输出。
## 支持的格式
| 家族 | 读取 | 写入 | 备注 |
| --- | :---: | :---: | --- |
| EWF1 物理 `.E01` / EVF | ✓ | ✓ | Segment 发现、raw/zlib chunks、元数据、哈希、获取错误、会话、轨道和分割输出。 |
| EWF1 逻辑 `.L01` / LVF | ✓ | ✓ | 逻辑单文件目录和路径查找。 |
| EWF1 SMART `.S01` | ✓ | ✓ | SMART 媒体配置文件处理。 |
| EWF2 物理 `.Ex01` | ✓ | ✓ | raw、zlib、BZip2 和 pattern-fill chunks;EWF2 元数据、内存范围和分割输出。 |
| EWF2 逻辑 `.Lx01` | ✓ | ✓ | 逻辑单文件目录和辅助单文件表。 |
写入器还支持 SMART 输出、压缩、segment 分割、
secondary/shadow 镜像、自定义元数据、存储的哈希、不完整的 EWF1 输出,以及通过重写实现的恢复。
## 限制
- 加密的 EWF2 镜像会被检测到并拒绝;解密尚未
实现。
- 加密写入尚未实现。
- Base 加 overlay 的 delta/shadow 镜像尚未实现。
- EWF2 BZip2 chunks 在本地受支持,但某些外部 EWF 工具无法
生成或导出 BZip2 固件,因此它们的外部预言机覆盖率
被单独跟踪。
详情请参阅 [docs/limitations.md](docs/limitations.md)。
## 测试
兼容性由本地合成固件、写入器往返和
可选的外部 EWF 工具预言机测试覆盖。常规检查包括:
```
cargo fmt --check
cargo test --no-default-features
cargo test --all-features
cargo clippy --all-targets --all-features -- -D warnings
cargo check --examples --all-features
RUSTDOCFLAGS="-D warnings" cargo doc --all-features --no-deps
```
默认情况下会忽略外部语料库和工具预言机检查,因为它们
需要本地固件和已安装的 EWF 工具。请参阅
[docs/testing.md](docs/testing.md) 和
[docs/compatibility.md](docs/compatibility.md)。
## 文档
- [架构](docs/architecture.md)
- [兼容性](docs/compatibility.md)
- [限制](docs/limitations.md)
- [测试](docs/testing.md)
- [API 参考 (docs.rs)](https://docs.rs/ewf-image)
## 贡献
欢迎贡献。请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 开始入门,
以及 [SECURITY.md](SECURITY.md) 了解如何报告安全问题。
## 许可证
在 Apache License, Version 2.0 下授权。请参阅 [LICENSE](LICENSE)。
标签:EWF格式, Rust, 可视化界面, 哈希校验, 数字取证, 文件系统解析, 磁盘镜像, 网络流量审计, 自动化脚本, 通知系统