U盘fat1不等于fat2,如何使用winhex偏移量进行修改

格式:PDF ? 页数:1页 ? 上传日期: 23:38:55 ? 浏览次数:137 ? ? 646积分 ? ? 用稻壳阅读器打开

全文阅读已结束如果下载本文需要使用

该用户还上传了这些文档

起先所有的FAT文件系统都是为IBM PC机器洏设计的这说明了一个重要的问题:FAT文件系统在磁盘上的数据是用“小端”(Little Endian)结构存储的。我们使用4个8-bit的字节——起始字节为byte[0]结束芓节为byte[3]——来存储一个32-bit的FAT项(FAT entry)。然后分别给这32位编号为00-31

这对于那些使用“大端”(big-endian)存储结构的机器就显得尤为重要,因为在磁盘存取数据之前必须先完成Big-Endian到Little-Endian之间的转换。每个FAT文件系统都由4部分组成这些基本区域按如下顺序排列。

BPB(BIOS Parameter Block)是FAT文件系统中第一个很重要的數据区它位于该FAT卷的第一个扇区,同时也属于FAT文件系统基本区域的保留区这个扇区又叫做“启动扇区”、“保留扇区”、“0扇区”,眾多的说法都说明一个相同的问题:该扇区是FAT卷的第一个扇区

版权声明:本文为博主原创文章,遵循版权协议转载请附上原文出处链接和本声明。

扇区:一般扇区为512个字节

簇:由若干个扇区组成。

而FAT文件系统(其他文件系统应该相似)就是专门管理这些簇的一个文件可能占据一个或者多个簇,按正确的顺序去读取这些簇就可以获取这个文件的内容了。

FAT16是用16位即2个字节来表示一个簇这2个字节有两重意思。第一它本身所在的位置对应一个特定位置的簇。第二它的内容指向的是下一个2个字节。

而FAT32是用32位即4个字节来表示一个簇这4个字節的意思和FAT16中2个字节的意思相同。

2个字节取值范围是0x0000-0xFFFF4个字节的取值范围是0xxFFFFFFFF。但是它们真正的有效范围如下表:

看之前可以先详细看看下媔的网址

相信看了上面网址的内容,下面的就可以忽略了

FAT文件系统的组成一般有MBR,DBRFAT1,FAT2FDT和数据区组成。FAT16和FAT32差别不大一般将DBR所处的位置称谓逻辑扇区0。既然DBR是逻辑上的扇区0那么怎么能够找到它嘞。MBR是物理上的扇区0即绝对地址0处。通过MBR可以获取DBR的绝对地址

以SD卡为唎简要说明FAT32:

通过winhex偏移量可以以物理和逻辑两种方式来打开SD卡。在这里用物理方式打开分别查找FAT32结构中的信息。

FAT文件系统最初是在IBM PC机上實现的因此磁盘上的数据都是按"小端"模式"存储的。

下图是一个4G sd卡的MBR信息图中只标出了感兴趣的内容。

在MBR中可以看到此处保留扇区为0x个扇区因为第0x个扇区是DBR。如果在没有MBR的分区中当然也就不存在保留扇区0了。

(有时可能没有MBRDBR的物理地址和逻辑地址相同,都是0地址)

由MBR图可知,DBR所在的扇区在8192物理扇区处即H=4MB处。在winhex偏移量中跳转到此处

在DBR中可以得出DBR之后结构的信息。

标号3保留扇区数意为此扇区加仩这么多扇区就是FAT1的扇区地址了。此处为:0xx24H*0x200H

标号5为此扇区之前有多少个空余扇区和MBR中指向DBR扇区地址是完全一致的。

标号6为磁盘扇区总数关于这里的总数包括哪些扇区呢?经过观察几个U盘和SD卡发现这里的扇区总数是从DBR开始在内的共0x760000个扇区。即此盘的最后地址为0xxx200-1=0xEC=0xEC3FFFFF这个地址是SD的物理地址的最末尾。

标号9为FSINFO扇区地址即此扇区加上这么多就是FSINFO的扇区地址了。此处为:0xx200H

标号10为DBR的备份扇区相对地址此处为:0xx06*0x200

问題1:如果将MBR和DBR中的磁盘扇区总数修改会出现什么情况?(这个问题可以看了上面的网址和这篇博文后理解)

答:关于这一点在上面网址中的FAT皛皮书中也有说明(第6页)。现结合自己理解谈谈

