winhex介绍

winhex可以直接查看磁盘二进制信息, 可以比较直观地查看到各种文件系统格式的区别.

winhex使用

  • 查看硬盘要管理员权限, 即启动的时候要用邮件管理员权限启动
  • 点击Tools->Open Disk查看硬盘
  • 磁盘浏览界面字体如果太小, 可以在Option->General->Font(右下角)调整
  • View->Show->Data Interpreter打开光标数值实时查看悬浮窗
    • 在悬浮窗上右键点Option, 可以调整展示的内容以及切换符号/无符号显示
    • 默认为Little Endian, 可以改为Big Endian
  • 磁盘浏览界面
    • 每行16个byte
    • 在Offset这一列上左键点击可以切换十进制和十六进制显示, 非常有用
    • 点击具体地址, 在底栏会显示当前sector, 偏移量(地址), 值(无符号byte),
    • 选择区域, 在底栏会显示block区间, 大小(非常有用)
    • 在右侧ANSI ASCII这一列抬头上点击左键, 可以切换为UTF-8等编码显示
  • 二进制区
    • Navigation->Position Manager, 可以分不同颜色添加自定义区域, 很直观, 非常有用
    • Navigation->Go To Offset可以从当前位置快速定位到指定偏移量位置, 非常有用
  • 双击磁盘, 会打开内容浏览界面, 显示的是磁盘内部文件, 包含已删除文件

FAT16的基本结构

FAT16文件系统的基本结构依次为: DBR扇区, FAT表1, FAT表2, 根目录, 数据区.

MBR区(主引导扇区)

MBR(Main Boot Record), 按其字面上的理解即为主引导记录区, 位于整个硬盘的0磁道0柱面1扇区. 在总共512字节的主引导扇区中, MBR只占用了其中的446个字节(偏移0 - 偏移1BDH), 另外的64个字节(偏移1BEH - 偏移1FDH)交给了DPT(Disk Partition Table硬盘分区表), 最后两个字节55 AA(偏移1FEH - 偏移1FFH)是分区的结束标志. 这个整体构成了硬盘的主引导扇区.

主引导记录中包含了硬盘的一系列参数和一段引导程序。其中的硬盘引导程序的主要作用是检查分区表是否正确并且在系统硬件完成自检以后引导具有激活标志的分区上的操作系统, 并将控制权交给启动程序.

MBR是由分区程序(如fdisk)所产生的, 它不依赖任何操作系统, 而且硬盘引导程序也是可以改变的, 从而实现多系统共存.

DBR扇区

DBR(Dos Boot Record)是操作系统引导记录区, 它通常位于硬盘的0磁道1柱面1扇区, 是操作系统可以直接访问的第一个扇区, 它包括一个引导程序和一个被称为BPB(Bios Parameter Block)的本分区参数记录表. 引导程序的主要任务是当MBR将系统控制权交给它时,判断本分区跟目录前两个文件是不是操作系统的引导文件(以DOS为例, 即是 IO.SYS 和 MSDOS.SYS), 如果确定存在, 就把其读入内存, 并把控制权 交给该文件. BPB参数块记录着本分区的起始扇区, 结束扇区, 文件存储格式, 硬盘介质描述符, 根目录大小, FAT个数, 分配单元的大小等重要参数.

下面是从一个2G的TF卡上得到的DBR扇区实际数据

EB3C90
4D53444F53352E30
0002
40
0800
02
0002
0000
F8 <- nc
EC00
3F00FF0087000000 <- nc
79CF
3A00000029A8E6B3004E4F204E414D4520202020 <-nc
4641543136202020

