t9t/gomft
GitHub: t9t/gomft
Go 语言编写的 NTFS 主文件表解析库,提供 MFT 记录解析、引导扇区读取和原始卷访问能力。
Stars: 46 | Forks: 10
# gomft [](https://travis-ci.com/t9t/gomft) [](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]
标签:EVTX分析, EVTX分析, Go语言, HTTP工具, Master File Table, MFT解析, NTFS, VBR, 卷引导记录, 底层IO, 开源库, 搜索引擎爬虫, 数字取证, 数据解析, 文件系统, 日志审计, 硬盘解析, 程序破解, 自动化脚本