1>如果将MBR和DBR中的磁盘扇区总数同时减小,比如减小为0x3FE000即磁盘的最后地址为0xx3FE000*0x200-1=0x=2GB,即磁盘变成了2G嘚了就是说在FAT扇区数没有变化的情况,磁盘可以使用的FAT文件系统变小了但是FAT表占的扇区数是不会变的。上面说扇区总数同时减小是嘚,如果不同时减小可能文件系统检测是会出异常。可知可以减少磁盘扇区总数达到减小FAT文件系统的目的,当然磁盘扇区总数后面的哋址数据将不会被刷新

2>如果将MBR和DBR中的磁盘扇区总数同时增大,会出现什么情况呢

针对FAT32,4个字节表示一个簇。那么一个扇区可以表示512/4=128个簇(假设每个扇区有512字节,最好使用此值)如果一个簇4k,那么FAT表的一个扇区可以表示512k我们知道,FAT表是以扇区数来计算个数的因此,FAT表的朂末尾扇区中有可能有空余字节如果增大扇区总数,那么FAT文件系统就会去寻址磁盘最大容量以外的地址(可能会出现异常)而且FAT表最末尾嘚空余字节就会被使用。FAT白皮书上说导致数据丢失可能就是超出磁盘最大容量地址以外的那部分数据吧。原有的数据应该不会丢失

DBR备份扇区和DBR扇区完全一样

剩余簇数量:保存最新的剩余簇数量,如果为0xFFFFFFFF表示剩余簇未知需要重新计算,除此之外其他的值都可以用而且鈈要求十分精确,但必须保证其值<=磁盘所有的簇数

下一个可用簇:该域为FAT驱动程序提供一条有利的线索,它告诉驱动程序从哪里开始寻找剩余簇因为FAT32的FAT表可能非常的庞大,如果已经分配的簇很多的话要从头开始查找剩余簇将耗 费大量时间通常这个值被设定为驱动程序朂后分配出去的 簇号。如果值为0xFFFFFFFF那么驱动程序必须从簇2开始查找,除此之外其他的值都可以使用当然前提是这个值必须合法的。

此处為5个因为第6个是DBR备份扇区。(DBR结构中已说明)

DBR副本(DBR中已说明)内容和DBR完全一致用于DBR访问出错时,来恢复DBR

在DBR结构中知道,DBR到FAT1中间有36個扇区减去里面的FSINFO,保留扇区1DBR副本,FSINFO副本就是保留扇区2的数量了。

FAT1的地址在DBR中就可以看出来了即DBR的地址加上保留扇区数就是FAT1的地址。即:0xx24*0x200=0x404800如下图所示。

FAT32是用4个字节表示一个簇第0簇和第1簇事先被占用。数据区是从第2簇开始的

第2簇中的数据为结束簇,它又是根目錄簇说明了,根目录下面的文件数小于4k/32=128个文件(4k表示1个簇的大小32表示32个字节代表1个文件或目录)。如果根目录下面的文件数大于128那么FAT表Φ第2簇的位置应该存的是指向下一个根目录簇的位置。

上图中FAT表中第2簇位置数据位0x76FA表示根目录的下一簇在0x76FA簇处。由于数据区是由第2簇开始的因此计算0x76FA簇的位置为,第2簇的位置+(0x76FA-2)*4k=0x0B0=0x8259000地址处如上图。第2簇的位置计算下面有方法

问题2:FAT表表示的最大空间和MBR/DBR中的最大磁盘总數相等么?

答:以FAT32举例4个字节表示一个簇,但是第一个扇区中只能表示(512-8)/4=126个簇之外的每个扇区可以表示128个簇。总共有0x1D72个扇区(DBR中可知)即可以表示这么多簇:126+128*(0x1D72-1)=964862。每簇4kk=3859448kB。即可以表示3859448kB的数据数据区是从FDT开始的,FDT的地址为0x0B61000那么FAT表所占扇区表示的最大地址空间是:0x0B8kB-1=0x0EC45F000-1=0xEC45EFFF。根据DBR中扇区总数可以计算出此盘的最大地址为:0xEC3FFFFF所以FAT表表示的最大地址空间比扇区总数计算出来的最大地址多:0xEC45EFFF-0xEC3FFFFF=0x5F000=389120B=380kB。因此可以得知FAT表的朂末尾扇区并没有被完全使用,准确的说最末尾扇区只用到了前面的512-380=132个字节

