zoukankan      html  css  js  c++  java
  • 分析NTFS文件系统得到特定文件的内容

    找某一个文件的内容(如要读取文件D:dirdir2 ext.txt,详细过程例如以下:
    (1)读取分区表/分区链表信息,找到磁盘F的起始扇区。


    (2)读取D盘的第一个扇区(分区的BOOTSETOR)取得分区的每簇大小,MFT表起始簇号等信息。


    (3)读取MFT表的第五个记录(根文件夹)找到文件夹索引所在簇号。
    (4)读取根文件夹索引,查找dir文件夹所在的MFT记录号
    (5)读取dir文件夹的MFT记录,找到文件夹索引所在簇号。
    (6)读取dir文件夹的索引,查找dir2文件夹所在MFT记录号
    (7)读取dir2文件夹的MFT记录。找到文件夹索引所在簇号。


    (8)读取dir2文件夹的索引,查找test.txt 所在MFT记录号
    (9)读取test.txt文件的MFT记录。找到它的DATA属性。
    (10)依据DATA属性中指定的文件数据存放位置读取出test.txt文件的数据。

     以下我们借助工具Winhex来找到D:dirdir2 ext.txt的内容


    1.读取分区表/分区链表信息。找到磁盘F的起始扇区。

    打开磁盘0号扇区


    红线部分是D分区的信息。蓝色方框内是D分区的物理起始扇区 0XEA58BC。


    2.读取D盘的第一个扇区(分区的BOOTSETOR)取得分区的每簇大小,MFT表起始簇号等信息。

    打开物理扇区号为0XEA58BC的扇区,例如以下图,红线是每簇的扇区数(0X1,每簇一个扇区)。

    蓝线部分是$MFT的逻辑簇号(0X00 00 00 00 02 0A F3,是相对于D分区開始的簇号)

    紫线部分是一个MFT记录所占的簇数(0X00 00 00 02)



    3.读取MFT表的第五个记录(根文件夹)找到文件夹索引所在簇号。

    打开$MFT表,相对于D分区的簇号是0X00 00 00 00 02 0A F3,相对于整个磁盘的簇号是 0XEA58BC + 0X00 00 00 00 02 0A F3 = 0XEC63AF。

    由于从D分区第一个扇区得到每簇扇区数是1,所以$MFT在D分区的偏移是0X020AF3扇区。

    每一个MFT记录所占簇数是2。根文件夹是MFT中的第5个记录(记录从0開始的),根文件夹的MFT记录项所在的簇数是 0X020AF3 + 5 * 2 = 0X20AFD。

    所在扇区数是 0X20AFD *每簇扇区数1 = 0X20AFD


    4.读取根文件夹索引,查找dir文件夹所在的MFT记录号

    打开D分区偏移扇区0X20AFD,找到属性0X90。在0415FB80一行,偏移0X08是0X01,说明是很驻属性,得到Data run, 31 08 BB 10 03,即在D分区偏移簇数0X0310BB,长度是0X8簇。


    查看D分区偏移簇号0X0310BB,会看到根文件夹下的索引项,当中可看到$AttrDef,$BadClus,$Bitmap,$Boot等系统文件的索引项。

    找到dir的索引项。例如以下图,红框部分是本索引项的名称dir。

    前8字节是文件的MFT索引记录号(前6个字节48位是父文件夹的文件记录号。0X0375,后2个字节为序列号)



    5.读取dir文件夹的MFT记录,找到文件夹索引所在簇号。


    以下计算dir 的MFT表项在$MFT中的簇号:

    一个MFT表项占两个簇,第0X0375项是相对于$MFT的第0X0375*2= 0X6EA簇,也就是相对于D分区的第 0X02 0A F3 + 0X6EA = 0X211DD簇(扇区是0X211DD)


    6.读取dir文件夹的索引,查找dir2文件夹所在MFT记录号

    打开扇区0X211DD,例如以下图。


    0423BB00一行。偏移0位置是0X00。说明是常驻属性,从紫色框中得到dir2的MFT记录项的记录号是0X0376


    7.读取dir2文件夹的MFT记录,找到文件夹索引所在簇号。

    如今来确定dir2的MFT记录项所在的簇数

    $MFT開始簇数 + 0X0376*每记录簇数

    0X020AF3 + 0X0376 *2 = 0X211DF


    8.读取dir2文件夹的索引,查找test.txt 所在MFT记录号

    打开D分区偏移 0X211DF 簇


    可看到test.txt 的MFT记录号是 0X0377


    9.读取test.txt文件的MFT记录,找到它的DATA属性。

    得到test.txt 的MFT记录项在D分区的偏移簇号

    =$MFT表的偏移簇数 + test.txt记录号*每MFT记录簇数 

    =0X020AF3 + 0X0377 *2 

    = 0X211E1(簇号)

    = 0X211E1(扇区号)

    打开0X211E1(扇区号):


    从0x30文件名称属性能够看到test.txt的文件名称。

    0X80数据属性中能够得到文件内容


    10.依据DATA属性中指定的文件数据存放位置读取出test.txt文件的数据。

    从0X80数据属性中能够知道此属性是常驻属性。直接看到test.txt的文件内容,“This is test for NTFS!”.


    另外,假设我继续向test.txt 写入数据。DATA属性中的数据会添加。下图中红线之间的数据是后来添加的。


    可是当文件内容在增多时。0X80数据属性从常驻属性改为很驻属性,文件内容不会直接存储在此属性中。而是其它簇中,依据Data run能够定位到。


    OX80数据属性。0X01说明是很驻属性。

    Data run,31 02 4C 0D 01;说明内容从分区偏移簇号0X010D4C開始。长度是0X02个簇。

    打开簇号是0X010D4C的扇区,能够看到test.txt的文件内容:



    (本文如有错误。请指正。多谢。)



  • 相关阅读:
    C#与JAVA平台RSA算法交互示例
    .NET_RSA加密全接触(重、难点解析)
    .NET和java的RSA互通,仅此而已
    数据库面试常问的一些基本概念
    亿级Web系统搭建——单机到分布式集群
    (译) JSON-RPC 2.0 规范(中文版)
    有趣的 Mysql 存储引擎
    zend opcache的最佳设置
    PHP注释的艺术——phpDoc规范
    说说$POST 、$HTTP_RAW_POST_DATA、php://input三者之间的区别
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5315014.html
Copyright © 2011-2022 走看看