首先说明一下数据格式, 这些是Little Endian格式的数据, 在单个byte时可以直读, 但是在多个byte时, 高位是在右侧的, 例如 '00 02'代表的其实是'02 00'即512, '00 FF'代表的是'FF 00'即65280. 下面是具体每一段的数值说明:

  1. 偏移地址00H, 长度3, 内容: EB 3C 90 跳转指令.
  2. 偏移地址03H, 长度8, 内容: 4D 53 44 4F 53 35 2E 30 为厂商标志和os 版本号, 这里是MSDOS5.0.
  3. 偏移地址0BH,长度2, 内容: 00 02, 即512. 表示每个扇区有512个字节. 这个值也可能是1024, 2048, 4096.
  4. 偏移地址0DH, 长度1, 内容: 40. 表示的意思是每个簇有64个扇区, 即32KByte. 这个值不能为0, 而且必须是2的整数次方, 比如1、2、4、8、16、32、64、128. 但是这个值不能使每个簇超过32KB字节.
  5. 偏移地址0EH, 长度2, 内容: 08 00. 转换一下, 就是00 08, 意思是保留区域中的保留扇区数为8个. 那么就可以知道下面的FAT1区的开始的地址就是 0x08 * 0x200(每个扇区的字节数)= 0x1000.
  6. 偏移地址10H, 长度1, 内容: 02. 表示此卷中的FAT结构的份数为2, 另外一个是备份的.
  7. 偏移地址11H, 长度2, 内容: 00 02. 转换一下, 就是0200H, 表示根目录项数(Root Entries) 能够保存在该分区的根目录文件夹中的32个字节长的文件和文件夹名称项的总数. 在一个典型的硬盘上该值为512.
  8. 偏移量地址13H, 长度2, 内容: 00 00. 表示小扇区数(Small Sector). 该分区上的扇区数, 表示为16位(<65536). 对大于65536个扇区的分区来说, 本字段的值为0, 而使用大扇区数来取代它.
  9. 偏移地址16H, 长度2, 内容: EC 00. 转换一下为00 EC = 60,664, 表示每个FAT占用的扇区数. 那么每个扇区占用的字节数就是0x00EC*0x200 = 0x1D800. 根据启动区、FAT1、FAT2、根目录、数据区的次序, 可以依次计算出它们的地址了(教程中给出的偏移地址为24H, 但是根据实际的FAT1/FAT2地址的推算, 应该是16H地址).
  10. 偏移量地址20H, 长度2, 内容: 79CF, 即CF79 = 53,113. 表示大扇区数(Large Sector). 如果小扇区数字段的值为0, 本字段就包含该 FAT16 分区中的总扇区数. 如果小扇区数字段的值不为0, 那么本字段的值为0.
  11. 偏移量地址36H, 长度为8, 内容: 46 41 54 31 36 20 20 20, 对于ASCII码为"FAT16", 表示文件系统类型(File System Type) 根据该磁盘格式, 该字段的值可以为FAT, FAT12 或 FAT16.

FAT1, FAT2

簇的链表. 在根据目录项获取文件的首簇号后, 在FAT 找到对应的簇, 可以找到下一个簇, 一直到文件结束. 对于FAT16, 每个簇用16Bit来表示, 而对于FAT32, 使用32Bit来表示. 这是两者之间的重要区别.

根据上面的分析得知, FAT1和FAT2的起始位置在 0x1000, 长度为 0x1D800, 分区开始位置在10E00, 所以

  • BDR: 0x10E00, 长度0x1000
  • FAT1: 0x11E00, 长度0x1D800
  • FAT2: 0x2F600, 长度0x1D800
  • 根目录: 0x4CE00

DIR区, 根目录区

根目录的作用就是有文件或者目录的首簇号, 以及文件的长度(目录的长度是0). FAT16中, 根目录的所占空间可以根据BPB中的参数 - Maximum Root Directory Entries(0x11, 2bytes).

FAT16短文件目录项, 每32个字节表示一个文件(文件夹也是), 下面是一个实际的数据例子