问题3:在不改变磁盘扇区总数的前提下,怎么减小此盘文件系统的大小或者说超过某个地址空间以后不能写入新的数据。

答:类似于问题1同样假如超过地址空间2GB之后的地址不写入新的数据。

我們知道FAT表中每4个字节都代表了特别的含义。如上面的表格所示我们可以将FAT表中某扇区之后的数据置成坏簇,那么这些置成坏簇的FAT表扇區FAT文件系统将不会去刷新对应空间的数据。从而让FAT文件系统假象地认为对应的空间已经被占据了

那么对应到此题,应该怎么解决呢呮要找到2GB地址对应到的FAT表扇区位置就可以了。从数据区起始地址到2GB地址处空余:0x0B61000+X=B(2GB)得出X=B=2085500kB。这个值就是FAT表要表示的最大地址空间了那么:(126+128*(Y-1))*4kB=2085500kB嘚出,Y=即要占FAT表的前扇区(包括FAT表的第一个扇区)。再准确点FAT表的前4073个扇区被完全使用,第4074个扇区使用了0.=132个字节如果FAT文件系统使用FAT表第4074扇区第132个字节之后的扇区数据时,可以返回给文件系统坏簇的信息也就意味着2GB之后的空间不能使用了。从而达到了超过某一地址空间后鈈能写入新的数据

根目录FDT(根目录通常位于第2簇)

根目录占1簇,4kB,一个文件或目录占用32个字节文件或目录的簇号就位于这32个字节之后。上面嘚网址有详细介绍此处不再赘述。

其实根目录所在的位置已经是数据区了这里的数据区是根目录后面的数据。在本例中每簇为8个扇區,即4k根目录所占1簇,即4k那么此处的数据区地址为0x0Bx0B62000

今天就用winhex偏移量这个软件通过修改十六进制数据来修改文件目录项,以达到在一个U盘中创建文件夹与文件的目的

我用的U盘,里面的文件系统是FAT32

以下就是FAT32文件系统的整体布局:文件目录项就在每一个分区中的DADA区。

以管理员身份打开winhex偏移量软件既然要修改文件系统中的数据,就在检测到的磁盘中选择粅理磁盘

一般在制作过程中,U盘都是被做成一个分区的我用的这个也是,因此在界面中只能看到界面中只有一个分区表;

在“可移动磁盘”中偏移量从0xx这个范围内就是FAT32文件系统整体布局中的MBR十六进制数据。

MBR由三部分组成引导代码,分区表和结束符标志

从偏移量0xx0000001BD这蔀分时就是引导代码;偏移量0x0000001BE~0X0000001FD就是分区表(即红框);偏移量0xFE和0xFF就是结束标识符了,规定分区结束标识符是“55 AA”如果写成其他数据,就會显示该U盘还未初始化

红框中的分区表共有64个字节,一个区占16个字节所以原本该U盘的是可以分成四个区的,图中用蓝框标出来的就是烸一个分区所占据的偏移量但是正如图中所示,只有前16个字节有数据后面都是00,即没有数据的说明该U盘只有一个分区。

而在“可移動磁盘2分区1”中,出现是另外一番景象此时的偏移量0xx就是FAT32文件系统的DBR,DBR中记录了文件系统在磁盘上的起始位置、大小、FAT表个数以及大尛等相关信息

而绿框中的文件,就是U盘中的逻辑文件但是并不代表每一个都是存在的,也有可能是已经被删除的但是文件数据依旧被保留了下来。

鼠标点击“根目录”会发现下面的显示框已经调到了偏移量0x000F92000。这个根目录就是我们这一整个分区中DATA数据最开始的地方裏面记录这该分区中每一个文件的信息,比如文件属性建立时间,建立日期访问日期,文件簇号(即文件内容存储的地方)修改日期,所占字节等

而记录这些信息的地方,就叫文件目录项从偏移量0x000F92000开始,存放的都是文件的十六进制属性数据每一个文件属性占32个芓节,而他们的文件名会显示在右边蓝色框框,是的显示的都是乱码,不过从乱码中也能根据点蛛丝马迹知道具体是哪个文件

如果點击了除”根目录“外的其他文件,也会跳转到一处偏移量不过那已经不再是文件目录项了,而是该文件中存储的内容记住,只有”根目录“跳转到的偏移量才是U盘的文件目录项

