aoiflux/libxfat

GitHub: aoiflux/libxfat

libxfat 是一个 Go 库,专为解析和读取 ExFAT 文件系统镜像而设计,支持数字取证中的数据提取和元数据分析。

Stars: 2 | Forks: 1

# libxfat libxfat 是一个用于读取 exFAT 文件系统镜像的 Go 库。它旨在 用于取证和检查工作流程:打开镜像、解析 VBR、遍历 目录、读取元数据和提取文件内容。 该库是面向读取的。它不创建或修改 exFAT 卷。 ## 亮点 - 直接从 `*os.File` 解析 exFAT 镜像。 - 读取根目录或递归遍历可索引条目。 - 提取常规文件同时保留目录结构。 - 报告卷统计信息,如集群大小、已用空间和分配 位图计数。 - 显示 exFAT 元数据条目,如 `$BitMap`、`$UpCase`、`$Volume GUID`、 `$TexFAT` 和 `$ACT`。 - 在根目录列表中添加虚拟元数据条目,如 `$MBR`、`$FAT1` 和 `$FAT2`。 - 比原始实现更防御性地处理截断和畸形镜像。 ## 安装

## 目录 - [目录](#table-of-contents) - [概述](#overview) - [功能](#features) - [项目结构](#project-structure) - [项目索引](#project-index) - [内部解析笔记](#internal-parsing-notes) - [快速开始](#getting-started) - [前置条件](#prerequisites) - [安装](#installation) - [贡献](#contributing) - [引用论文](#cite) - [阅读论文](#paper) ## 概述 libxfat 是一个 Go 库,为解析和 操作 ExFAT 文件系统提供强大高效的解决方案。它提供全面的工具来提取 数据和访问元数据。 **为什么选择 libxfat?** 该项目简化了开发者与 ExFAT 文件系统的交互。核心 功能包括: - **🟢 强大的 ExFAT 解析:** 处理连续和链式集群 分配方案,确保可靠的数据提取。 - **🔵 全面的元数据访问:** 轻松检索文件大小、属性、 时间戳,并生成目录列表。 - **🟡 高效的数据提取:** 在处理大型 ExFAT 卷时针对速度和性能进行了优化。 - **🔴 清晰的数据结构:** 良好定义的结构体(VBR、Entry)简化了 ExFAT 数据操作和理解。 - **🟣 彻底的错误处理:** 包括完整性检查和强大的错误处理以防止数据丢失。 - **🟠 文档完善的代码:** 清洁、注释良好的代码确保了易于 集成和维护。 ## 内部解析笔记 内部解析器架构和零拷贝边界记录在 [INTERNAL_PARSING.md](./INTERNAL_PARSING.md)。 ## 功能 | | 组件 | 详情 | | :- | :---------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ⚙️ | **架构** | | | 🔩 | **代码质量** | | | 📄 | **文档** | | | 🔌 | **集成** | | | 🧩 | **模块化** | | | ⚡️ | **性能** | | | 🛡️ | **安全性** | | | 📦 | **依赖** | | | 🚀 | **可扩展性** | | ## 项目结构 ``` └── libxfat/ ├── README.md ├── cluster.go ├── const.go ├── entry.go ├── exfat.go ├── go.mod ├── go.sum ├── struct.go ├── util.go └── vbr.go ``` 该模块目前目标为 Go 1.25,如 `go.mod` 中声明。 ## 快速开始 ``` package main import ( "fmt" "log" "os" "github.com/aoiflux/libxfat" ) func main() { imageFile, err := os.Open("disk.exfat") if err != nil { log.Fatal(err) } defer imageFile.Close() fs, err := libxfat.New(imageFile, false) if err != nil { log.Fatal(err) } rootEntries, err := fs.ReadRootDir() if err != nil { log.Fatal(err) } for _, entry := range rootEntries { fmt.Printf("name=%q size=%d dir=%t special=%t virtual=%t\n", entry.GetName(), entry.GetSize(), entry.IsDir(), entry.IsSpecialFile(), entry.IsVirtualEntry(), ) } allocated, err := fs.GetAllocatedClusters() if err != nil { log.Fatal(err) } fmt.Printf("cluster size: %d bytes\n", fs.GetClusterSize()) fmt.Printf("allocated clusters: %d\n", allocated) fmt.Printf("used space: %s\n", fs.GetUsedSpace()) } ``` `libxfat.New` 的第二个参数是 `optimistic`: - `false`:严格模式,首选用于取证用途。 - `true`:在处理不太可靠的镜像或嵌入式卷时,跳过严格的 VBR 偏移验证。 如果 exFAT 文件系统位于更大镜像内部,您还可以传递可选的扇区偏移量: ``` fs, err := libxfat.New(imageFile, false, 2048) ``` ## 核心 API ### 打开和检查 - `New(imagefile *os.File, optimistic bool, offset ...uint64) (ExFAT, error)` - `ReadRootDir() ([]Entry, error)` - `ReadDir(entry Entry) ([]Entry, error)` - `ReadDirs(entries []Entry) ([]Entry, error)` - `GetAllEntries(rootEntries []Entry, indexable ...bool) ([]Entry, error)` - `GetFullPathIndexableEntries(entries []Entry, path string) ([]Entry, error)` ### 提取数据 - `ExtractEntryContent(entry Entry, dstpath string) error` - `ExtractAllFiles(rootEntries []Entry, dstdir string) error` ### 删除条目恢复 - `RecoverDeletedEntries() ([]Entry, error)` ### 卷统计 - `GetVolumeLabel() string` - `GetClusterSize() uint64` - `GetAllocatedClusters() (uint32, error)` - `GetFreeClusters() (uint32, error)` - `GetUsedSpace() string` - `CountClusters(entry Entry) (int, error)` - `GetClusterList(entry Entry) ([]uint32, uint64, error)` - `GetClusterOffset(cluster uint32) uint64` ### 条目助手 每个解析的目录项由 `Entry` 表示。常用助手包括: - `GetName()` - `GetSize()` - `GetEntryCluster()` - `IsDir()` 和 `IsFile()` - `IsDeleted()` - `IsIndexed()` - `IsSpecialFile()` - `IsVirtualEntry()` - `HasFatChain()` 和 `DoesNotHaveFatChain()` ## 特殊和虚拟条目 `ReadRootDir()` 返回普通文件系统条目和元数据条目。 特殊条目是镜像中找到的真实 exFAT 元数据记录,包括: - `$BitMap` - `$UpCase` - `$Volume GUID` - `$TexFAT` - `$ACT` 虚拟条目是库添加的合成助手,使文件系统 元数据更容易从根目录列表检查,包括: - `$MBR` - `$FAT1` - `$FAT2` 使用 `entry.IsSpecialFile()` 和 `entry.IsVirtualEntry()` 来区分它们 与常规文件和目录。 ## 示例 可运行的示例位于 `examples/` 目录下。 ``` go run ./examples/list-root -image /path/to/volume.exfat go run ./examples/list-all -image /path/to/volume.exfat go run ./examples/volume-stats -image /path/to/volume.exfat go run ./examples/extract-all -image /path/to/volume.exfat -out ./recovered ``` 常用标志: - `-image`:exFAT 镜像文件的路径。 - `-optimistic`:跳过严格的 VBR 偏移验证。 - `-offset`:exFAT 卷开始的扇区偏移量。 示例程序涵盖: - 列出根目录条目,包括元数据和虚拟条目。 - 遍历整个文件系统并打印可索引条目的完整路径。 - 报告卷和分配统计信息。 - 将所有常规文件提取到输出目录。 ## 测试 运行完整测试套件: ``` go test ./... ``` 仓库包括包级测试和位于 `tests/` 下的高级测试,这些测试涉及: - VBR 验证。 - FAT 循环和 EOF 范围处理。 - 根目录解析。 - 虚拟和特殊条目行为。 - 分配位图计数。 - 路径保留提取行为。 ## 健壮性笔记 该仓库中最近的解析器改进包括: - 读取集群支持记录时更好的边界检查。 - 更安全的 UTF-16 文件名解码。 - 目录集校验和验证。 - 关键 exFAT 目录记录类型的验证助手。 - 更可靠地处理短位图、FAT 循环和截断镜像。 有关更详细的实现摘要,请参阅 `IMPROVEMENTS.md`。 ## 仓库布局 ``` . |-- exfat.go # high-level filesystem operations |-- vbr.go # VBR parsing and volume metadata |-- cluster.go # cluster traversal and content reads |-- entry.go # directory-entry formatting helpers |-- struct.go # core ExFAT, VBR, and Entry types |-- util.go # shared parsing and formatting helpers |-- validators.go # exFAT directory-record validation helpers |-- examples/ # runnable example programs `-- tests/ # higher-level behavioral tests ``` ## 贡献 - **🐛 [报告问题](https://github.com/aoiflux/libxfat/issues)**:提交发现的错误或为 `libxfat` 项目记录功能请求。 - **💡 [提交拉取请求](https://github.com/aoiflux/libxfat/blob/main/CONTRIBUTING.md)**:审查开放的 PR,并提交您自己的 PR。 欢迎问题和拉取请求。如果您更改解析行为,建议在同一更改中添加或更新测试,以便覆盖畸形镜像处理和元数据行为。 ## 引用 Gogia, G., & Rughani, P. (2024). Parex: A novel exfat parser for file system forensics. Computación y Sistemas, 28(2). https://doi.org/10.13053/cys-28-2-4804 ## 论文 ## [PAREX: 用于文件系统取证的新型 exFAT 解析器](https://www.scielo.org.mx/scielo.php?script=sci_arttext&pid=S1405-55462024000200421#:~:text=This%20research%20proposes%20a%20novel%20open-source%20exFAT%20file,of%20disk%20images%20ranging%20from%201MiB%20to%201TiB)
标签:EVTX分析, ExFAT支持, Go语言, 元数据提取, 只读库, 存储技术, 工具开发, 库开发, 数据恢复, 数据提取, 文件内容提取, 文件系统解析, 日志审计, 磁盘镜像分析, 程序破解, 进程保护