4170006500740065
0031000F00EE2E006D00700033000000FFFF0000FFFFFFFF <-nc
5045544531202020
4D5033
20
0000094DD450F1500000 <- nc
C64C
D450
9925
53D13B00 4170006500740065
0032000F00022E006D00700033000000FFFF0000FFFFFFFF <-nc
5045544532202020
4D5033
20
0000094DD450F1500000 <-nc
CD4C
D450
1126
72C74500 4170006500740065
...

间隔着驱动器的信息(32Byte)

  1. 偏移地址00H, 长度8, 内容: 驱动器的名称, 8个字节.

然后是文件信息(32Byte)

  1. 偏移地址20H, 长度8, 内容: 5045544531202020. 表示第一个文件名: PETE1 (空缺部分是空格).
  2. 偏移地址28H, 长度3, 内容: 4D5033, mp3, 表示文件扩展名, 为ASCII字符表示.
  3. 偏移地址2BH, 长度1, 内容: 20. 表示文件属性, 00000000(读写); 00000001(只读); 00000010(隐藏); 00000100(系统); 00001000(卷标); 00010000(子目录); 00100000(归档).
  4. 偏移地址36H, 长度2, 内容为C6 4C. 表示时间 = 小时*2048 + 分钟*32+秒/2. 得出的结果换算成16进制填入即可. 也就是: 36H字节的0-4位是以2秒为单位的量值; 36H字节的5-7位和37H字节的0-2位是分钟; 37H字节的3-7位是小时.
  5. 偏移地址38H, 长度2, 内容为D4 50. 表示日期= (年份 - 1980)*512 + 月份*32 + 日. 得出的结果换算成16进制填入即可. 也就是: 38H字节0-4位是日期数; 38H字节5-7位和39H字节0位是月份; 39H字节的1-7位为年号, 原定义中0-119分别代表1980-2099, 目前高版本的Windows允许取0-127, 即年号最大可以到2107年.
  6. 偏移地址3AH, 长度2, 内容99 25, 为该文件开始簇号, 这里也是用了小端格式组织. 转换下为25 99, 根据这个就可以找到文件PETE1.mp3下一个簇号在FAT1中的位置了. 0x11E00 + 2599H*02H(因为2个字节存一个簇号)= 0x16932.
  7. 偏移地址3CH, 长度4, 内容: 53 D1 3B 00. 表示文件长度, 转换后为00 3B D1 53就是3,920,211 Byte

然后又是驱动器信息(32Byte)

数据区

文件等数据待的地方. 紧跟着根目录. 从2号簇开始.

参考

使用winhex查看FAT16格式结构的更多相关文章

  1. winhex的使用

    1. 当我们用VC编写代码,将数据写入到磁盘的文件后,用winhex查看,winhex可以检测文件最后写入时间的变动,如果有变动,则会提示“此文件的最后写入时间已经改变.解除当前状态并重新载入吗?”, ...

  2. winhex与磁盘格式与 数据恢复

    第一阶段: 熟悉WinHex的使用. n 熟悉磁盘工具的使用. n 利用WinHex查看物理磁盘和逻辑磁盘. n 了解WinHex中相关工具的用法. 以管理员身份运行winhex(以便之后修改) 上方 ...

  3. 【转载】硬盘MBR详细介绍

    原文地址:http://blog.chinaunix.net/uid-15007890-id-106892.html 硬盘MBR详细介绍      硬盘是现在计算机上最常用的存储器之一.我们都知道,计 ...

  4. [转]硬盘分区表知识——详解硬盘MBR

    http://www.blogjava.net/galaxyp/archive/2010/04/25/319344.html 硬盘是现在计算机上最常用的存储器之一.我们都知道,计算机之所以神奇,是因为 ...

  5. 硬盘分区表知识—详解硬盘MBR

    硬盘是现在计算机上最常用的存储器之一.我们都知道,计算机之所以神奇,是因为它具有高速分析处理数据的能力.而这些数据都以文件的形式存储在硬盘 里.不过,计算机可不像人那么聪明.在读取相应的文件时,你必须 ...

  6. 硬盘分区表知识——详解硬盘MBR (转)

    Ref: http://www.blogjava.net/galaxyp/archive/2010/04/25/319344.html 硬盘是现在计算机上最常用的存储器之一.我们都知道,计算机之所以神 ...

  7. 【转】详解硬盘MBR

    原文网址:http://hi.baidu.com/waybq/item/a4490f026f9859d21ef046a4 硬盘是现在计算机上最常用的存储器之一.我们都知道,计算机之所以神奇,是因为它具 ...

  8. 硬盘分区表知识——详解硬盘MBR

    这片文章说得很详细,原文:http://hi.baidu.com/waybq/blog/item/3b8db64bef3dc7f583025c66.html --------------------- ...

  9. FAT和EXFAT文件系统

    文件系统 文件系统是操作系统用于明确磁盘或分区上的文件的方法和数据结构:即在磁盘上组织文件的方法.在移动存储设备上比较常用的有FAT文件系统和ExFAT文件系统. FAT分区依据FAT表中每个簇链的所 ...

  10. 第38章 I2S—音频播放与录音输入—零死角玩转STM32-F429系列

    第38章     I2S—音频播放与录音输入 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