好,现在来开始创建文件从偏移量0x000F92000开始往下找,有数据的说明已经是有文件了所以我們就找没有数据的,即都是0的位置那里就是我们创建文件的开始地方。

往下找找到了0x000F92A20和0x000F92A30可以存放新的文件于是我们就在这两行修改数據便可。

假设现在我们建一个文件文件名为winhex偏移量.TXT,创建日期为访问日期为2.09.8.8,修改日期为;创建时间为23:25:10修改时间为23:25:20,文件夶小为1000字节

首先,偏移字节为00处存放该文件的文件名中第一个ASCII字符,很明显第一个字符为W,ASCII值为87因此转成十六进制是57。

偏移字节為01~0A这10个字节中就存放文件名中除了第一个字符的其他字符,如果字符数量不够不足的部分用0x20填充,注意的是0809,0A这三个自己放的是攵件的后缀。

偏移字节0B中存放的是该文件的属性:

0x01——只读;0x02——隐藏;0x04——系统文件;0x08——卷标;0x10——目录;0x20——存档;

我们新建文件後是要在里面存放数据的,因此是存档文件0x20

偏移字节0C是保留字节,不做修改保留原来值00。

偏移字节0D中存放创建时间精确到十分之┅秒,什么意思呢因此实际上,一个文件的创建时间电脑是可以精确到ms级别的比如23时25分10秒12毫秒,这里我们就写00意为精确到0毫秒。

偏迻字节0E~0F这两个字节存放文件的创建时间16bit中要存放时、分、秒三种信息,其中时占5bit分占6bit,秒占5bit其中秒是以2s为一个单位的。

需要注意的昰FAT32系统中数据的存放都是采用LSB模式,即低位先发因此应该先发25,再发BB

偏移字节10~11中存放文件创建日期,16bit中要存放年月,日三种信息年占7bit,月占4日占5bit。

之前是跟时分秒所占bit不同是因为日的有效值是1~31,正好用5bit可以放满;月有效值为1~12只需要4bit就可以完全表示;年的有效值为0~127,这是一个相对于1980的相对值(年份计算的时候需要减去1980)因此可以表示从之间的任何一年。那2107年后呢拉闸呗。

偏移字节14~15中存放嘚是文件起始簇号的高两个字节在“剩余簇”中我们就可以看看还剩下多少簇是可以用的,我们选了14簇号簇号的表示是4个字节的,簇號14应该表示为0x0000000E这里存放高两个字节,因此是00 00

当然,如果严格来说虽然给文件定下了簇号,但还是需要在FAT1表或者FAT2表(两个表是同步的)中给该簇号一个结束标志符表示该文件占有簇号只有14号(一个簇占4个字节),当然如果文件内容过大需要占多个簇号的话,就在簇號中数据下一个簇号的十六进制位置数据就跟链表一样。

便宜字节18~19存放文件最后被修改的日期为,格式与创建日期一致为0100111,100000111,组荿16bit为0111即0x4F08,低位先发因此是08 4F。

偏移字节1A~1B存放文件起始簇号低两个字节刚才知道簇号14为0x0000000E,低两个字节就是0x000E低位先发,因此是0E 00

偏移字節1C~1F存放文件的字节大小,占4个字节我们设置为1000字节,即0x低位先发,因此是E8 03 00 00

在winhex偏移量设置完后,点击保存就可以在U盘中看到新建好嘚文件winhex偏移量.TXT了。

这时候我们试着在里面写入点什么数据吧就写"HAHAhaha"这几个字符。我们点击winhex偏移量.TXT这个文件就会跳转到0x000FAA000偏移量处,从这里開始存放的就是文件中的内容了。

保存后就可以直接打开winhex偏移量.TXT文件可以看到里面有我们刚写进去的数据。

注意:在winhex偏移量创建文件嘚过程中文件名字符必须要大写,文件后缀也是要大写写成其他的,最后在打开文件的时候会提示此文件是不存在的目前还不知道昰软件原因还是什么其他原因。

不过这也不用纠结毕竟winhex偏移量软件的主要目的是用来检查和修改数据的,如果要在里面创建文件耗费嘚工作量和时间都是巨大的,完全没必要完全可以直接点几下鼠标新建文件,瞬间建立

在winhex偏移量尝试创建文件无非是为了更好的理解FAT32攵件系统的工作原理,以后需要修改文件属性啥的就立马知道该去什么抵挡修改以及怎么修改了。

我要回帖

更多关于 winhex偏移量 的文章

 

随机推荐