NTFS硬盘上$ I30的INDX条目无效

问题描述:

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

索引记录在NTFS 3.1结构是清晰(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。我突出了错误的部分。

The invalid entries of INDX

该图显示的条目被合理地解析直到0x0628最后正确条目:

  • MFT参考(8个字节):66 30 00 00 00 00 01 00
  • 条目(2个字节)的大小: 70 00 因此,条目结束于0x0697

此后,事情变得怪异!条目在0x0698

  • MFT参考(8个字节):00 00 00 00 00 00 00 00似乎无效
  • 条目的尺寸(2个字节):10 00当然无效,因为尺寸小于包括该文件名的条目结构的最小尺寸例如在0x52

对我来说,“Buziol Games”似乎是硬盘根目录上的一个已删除的文件夹,我不确定。无论如何,Windows资源管理器在列出内容时不会遇到麻烦。

是否有人了解它是如何工作的? Windows如何继续解析?

编辑:另外,请找十六进制转储作为一个纯文本上pastebin

+0

您能否显示您用于解析的代码?您是否已将**修正值**考虑在内?另外,请以文本格式发布INDX记录的十六进制转储(或链接到Pastebin)。 –

+0

如你所知,@AndreaLazzarotto,fixups是在行业的开始,而索引始于集群的开始(因此在一个行业的开始)。所以,地址0x0698不是任何扇区的末端。请注意,在我的情况下,扇区大小为0x200,簇大小为8个扇区。无论如何,谢谢你的这种姿态。顺便说一下,我不是在谈论代码,它们自己的价值是无效的。 –

当文件获得改名,添加和删除,INDX记录最终在其末端含有unzeroized松弛空间。每个INDX“页面”始终为4096个字节,随着文件被删除,B +树节点会移位,在INDX页面的末尾留下旧的被废弃节点。这对法医学非常有用。

“Buziol Games”条目似乎是一个完全有效的INDX记录。你为什么认为它被删除了?

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

所以看着你的pastebin输出,在偏移量0x1c中,我们找到值0x690,这意味着最后一个条目在0x18 + 0x690 = 0x6A8处结束。你在偏移0x698看到该条目似乎是一种“空”项,按https://0cch.com/ntfsdoc/concepts/index_record.html

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

注THST其规模为0x10,这意味着它结束于0x6A8,符合市场预期。请参阅https://www.fireeye.com/blog/threat-research/2012/10/incident-response-ntfs-indx-buffers-part-4-br-internal.html

NTFS的一个很好的描述可以在http://dubeyko.com/development/FileSystems/NTFS/ntfsdoc.pdf找到。

+0

谢谢亲爱的。回复您的问题**“为什么您认为它已被删除?”**:因为Windows资源管理器不可见。无论如何,也许我错了(也许它是隐藏的),但它是不值得关注它,因为它不是我所困惑的。我很困惑,因为我看到索引条目之外的一些相关的和基本的东西(在0x6A8之后),其中我不知道如何访问,指出只存在**一个指向此INDX的datarun **。请你解释一下我怎样才能解析“Program Files”文件夹。不久之后,如何在0x6A8之后继续解析? –

+0

“如何在0x6A8之后继续解析” - 您没有。 INDX记录在0x6A8结束。所有你后来看到的东西都是所谓的“松弛空间”。它曾经使用过一次,但现在没有使用。不知道我是否理解解析“程序文件”的含义 - 是否要递归枚举磁盘中的所有文件?如果是这样,那么从当前INDX记录开始,您需要为要处理的文件(例如“Program Files”)获取MFT条目,找到其INDX记录并枚举它们。这是你的意思吗? – YSK

+0

我的意思是,如果我想列出根目录的内容,我发现它只包含其中的一部分。其他人在哪里?重复我自己,请注意只存在一个datarun –