FAT32學習筆記(一)

2021-08-05 23:11:05 字數 2520 閱讀 9557

從最簡單的開始,如何在fat32格式的u盤裡找到乙個檔案?

如果有u盤,那麼可以拿實際的u盤做試驗,這裡可以使用乙個image檔案來做試驗,效果一樣。

在整個實驗過程當中,會不停的用到如下幾條命令:

mount test.img /mnt/

umount /mnt

hexdump -c -s ***x -n ***x test.img

具體含義請自行man。

1 首先,建立乙個fat32格式的image檔案。分作如下幾步:(環境為ubuntu 14.04)

a cd /tmp

b sudo dd if=/dev/zero of=test.img bs=512 count=80000

在這一步中,要保證最終的size(bs*count)達到一定數目,具體是多少,目前還沒研究,到後面細節的時候再來研究。

這個時候用hexdump來看,將會看到整個檔案裡全部是0.

c sudo mkfs.vfat -f 32 test.img

這裡就會在這個image檔案中安裝fat32的檔案系統,或者,把這個檔案用fat32的方式進行格式化。

注意,這裡可以用hexdump命令檢視一下目前這個檔案裡的內容,此時已經可以看到fat32的bpb,fsinfo,fat表。

2 把第一步中做好的image掛載起來。

sudo mount test.img /mnt

可以通過mount指令來檢視是否掛載成功,一般會是在最後一項顯示該掛載項。如果成功,則會找到「/tmp/test.img on /mnt type vfat (rw)」

3 在/temp/目錄下建立乙個檔案,為了簡化,用下面的命令

touch 123.txt

4 把這個檔案複製到/mnt目錄,此時可能需要用到sudo,如下

sudo cp 123.txt /mnt/

5 把掛載到/mnt的test.img解除安裝掉

sudo umount /mnt

此時,用hexdump命令來檢視test.img裡的內容,就可以開始最簡單的fat32的學習了。

下圖是此時我的截圖,這裡只擷取了前面512 bytes的內容,先分析這512 bytes。

在fat32的官方文件裡,最前面512 bytes稱作bios parameters block。它叫什麼名字意義不大,重要的是它能提供給我們什麼資訊。

bytespersector,offset 0xb,2 bytes,這裡是0x200,表示乙個sector是512 bytes。

secpercluster,offset 0xd,1 bytes,這裡是0x01,表示乙個cluster包含1個sector。

rsvdseccnt,offset 0xe,2 bytes,這裡是0x0020,表示reserved sector的數目是32個。

numfats,offset 0x10,1 bytes,這裡是0x02,表示fat表的數目是2個。

totsec32,offset 0x20, 4 bytes,這裡是0x00013880,表示該fat32表一共管理了0x13880個sector。

fatsz32,offset 0x24,4 bytes,這裡是0x00000268,表示乙個fat32表占用0x268個sector。

注意,不要用這個格式往fat12或者fat16上套,它們的含義並不一樣。

到這裡,大致可以知道在該檔案的內容分部情況如下:

rsvdseccnt裡已經包括了bpb和fsinfo各占用的乙個sector,所以,fat1 offset = rsvdseccnt * bytespersector = 0x20 * 0x200 = 0x4000

fat2 offset = fat1 offset + fatsz32 = 0x4000 + 0x268 * 0x200 = 0x4000 + 0x4d000 = 0x51000

data offset = fat2 offset + fatsz32 = 0x51000 + 0x4d000 = 0x9e000

或者,直接就有

data offset = rsvdseccnt * bytespersector + numfats*fatsz32*bytespersector = 0x20 * 0x200 + 0x2 * 0x268 * 0x200 = 0x9e000

這時,再用hexdump命令來檢視在offset 0x9e000的地方是否放著123.txt

hexdump -c -s 0x9e000 test.img

附上截圖如下:

由此可以看到,123.txt確實在這裡,雖然位置有點偏差(為什麼不是在offset 0x9e000,而是0x9e020),這個涉及到fat32對長檔名的支援,稍微複雜,後續文章再說。

FAT32的協議總結

讀了fat32協議等,做了一些工作,學會不少東西,但是也有很多不懂得地方,希望明白人多來指教。在u盤進行fat32格式化後,發現除了mbr,dbr,data資料區外,還有一些資料區。就是用winhex發現的,有些資料段都沒見過,不知道是幹什麼的。就是那兩個unpartitioned space。fa...

FAT32的幾個問題

參考 在 中的mbr和dbr的6處,指出了當前分割槽的扇區數,占用4個位元組。每個扇區是512位元組,那麼最大容量為 2 32 1 512 2tb。fat32是以4個位元組代表1簇,但4個位元組中只用到了低28位 高4位保留 因此有2 28個簇,即268435456簇。如果每簇位4kb,那麼2684...

FAT16和FAT32目錄結構分析

fat16和fat32從原理上看是同一類技術,放在一起分析,有助於了解其細節差異 先回歸一下fat16 fat32 分割槽的大致結構如下 從分割槽結構上看,fat16和fat32目錄結構比較不一樣的地方在於 fat16 多了乙個根目錄區,根目錄區由fdt目標表項組成,每乙個分割槽表項佔32位元組 由...