NTFS 硬盘上 $I30 的无效索引条目

Invalid INDX entries for $I30 on NTFS harddisk

在解析我的 NTFS 格式的硬盘时,我发现了一些无效的 INDX 条目,而 Windows 仍然能够列出所有的根目录内容!

NTFS 3.1中Index Record的结构清晰(NTFS doc):

Offset      Description
-------------------------------------
0x00        MFT Reference of the file
0x08        Size of the index entry
0x0A        Offset to the filename
...
0x52        Filename
...

但是,我发现一些条目的大小以及它们的 MFT 参考(是一堆零)都是错误的!

我附上了一张屏幕截图,其中显示了 INDX 的一部分及其文本表示,其中每行的宽度为 0x20。我突出显示了错误的部分。

该图显示条目被合理解析,直到最后一个正确条目位于 0x0628:

之后,事情就变得诡异了! 0x0698 处的条目:

对我来说,"Buziol Games"好像是硬盘根目录下的一个被删除的文件夹,我不确定。无论如何,Windows 资源管理器在列出内容时没有遇到麻烦。

有人知道它是如何工作的吗? Windows如何继续解析?

编辑:此外,请在pastebin

上找到纯文本形式的十六进制转储

随着文件被重命名、添加和删除,INDX 记录最终在其末尾包含未归零的松弛 space。每个 INDX "page" 总是 4096 字节长,随着文件被删除,B+ 树节点被移动,在 INDX 页面的末尾留下旧的、废弃的节点。这对取证非常有用。

"Buziol Games" 条目似乎是完全有效的 INDX 记录。你认为它被删除的原因是什么?

请注意,INDX header(就在 "INDX" 字符串所在的位置)可以告诉您页面中有多少条目 - 检查偏移量 0x1c(索引条目的大小)与偏移量0x20(分配的索引条目大小)。并注意这些是相对于偏移量 0x18.

因此查看您的 pastebin 输出,在偏移量 0x1c 中我们找到值 0x690,这意味着最后一个条目结束于 0x18 + 0x690 = 0x6A8。根据 https://0cch.com/ntfsdoc/concepts/index_record.html:

,您在偏移量 0x698 处看到的条目似乎是一种 "null" 条目

last entry has a size of 0x10 (just large enough for the flags (and a mft ref of zero))

注意它的大小是 0x10,这意味着它结束于 0x6A8,如预期的那样。

另见 https://www.fireeye.com/blog/threat-research/2012/10/incident-response-ntfs-indx-buffers-part-4-br-internal.html

可以在 http://dubeyko.com/development/FileSystems/NTFS/ntfsdoc.pdf.

找到对 NTFS 的很好的描述