0

我有一个用 NTFS 格式化的 USB。我需要使用“C”创建一个文件,所以我想知道

  1. 如何在读取 mft 文件的 $BITMAP 属性后为我的文件分配一个免费条目。
  2. 如何为我的文件创建属性($STANDARD INFORMATION 和 $FILENAME ATTRIBUTE)。
4

1 回答 1

0

所以我意识到我迟到了几年,但实际上已经成功地做了这样的事情,我会提供对我有用的东西。

flatcap - NTFS 文档 -> 这是我找到的最好的文档,除了Brian Carrier 的文件系统取证分析

我正在做的事情与您正在尝试做的事情之间的最大区别是我正在重建已删除的文件而不是创建新文件。所以我的主要优势是能够使用复制的属性,只需稍作改动。以下是我的一些发现。

新文件记录需要 $Standard_Information (0x10) $Filename (0x30) $Security_Descriptor (0x50) 和 $Data (0x80) 属性。如果你在 $Secure 系统文件中索引文件,你可以不使用 Security_Descriptor,但我建议使用 $Security_Descriptor 以实现向后兼容性和简单性,这也是 linux ntfs-3g 的做法(我从观察 ntfs-中学到了很多3g 使用 git 的 difftool 对文件系统部分的更改)。您可以从具有您想要的相同权限的示例文件中复制 $Security_Descriptor。您也可以从类似文件中复制其他属性的基本结构并进行以下更改:

  • $Standard_Information 和 $Filename 需要新的时间戳。您还需要更新父目录的文件记录中的 File Altered 和 MFT Altered $Standard_Information 时间戳(中间 2),并且所有这些时间戳都应该匹配。

  • $Data 非常简单。如果是常驻,您只需要确保指定正确的数据长度,如果是非常驻,您将需要从 flatcap 读取数据运行的大部分数据。

  • $Filename 应该只需要一个新的名称长度和属性长度来匹配新名称。

  • 如果文件记录是全新的,则需要为文件记录头(前 24 个字节左右)提供正确的文件记录大小填充到 8 字节边界和 seq 编号 1(否则,如果它需要增加 1正在重新分配)。

  • 非常重要的是,每当您更新任何具有 USN(文件和索引记录)的内容时,您都要对其进行更新,并将每个扇区的末尾与 USN 交换到更新序列数组中。我不确定你应该增加多少,但我编写了代码来为每个写入的扇区增加它,这似乎有效。

您需要阅读索引记录才能将文件正确放置在父目录中:

  • 确保将新文件的相应索引条目键插入到目录 B*tree 的正确索引记录或节点中。
  • 索引记录 USN 需要更新,它的长度和自引用键中的时间戳也是如此。

关于处理 $MFT 的 $Bitmap 属性。我不确定 NTFS 是如何做到这一点的,当我了解更多信息时会更新,但这就是我所做的。重要的是要意识到 NTFS 有一个低编号文件记录的 MFT 保留,除非卷处于压力之下,否则不会写入这些记录,并且如果您写入错误的记录窗口会发现您的新文件已损坏。

  • 您不需要更新 USN
  • 每个位代表一个文件记录。
  • 找到最后一个(不是第一个)完整文件记录,然后选择第一个空的。
  • 填写该位并在新文件的索引条目表示中记录 MFT 文件参考地址。
  • 将您的新文件记录写入该位置。

MFT 文件参考地址是 48 位文件参考号(您在 $Bitmap 中找到)的组合,它只不过是 $MFT 中的记录索引(0 是第一条记录等)和 16 位序列号(在文件记录标题中找到)文件参考号可用于查找任何文件记录,方法是首先解析 $MFT 文件记录的 $Data 属性,然后逐个计数记录,直到达到该编号(显然您不会t 实际上需要用一些简单的数学计算它们,但是当你阅读 Data Runs 时,我觉得如何做到这一点会变得更加清晰)。

我可能忘记了很多东西,但我有点希望有人在我开始研究的时候把这些东西写下来,因为那时我的生活可能会轻松一点。

于 2016-08-05T17:16:37.910 回答