pretty code

2022年5月26日 星期四

消失的記憶 - NTFS

一直到剛剛終於有時間拿出《File System Forensic Analysis》一書來複習一下消失的記憶!

NTFS 雖然是微軟最常使用的檔案系統之一,但因為並沒有公開的規格書,故網路上的資料都有一些不齊全之處。

記得我當初回答同事問題時,也是在網路上找了許久,最後才找到這本書有比較詳盡的描述。

但我印象當初看時,好像也是有一半的地方是看不懂的?

趁著這次重看的機會,看是否能把它搞懂?

---------------------------------------------------------------------

Q1:
為何有些 MFT Entry(FILE RECORD) 資料會有 $BITMAP(0xB0) ,有些就又沒有,他出現的時機是什麼?因為實際的資料不是在 $DATA(0x80) 裡面就可以取到了?

Ans:


Q2:
Metadata 中的 $MFT 大約會拿硬碟的 12.5, 25, 37.5, 50% 的空間來放 $MFT,有的 $MFT 會拿連繼的空間,有的取 $MFT 就要自己去 $DATA 的 DATA RUN 裡面取。

MFT Zone Reservation IS NOT STORED ON DISK
MFT Zone (reserved space for MFT)
1 = 12.5%
2 = 25.0%
3 = 37.5%
4 = 50.0%
Where is this stored on disk?

Ans:
我的猜測如下,對應到 MFT Zone 的位置的 $BITMAP 會被設為 1,表示被使用中,故只有微軟作業系統知道放在哪裡,我想那個表示被使用中的 Entry 如果跳到該 Entry 看,應該是空的。

如果今天 MFT Entry 都用完了,是不是表示就是硬碟滿了?之前有實驗建一個 10MB 的硬碟,用小檔把 MFT Entry 全用滿,後來就沒法再建檔案/目錄了,不過如果 1K空間(MFT Entry)還夠,還是可以建 ADS。

Ans:我覺得是,但我想嘗試去填滿它(Active Disk Editor),寫入失敗。順帶一提,我寫的是 $BITMAP 這個 meta data 指到的 Data Run 位置,但我不確定這樣對嗎?還是應該也改 $MFT meta data 的 $BITMAP attribute(我這兩邊讀到的位置不一樣,不確定是不是我算錯了,差了 1K)?

補充:我搞混了,$MFT 的 $BITMAP attribute 是針對 MFT Entry 的,$BITMAP 的 Data Run 是針對 Cluster 的,那天不知為何一時想混了。


另一個硬碟滿的條件,那就是只用一個檔案,讓他內容超大,ex: 10MB HD 為例,檔案大於 7~8MB ,那 $BITMAP 裡面的Cluster空間就都會被用掉。

上述是否正確,或是還有什麼情況下,NTFS 會爆掉?

Ans:我也只能想到這兩種,但我直覺會先讓 MFT Entry 爆掉,之後一定無法新增檔案了。

Q 3:
目錄都會有 $INDEX_ROOT(0x90),當目錄下檔案多時,就會有 $INDEX_ALLOCATION (0xA0),0x90是 Resident 而 0xA0 是 Non-Resident 的,如果是 0xA0 INDX 申請出來的空間,不會在 $MFT 裡面,所以今天如果只取到 $MFT 想處理目錄,就沒法靠 0x90/0xA0 做 B+Tree 的列舉,就只能自己靠 $MFT 裡面的 0x30 裡面的 Parent directory file record number 去做處理了對嗎?

Ans:
我只知道從 $. parse 的方法,我不知道可以從 $MFT 找到根目錄的方法,而且 0x30 我以為是指 $FILE_NAME attribute?我不確定這邊的 Parent directory file record number 是指什麼?

沒有留言: