使用winhex查看FAT16格式結構


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號簇開始.

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM