昨天從 $MFT 的 File Status,可以判斷一筆 MFT Record 是否已經被刪除。
不過 NTFS 本身並沒有另外提供一個 Deleted Time,告訴我們檔案是在什麼時間被刪除。如果要繼續追這個資訊,其中一個可以看的地方就是 Windows 的 $Recycle.Bin。
除了刪除時間之外,$Recycle.Bin 裡還可以找到檔案刪除前的原始路徑,以及被刪除的檔案本身。
每個磁碟分割區都會有自己的 $Recycle.Bin,裡面再依不同使用者的 SID / RID 建立對應的資料夾。
在 CMD 輸入:
cd \$Recycle.Bin
dir /a

因為 $Recycle.Bin 屬於系統目錄,所以使用 dir /a 才能把這些項目一起列出來。
這時可以看到類似:
S-1-5-18
S-1-5-21-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-1001
接著進入要分析的使用者目錄:
cd S-1-5-21-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-1001
dir /a

就會看到許多 $I 和 $R 開頭的檔案。
例如:
$I0KJCFK.mp3
$R0KJCFK.mp3
可以發現 $I 和 $R 後面的英數字與副檔名是一樣的,因此可以把它們配成同一組,代表的是同一個被刪除的 mp3。
Windows 將進入 Recycle Bin 的檔案分成兩個部分:
| 檔案 | 內容 |
|---|---|
$I |
Index / Information,記錄刪除時間、原始路徑等資訊 |
$R |
對應實際被刪除的檔案 |
所以在分析 $Recycle.Bin 時,不能只看到一堆亂碼檔名。
真正要注意的是 $I 和 $R 後面的字串是否相同,藉此把刪除資訊和實際檔案對應起來。
$I 找出刪除時間與原始路徑我們把上面的兩個檔案從 $Recycle.Bin 複製到 Desktop 看看。
copy "$I0KJCFK.mp3" "%USERPROFILE%\Desktop\$I0KJCFK.mp3"
copy "$R0KJCFK.mp3" "%USERPROFILE%\Desktop\$R0KJCFK.mp3"
其中 $R 是實際被刪除的檔案內容。把 $R0KJCFK.mp3 複製出來後,能發現這個音檔可以正常播放,而且音檔長度也可以正常讀取。

所以雖然原本的檔案已經被丟進 Recycle Bin,資源回收桶也被清空了,但 $R 裡保存的 File Content 仍然是完整的。
接著試試看用 HxD 開啟 $I0KJCFK.mp3。
對數位鑑識來說,$I 很重要,因為它記錄了被刪除檔案的相關資訊。

$I 裡幾個重要的位置如下:
| Decimal Offset | Hex Offset | Length | 內容 |
|---|---|---|---|
0 |
0x00 |
8 Bytes | Version |
8 |
0x08 |
8 Bytes | Logical File Size |
16 |
0x10 |
8 Bytes | Deleted Time |
24 |
0x18 |
4 Bytes | Original Path 字元長度(Version 2) |
28 |
0x1C |
Variable | Original Path(Version 2) |
先看檔案開頭的 8 Bytes:
02 00 00 00 00 00 00 00
以 Little Endian 解讀後是 0x02,代表這是一筆 Version 2 的 $I 格式。
通常 Version 1 對應 Windows 7、Version 2 對應 Windows 10 的 $I 結構。
接著從 Decimal Offset 8 開始的 8 Bytes,記錄的是原始檔案的 Logical File Size。
D6 B7 6F 02 00 00 00 00
以 Little Endian 解讀後,可以得到這個檔案原本的大小為 40,875,990 Bytes。
再往後看 Decimal Offset 16 開始的 8 Bytes,就是這個檔案的 Deleted Time。
00 D2 E2 29 94 4E DD 01
和昨天分析 MFT Timestamp 一樣,在 HxD 中選取這 8 Bytes,再查看右側 Data Inspector 的 FILETIME,就能把 Raw Hex 轉成實際的刪除日期與時間。
最後從 Offset 0x1C 往後看,可以直接在右側看到 UTF-16 編碼的原始路徑,例如這次可以還原出原本的檔案位置:
C:\Users\kitty\Downloads\TEST 1.mp3
所以光是一個 $I,就可以把 Version、File Size、Deleted Time 和 Original Path 這幾個重要資訊找回來。
再搭配同一組的 $R,還可以取得實際被刪除的檔案內容。
剛才進入 $Recycle.Bin 時,可以看到資料夾名稱不是一般的 User Name,而是一長串 SID:
S-1-5-21-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-1001
Windows 的使用者帳號識別資訊包含:
SID = Security Identifier
RID = Relative Identifier
例如上面這組 SID 最後的 1001 就是 RID。
如果要知道這個 SID 實際對應到哪一個 Windows 使用者,可以再搭配 Registry 進行確認。
其中一種方式是在:
Microsoft\Windows NT\CurrentVersion\ProfileList
找到對應的 SID,並查看其中的 ProfileImagePath。
例如:
S-1-5-21-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-1001
↓
ProfileImagePath
↓
C:\Users\kitty
就可以把 $Recycle.Bin 裡看到的 SID 和實際使用者帳號對應起來。
除了 SOFTWARE 裡的 ProfileList,也可以透過 SAM 的內容進行帳號與識別碼的關聯比對。
從昨天的 $MFT 到今天的 $Recycle.Bin,其實是在看同一件事情的不同紀錄。
$MFT 可以看到 File Record 是否已經被刪除,而 $Recycle.Bin 裡的 $I 和 $R,則可以再往下找到刪除時間、原始路徑,以及對應的被刪除檔案。
$MFT
→ Deleted File Record
$Recycle.Bin
→ $I:Deleted Time / Original Path / File Size
→ $R:Deleted File
SID / RID
→ 對應實際 Windows User
把這些資訊串起來後,才能更完整地還原檔案被刪除前後留下的紀錄。