本文主要总结用winhex解析FAT32文件格式的U盘,下面将详细讲解。
首先博主有一个4G的普通U盘,格式化后,采用的是FAT32文件系统格式,U盘内有三个*.txt文件,如下图所示:
本文要分析的是用winhex从物理磁盘的第一个扇区开始,定位到test2.txt的文件内容,下面是具体的步骤。
步骤总结:先定位DBR偏移,然后定位FAT1偏移,然后定位数据区根目录偏移,最后定位文件内容存储簇号和偏移。
博主用的工具:一个FAT32文件系统格式的大小为4G的普通U盘,winhex1510。
其中winhex1510下载地址如下:https://download.csdn.net/download/naibozhuan3744/11150997
winhex1510注册码:(每天都要破解一次)
Name: "linholer"
Addr1: "[email protected]"
Addr2: "China"
Key1: "2E2230B055DD0D8E535F1DDA6494C639"
Key2: "51D8FE81F5F7F3C5E4C6A0FBD1CD122E"
Cksm: "FD455CD9"
用winhex打开物理磁盘,如下图所示:
由于硬盘的结构主要分为MBR主引导记录、主分区1、主分区2、主分区3、逻辑分区,如下图所示。
操作系统读取硬盘的第一个分区是MBR主引导分区的第一个扇区,获取硬盘的第一个扇区内容如下图所示:
由于我的U盘没有安装操作系统,故开始的446字节没有引导记录,从字节1BE开始后连续16个字节为第一个DPT分区表,后面依次跟着第二个DPT分区表,第三个DPT分区表,第四个DPT分区表,最后两字节为分区标志55 AA。
在DPT1分区表的0x1c6连续4个字节表示相对扇区数,从磁盘的开始到该分区的开始的偏移量,以扇区为单位。获取该相对扇区数,可以直接定位到逻辑扇区,即主分区1中的GBR引导扇区起始地址,上图数据可以知道相对扇区数为:00 00 00 3F,计算公式:
GBR引导扇区起始偏移==0x3F*512==0x7E00
注意:全盘大小计算,因为0x1CA开始的连续4字节表示该分区总扇区数,故磁盘总大小为相对扇区数加上所有分区总扇区数,即!
全盘容量大小==(相对扇区数+GP1分区扇区数+GP1分区扇区数+GP1分区扇区数)*0x200
即全盘容量大小==(0x3F+0x774FC1+0x00+0x00)*0x200==0xEEA0 0000(4003463168)byte
下表是DPT分区表个字节定义:
故逻辑磁盘的起始偏移,也即主分区1的GBR偏移地址为:0x7E00,跳转到该偏移,结果如下图所示:(注意字节序,winhex显示的是小端序,我们计算的时候是用大端序)
由GBR字节偏移定义可知,21 00是保留扇区数,单位为扇区。因为FAT表紧跟在保留扇区后面,故我们通过保留扇区,可以计算出FAT1文件分配表的起始偏移地址,计算公式:FAT1偏移==GBR偏移+保留扇区偏移
即FAT1偏移==0x3F*512+0x21*512==0xC000,在winhex上定位到0xC000,如下图所示:
因为本文是FAT32文件系统,故FAT32是32位,占用四个字节,也就是FAT1表的第0簇从0xC000开始的四个字节,后面连续四个字节依次是第1簇,第2簇,......,第n簇。FAT表后面紧跟着数据区,数据区除了根目录外,是按照簇为基本单位存储。文件或目录数据是从第2簇开始存储的,故从上图可以看出,FAT1表中有7个文件或者目录。
通过下面的计算公式,可以定位到数据区的起始偏移,通常也是根目录区。
根目录起始偏移==GBR偏移+保留扇区偏移+FAT大小*FAT表个数
其中,FAT表的个数和大小可以在DBR区中得到,如下图所示:
即根目录起始偏移==0x3F*512+0x21*512+0x1DCD*2*512==(0x3F+0x21+0x1DCD*2)*512==0x77 F400
DBR引导扇区各字节定义如下:
0x00~0x02:3字节,跳转指令。
0x03~0x0A:8字节,文件系统标志和版本号,这里为MSDOS5.0。
0x0B~0x0C:2字节,每扇区字节数,0x0200=512
0x0D~0x0D:1字节,每簇扇区数,0x08。
0x0E~0x0F:2字节,保留扇区数,0x0C22=3106
0x10~0x10:1字节,FAT表个数,0x02。
0x11~0x12:2字节,FAT32必须等于0,FAT12/FAT16为根目录中目录的个数;
0x13~0x14:2字节,FAT32必须等于0,FAT12/FAT16为扇区总数。
0x15~0x15:1字节,哪种存储介质,0xF8标准值,可移动存储介质。
0x16~0x17:2字节,FAT32必须为0,FAT12/FAT16为一个FAT 表所占的扇区数。
0x18~0x19:2字节,每磁道扇区数,只对于“特殊形状”(由磁头和柱面分割为若干磁道)的存储介质有效,0x003F=63。
0x1A~0x1B:2字节,磁头数,只对特殊的介质才有效,0x00FF=255。
0x1C~0x1F:4字节,EBR分区之前所隐藏的扇区数,0x0004A800=305152又出现了呢,与MBR中地址0x1C6开始的4个字节数值相等。
0x20~0x23:4字节,文件系统总扇区数,0x00E83800=15218688
0x24~0x27:4字节,每个FAT表占用扇区数,0x000039EF=14831
0x28~0x29:2字节,标记,此域FAT32 特有。
0x2A~0x2B:2字节,FAT32版本号0.0,FAT32特有。
0x2C~0x2F:4字节,根目录所在第一个簇的簇号,0x02。(虽然在FAT32文件系统下,根目录可以存放在数据区的任何位置,但是通常情况下还是起始于2号簇)
0x30~0x31:2字节,FSINFO(文件系统信息扇区)扇区号0x01,该扇区为操作系统提供关于空簇总数及下一可用簇的信息。
0x32~0x33:2字节,备份引导扇区的位置。备份引导扇区总是位于文件系统的6号扇区。
0x34~0x3F:12字节,用于以后FAT 扩展使用。
0x40~0x40:1字节,与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已。
0x41~0x41:1字节,与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已 。
0x42~0x42:1字节,扩展引导标志,0x29。与FAT12/16 的定义相同,只不过两者位于启动扇区不同的位置而已
0x43~0x46:4字节,卷序列号。通常为一个随机值。
0x47~0x51:11字节,卷标(ASCII码),如果建立文件系统的时候指定了卷标,会保存在此。
0x52~0x59:8字节,文件系统格式的ASCII码,FAT32。
0x5A~0x1FD:共410字节,引导代码。
0x1FE~0x1FF:签名标志“55 AA”。
偏移到根目录起始地址,如下图所示:
根据目录项各个字节定义可知,test2.txt的下一簇号为0000 0007,文件长度0000 00B2。
数据区除了根目录用扇区为基本存储单位外,数据存储区都是用簇作为单位,并且编号依次从上到下从第2簇到第n簇开始存取数据,所以知道了test2.txt文件内容的存储簇号,可以通过下面公式计算出test.txt内容存储的偏移地址。
文件内容存储起始偏移==(MBR区大小+保留区大小+FAT表 * 2的大小+(起始簇号-2) * 每簇扇区数) * 512
其中MBR区大小也即是GBR偏移,可以根据下图内容,计算出文件内容数据起始偏移
即文件内容存储起始偏移==(GBR偏移数+保留区数+FAT表 扇区数 * FAT表个数+(起始簇号-2) * 每簇扇区数) * 512
文件内容存储起始偏移==(0x3F + 0x21 + 0x1DCD * 2 + (起始簇号-2) * 0x08) * 512,由于test2.txt的起始簇号为0x07,故有:
文件内容存储起始偏移==(0x3F + 0x21 + 0x1DCD * 0x02 + (0x07-0x02) * 0x08) * 0x200 == 0x784400
跳转到0x784400偏移,如下图所示:
可以根据test2.txt的文件大小0xB2==178byte(上面已知),提取出test2.txt的数据内容。至此,利用winhex从硬盘第一扇区定位到test2.txt文件存储内容偏移完成。
参考内容:
https://blog.csdn.net/u010650845/article/details/60881687(参考:FAT32文件系统原理)
https://www.cnblogs.com/fantacity/p/3900237.html(参考:FAT32根目录和数据区定位)
https://www.3d66.com/changjianwenti/tiwen_9980.html(参考:winhex注册码)
https://blog.csdn.net/KoalaZB/article/details/52829864(参考:winhex定位短文件和长文件实例)