随机推荐

  1. [kubernetes]服务健康检查

    前言 进程在运行,但是不代表应用是正常的,对此pod提供的探针可用来检测容器内的应用是否正常.k8s对pod的健康状态可以通过三类探针来检查:LivenessProbe.ReadinessProbe和 ...

  2. 程序&命名-执行环境

    开发程序执行环境 系统级别 -- 编译器或解释器 程序级别 -- 命令行参数.配置文件 执行级别 -- 进程.线程.协程运行时上下文(树(命名空间 -- 函数-局部变量.包或模块-全局变量)) 命令行 ...

  3. [转帖]/dev/random 和 /dev/urandom的一点备忘

    https://www.cnblogs.com/ohmygirl/p/random.html 1.  基本介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两 ...

  4. [转帖]【性能】大页内存 (HugePages)在通用程序优化中的应用

    目录 1. 背景 2. 基于指纹的音乐检索简介 3. 原理 4. 小页的困境 5. 大页内存的配置和使用 6. 大页内存的优化效果 7. 大页内存的使用场景 8. 总结 LD_PRELOAD用法 原文 ...

  5. [转帖]AMD处理器ZEN一代之国产化海光

    https://huataihuang.gitbook.io/cloud-atlas-draft/os/linux/kernel/cpu/amd_hygon   2020年国产化处理器受到了广泛的关注 ...

  6. 申威3231_SPECJVM2008的测试结果与信创服务器对比验证

    申威3231_SPECJVM2008的测试结果与信创服务器对比验证 背景 周六找同事将在公司里的机器进行了开机. 然后验证了config.guess和config.sub 的确是可以通过复制/usr ...

  7. [转帖]麒麟V10 arm 环境配置yum源

    # 进入yum源文件目录 cd /etc/yum.repos.d # 备份yum源文件 cp kylin_aarch64.repo kylin_aarch64.repo.bak # 修改源文件内容 v ...

  8. Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑

    Mysql8.0.32 union all创建视图无法使用中文模糊查询的坑 摘要 本周研发同事反馈现场有一个问题. 客户使用mysql的数据库(Windows平台) 然后在多表union all 创建 ...

  9. [转帖]xfs_repair命令详解

    https://bbs.qunyingkeji.com/2052/ 1.现状 目前网上出现大量的主机输入输出错误,原因是由于主机文件系统损坏.一线人员大部分采用的是umont 和 mount的方式恢复 ...

  10. [转帖]解析Linux gcore: 揭示程序内存捕获的秘密(linuxgcore)

    https://www.dbs724.com/133618.html Linux gcore 是一种在Linux系统中使用命令行工具捕获进程内存内容的方法.它允许程序员制定程序的一个内存快照,从而帮助 ...