SecurityRonin/lzvn
GitHub: SecurityRonin/lzvn
纯 Rust 实现的 Apple LZVN 解压库,具备长度容忍特性以正确处理真实 macOS decmpfs 透明压缩资源分支块。
Stars: 0 | Forks: 0
# lzvn
[](https://crates.io/crates/lzvn-core)
[](https://docs.rs/lzvn)
[](https://www.rust-lang.org)
[](LICENSE)
[](src/lib.rs)
[](https://github.com/sponsors/h4x0r)
**一个安全、无依赖、`no_std` 的纯 Rust LZVN 解压器,能够真正读取真实的 macOS 文件** —— 在所有其他 Rust 解码器因其长度问题而拒绝处理时,它具备出色的长度容忍度。
```
// A raw Apple LZVN block (small-literal "hello" + end-of-stream).
let block = [0xe5, b'h', b'e', b'l', b'l', b'o', 0x06, 0, 0, 0, 0, 0, 0, 0];
let mut out = [0u8; 5];
let n = lzvn::decode_into(&block, &mut out)?;
assert_eq!(&out[..n], b"hello");
# Ok::<(), lzvn::Error>(())
```
```
[dependencies]
lzvn = { package = "lzvn-core", version = "0.1" }
```
## 为什么会有这个项目
LZVN 是 Apple 用于 HFS+/APFS **透明压缩**(`decmpfs` 类型 7 和 8)的压缩编解码器,也是 LZFSE 流中 `bvxn` 块类型的底层格式。真实的 macOS `decmpfs` 资源分支块以 LZVN 的流结束 opcode(`0x06`)终止,随后每个块都会跟随 **80–300 字节的任意末尾数据**。Apple 的内核和 `lzvn_decode_buffer` 会忽略这些字节;**严格的整流 Rust 解码器(`lzfse_rust`,`lzvn` crate)则会拒绝它们** —— 因此它们在处理真正的 macOS 系统文件时会失败(已在 macOS 26.5 "Tahoe" 上验证:严格路径解码器对 25 个真实的类型 8 文件的解码成功率为 0/25)。
`lzvn` 会在 end-of-stream 标记处停止并返回。正是这一特性,决定了解码真实的证据磁盘镜像与报错退出之间的成败。
## 信任,但需验证
- **`#![forbid(unsafe_code)]`**,零依赖,`no_std` —— 具备边界检查,在遇到格式错误的输入时会返回类型化的 [`Error`],而不是触发 panic 或越界读取。
- **通过独立的 oracle 进行了验证。** 提交的测试用例是由 Apple 官方的 `COMPRESSION_LZVN` 编码器(`libcompression`)生成的真实 LZVN 流,并填充了末尾字节以模拟 `decmpfs` 块 —— 并且解码器还针对相同的 Apple oracle,对 **25 个真实的 macOS 26.5 系统文件块**进行了额外验证(严格解码器的解码率为 0/25,而本工具为 25/25)。
- **经过 Fuzz 强化。** `cargo fuzz run decode` 会将任意输入馈送到解码器中;其不变性保证是“绝不 panic”。
## 适用范围
本 crate 仅涉及 **编解码器** —— 它将原始的 LZVN 块解码为字节。`decmpfs` 的帧结构(资源分支块表、内联标记约定)属于调用它的文件系统读取器(例如 `hfsplus-forensic`)的负责范畴。仅支持解码;无编码器。
[隐私政策](https://securityronin.github.io/lzvn/privacy/) · [服务条款](https://securityronin.github.io/lzvn/terms/) · © 2026 Security Ronin Ltd
标签:LZVN, Rust, 可视化界面, 数据压缩, 文件系统, 无标准库(no_std), 网络流量审计, 解码器, 通知系统