Sunday, October 10, 2010

FAT32: File Allocation Table Recovering

今天中午回家,發現我的創見 8G 隨身碟不能用了,邪惡的 Windows 問我要不要格式化?當然不要啊,裏面還有我的論文電子檔耶!二話不說,先用 dd 把整個 image 備份到硬碟,再 cp 一份避免玩壞。

睡午覺的時候,夢到周公告訴我 USB 不能用的原因。好像說是我把隨身碟插到會加密的電腦上,然後安全軟體就把我的隨身碟加密了。周公說照理講被加密以後沒有金鑰應該是沒救,不過我運氣好,那時候安全軟體還忙著加密其他磁碟,只有把隨身碟前面一點點改掉,我的論文還有救,要看我的造化。

睡醒以後我急忙用 hexdump 看看 image,發現那些檔名都還是明碼,於是展開救援計劃。先另外建一個 10M 的 FAT32 檔案系統,比對一下發現對不起來,仔細想想也對,就算對得起來 sector, cluster, cylinder 數量不對也不能用吧。於是打開 Wikipedia 看 MBR 的格式,這個以前寫磁片作業系統有看過了,看一看覺得也不對,MBR 聽名字就是用來開機的。於是改成看 FAT32 的規格,這個感覺就對了,不過還是有一樣的問題,就是不知道隨身碟舊的 sector, cluster, cylinder 數量,偏偏這幾個參數排在最前面,已經被改掉了。

這樣救很絕望啊,雖然檔案還在,可是抓不到位置,那等於沒用啊。不過小時候聽過麻雀築巢的故事,我知道學習不能半途而廢,繼續看 Wikipedia 的說明,找到了 "Sector number of a copy of this boot sector (0 if no backup copy exists)" 這項,原來 FAT32 還貼心的幫我備份 boot sector。可是我不知道這個備份在哪裡怎麼辦?這個部份也被改掉了啊!於是搜尋製作分割區的 OEM name,先找 MSDOS 果然有啊!然後開始一個個項目對照,看起來的確是 boot sector 的樣子,於是用 dd 把這段拉出來,再蓋回隨身碟上就可以用了,真幸運!

# boot sector is 512 bytes, and backup starts from the 3k-th byte
dd if=crypt.img of=bootsector bs=512 skip=6 count=1
# notrunc 會覆蓋檔案的一部份,剩下的不動
dd if=bootsector of=/dev/sdb1 conv=notrunc

No comments: