t9t/gomft

GitHub: t9t/gomft

Go 语言编写的 NTFS 主文件表解析库,提供 MFT 记录解析、引导扇区读取和原始卷访问能力。

Stars: 46 | Forks: 10

# gomft [![Build Status](https://travis-ci.com/t9t/gomft.svg?branch=master)](https://travis-ci.com/t9t/gomft) [![GoDoc](https://godoc.org/github.com/t9t/gomft?status.svg)](https://godoc.org/github.com/t9t/gomft) gomft 是一个用于解析 NTFS 卷主文件表 (MFT) 的 Go 库。`mftdump` 是一个用于将已挂载卷的 MFT 转储到文件的工具。 以下是一个示例用法,从之前以 1KB 记录大小转储的文件中读取 MFT 记录: ``` package main import ( "errors" "io" "log" "os" "github.com/t9t/gomft/mft" ) func main() { f, err := os.Open(os.Args[1]) if err != nil { log.Fatalln("Unable to open file", err) } defer f.Close() recordSize := 1024 for { buf := make([]byte, recordSize) _, err := io.ReadFull(f, buf) if err != nil { if errors.Is(err, io.EOF) { break } log.Fatalln("Unable to read record data", err) } record, err := mft.ParseRecord(buf) if err != nil { log.Fatalln("Unable to parse MFT record", err) } log.Println("Read MFT record", record.FileReference) } } ``` 另请参阅:https://godoc.org/github.com/t9t/gomft/mft ## 从原始卷读取 要从原始卷读取数据,您必须是 root 用户 (*nix) 或管理员 (Windows)。在 *nix 中,您可以直接使用分区设备文件名(例如 `/dev/sda1`),而在 Windows 中,您必须使用 UNC 路径,例如 `\\.\C:`。其余操作与访问文件相同(即 `os.Open(...)`)。 请注意,在 Windows 上,您只能以扇区大小的倍数读取数据,因此如果扇区大小为 512 字节(这是最常见的),您可以一次读取 512、1024、1536 等字节,但不能读取例如 768 字节。在使用缓冲读取器时请记住这一点,确保缓冲区大小是扇区大小的倍数。 ## 读取引导扇区 要读取卷的引导扇区(也称为 VBR,即卷引导记录,或 $Boot 文件),您可以使用 `bootsect` 包: ``` package main import ( "io" "log" "os" "github.com/t9t/gomft/bootsect" ) func main() { f, err := os.Open(`\\.\C:`) if err != nil { log.Fatalln("Unable to open C:", err) } defer f.Close() buf := make([]byte, 512) _, err = io.ReadFull(f, buf) if err != nil { log.Fatalln("Unable to read bootsector data", err) } bootSector, err := bootsect.Parse(buf) if err != nil { log.Fatalln("Unable to parse boot sector") } log.Printf("Boot sector of C:\\:\n%+v\n", bootSector) } ``` 参见:https://godoc.org/github.com/t9t/gomft/bootsect ## 附加实用程序 ### 片段读取器 使用 `fragment` 包读取碎片化数据,例如从 MFT 记录中的 DataRuns 获取的数据。使用 [`mft.DataRunsToFragments()`](https://godoc.org/github.com/t9t/gomft/mft#DataRunsToFragments) 将 DataRuns 转换为片段。 参见:https://godoc.org/github.com/t9t/gomft/fragment ### bintuil 与 BinReader `binutil` 包包含一些有助于处理二进制数据的函数,主要是 `binutil.Duplicate()` 用于复制字节切片,以及 `BinReader` 用于根据特定的字节序(小端/大端)解析二进制数据。 参见:https://godoc.org/github.com/t9t/gomft/binutil ### utf16 `utf16` 包包含 `DecodeString` 函数,用于使用特定的字节序将字节切片解码为字符串。 参见:https://godoc.org/github.com/t9t/gomft/utf16 ## 免责声明 这个包还远远没有完成,其实现是从互联网上散落的(通常是相互冲突的)各种信息片段拼凑而成的。 **使用风险自负!** 如果不小心,访问原始卷可能会导致您的数据不可修复地损坏!最好将您的 MFT 转储到文件中并使用该文件进行实验,而不是直接读取您的原始卷。 # mftdump mftdump 实用程序可用于将原始卷的 MFT 转储到文件。在 [releases 部分](https://github.com/t9t/gomft/releases)下载它。 用法: ``` usage: mftdump [flags] Dump the MFT of a volume to a file. The volume should be NTFS formatted. Flags: -f force; overwrite the output file if it already exists -p progress; show progress during dumping -v verbose; print details about what's going on For example: mftdump -v -f /dev/sdb1 ~/sdb1.mft ``` 在 Windows 上,像这样使用:`mftdump.exe -v -f C: D:\c.mft` # 参考资料 以下页面和程序(排名不分先后)帮助我构建了 gomft。 - https://en.wikipedia.org/wiki/NTFS#Master_File_Table - http://www.kcall.co.uk/ntfs/index.html - https://web.archive.org/web/20210922203602/https://flatcap.org/linux-ntfs/ntfs/index.html - https://web.archive.org/web/20200220141834/https://www.cse.scu.edu/~tschwarz/coen252_07Fall/Lectures/NTFS.html - https://www.autoitscript.com/forum/topic/94269-mft-access-reading-parsing-the-master-file-table-on-ntfs-filesystems/ - https://www.andreafortuna.org/2017/07/18/how-to-extract-data-and-timeline-from-master-file-table-on-ntfs-filesystem/ - http://ftp.kolibrios.org/users/Asper/docs/NTFS/ntfsdoc.html - https://docs.microsoft.com/en-us/windows/win32/fileio/master-file-table - https://flylib.com/books/en/2.48.1/ntfs_concepts.html - "A Journey into NTFS" - Part 1: https://medium.com/@bromiley/a-journey-into-ntfs-part-1-e2ac6a6367ec - Part 2: https://medium.com/@bromiley/ntfs-series-2b3b91faaf21 - Part 3: https://medium.com/@bromiley/a-journey-into-ntfs-part-3-5e197a0cab58 - Part 4: https://medium.com/@bromiley/a-journey-into-ntfs-part-4-f2865c39ac83 - Part 5: https://medium.com/@bromiley/ntfs-part-5-13e20588af59 - Part 6: https://medium.com/@bromiley/ntfs-part-6-43a50fad89f3 - Part 7: https://medium.com/@bromiley/ntfs-part-7-an-ntfs-story-caf42565855b - https://github.com/dkovar/analyzeMFT - https://github.com/jschicht/Mft2Csv - https://github.com/libyal/libfsntfs/blob/master/documentation/New%20Technologies%20File%20System%20(NTFS).asciidoc
标签:EVTX分析, EVTX分析, Go语言, HTTP工具, Master File Table, MFT解析, NTFS, VBR, 卷引导记录, 底层IO, 开源库, 搜索引擎爬虫, 数字取证, 数据解析, 文件系统, 日志审计, 硬盘解析, 程序破解, 自动化脚本