Mối quan hệ giữa Root Directory (hoặc Directory) – Directory Entry – FAT Structure và vùng Data
Mối quan hệ giữa Root Directory (hoặc Directory) – Directory
Entry - FAT Structure và vùng Data được minh họa trong hình sau:
Trong đó, mỗi thư mục hoặc tập tin (gọi chung là tập tin) sẽ
có một cấu trúc dữ liệu để mô tả nó, gọi là Directory Entry. Directory Entry chứa
tên tập tin, kích thước, địa chỉ (cluster) bắt đầu của nội dung tập tin trong
vùng Data và một số thông tin khác.
Các Directory Entry được lưu trong vùng Root Directory hoặc
Directory.
Nội dung của tập tin được lưu trong các khối dữ liệu gọi là
các cluster. Nếu tập tin được lưu trong nhiều hơn một cluster, thì các cluster
còn lại của tập tin sẽ được tìm thấy trong FAT Structure.
Như trong hình vẽ, từ Root Directory hệ thống biết được tập
tin TTin2.txt bắt đầu tại Cluster số 6 trong vùng Data, dò trong FAT Structure, xác
định được tập tin TTin2.txt nằm trên ba
cluster là cluster số 6, 7 và 9. Đọc ba cluster này sẽ được nội dung của tập
tin TTin2.txt.
Directory Entry cho tập tin có tên dài
Directory Entry bình thường chỉ hỗ trợ tên tập tin dài nhất
là tám kí tự, phần mở rộng là ba kí tự. Các tên tập tin dài hơn tám kí tự hoặc
các tên tập tin có chứa các kí tự đặc biệt sẽ sử dụng một loại Directory Entry khác, được gọi là LFN
Directory Entry. LFN là viết tắt của Long File Name.
Mỗi tập tin sẽ có một Directory Entry bình thường (Short
Directory Entry), nếu có các LFN Directory Entry, thì các Entry này sẽ được đặt
trước Directory Entry bình thường.
Các trường của một LFN Directory Entry được mô tả trong bảng
sau:
Byte thứ
|
Mô tả
|
0-0
|
Chỉ số của Entry,
hoặc trạng thái cấp phát (0xE5 nếu chưa được cấp phát)
|
1-10
|
Kí tự thứ 1-5 của
tập tin (Unicode)
|
11-11
|
Byte thuộc tính
(xem bảng về Byte thuộc tính)
|
12-12
|
Chưa sử dụng
|
13-13
|
Giá trị Checksum
|
14-25
|
Kí tự thứ 6-11 của
tập tin (Unicode)
|
26-27
|
Chưa sử dụng
|
28-31
|
Kí tự thứ 12-13 của
tập tin (Unicode)
|
Chỉ số của Entry được sử dụng để đếm số lượng các Entry cần
thiết để lưu tên tập tin, Entry đầu tiên có chỉ số là 1. Chỉ số này được tăng
lên một đơn vị khi có thêm một Entry cho tới Entry cuối cùng. Chỉ số trong
Entry cuối cùng được OR với 0x40.
Các LFN Entry của một tập tin được đặt trước các Entry bình
thường, theo thứ tự ngược. Vì vậy, LFN Entry đầu tiên tìm thấy trong Root
Direcotry hoặc Directory sẽ là LFN Entry cuối cùng của tập tin và có chỉ số lớn
nhất. Các vị trí để lưu các kí tự của tập tin nếu không sử dụng hết sẽ được chèn
kí tự NULL, sau đó là các giá trị 0xFF.
“Byte thuộc tính” của LFN Entry có giá trị 0x0F.
Giá trị Checksum được tính dựa trên tên tập tin dạng ngắn,
các LFN Entry của cùng một tập tin sẽ có giá trị Checksum giống nhau.
Ví dụ, hình dưới đây là trích một phần nội dung của Root
Directory, tại sector 31 985 và sector 31 986.
Bảng dữ liệu gồm ba Entry, trong đó hai Entry đầu có Byte
thuộc tính là 0x0F (tại offset 0x1EB và offset 0x0B), nên nó là LFN Entry.
Entry thứ ba là một Entry bình thường.
Tại Entry đầu tiên, chỉ số của Entry mang giá trị 0x42, như
vậy, giá trị của chỉ số Entry khi chưa OR với 0x40 là 2, có thể kết luận tập
tin có hai LFN Entry. Trường Checksum mang giá trị 0xB8.
Năm kí tự đầu tiên của Entry này (offset 0x1E1 – 0x1EA) là
“alat.” (dấu “.” có mã ASCII là 0x2E), vùng kí tự kế tiếp trong Entry này
(offset 0x1EE – 0x1F3) là “txt”, sau đó
là kí tự NULL và các giá trị 0xFFFF, vùng kí tự cuối cùng cũng bao gồm các giá
trị 0xFFFF. Như vậy, phần cuối của tên tập tin đã được xác định là “alat.txt”.
Entry thứ hai, bắt đầu tại offset 0x00, sector 31 986, cũng
được đánh dấu là LFN Entry. Chỉ số của Entry này mang giá trị 1. Giá trị
Checksum cũng giống với Entry đầu tiên, 0xB8. Các trường kí tự tìm được trong
Entry này là: “TenTa”, “pTinDa”, “iD”. Vì chỉ số của Entry là 1 nên đây là
Entry cuối cùng tìm được. Vậy, tên tập tin đầy đủ là “TenTapTinDaiDalat.txt”.
Tên tập tin này ở dạng ngắn được lưu trong Entry thứ ba, nó
là một Entry bình thường và có tên là “TENTAP~1.TXT”.
Tìm các cluster thuộc về một tập tin (trong FAT Structure)
Từ các Entry trong Root Directory hoặc trong Directory, xác
định được cluster bắt đầu vùng dữ liệu của tập tin (hay thư mục). Giá trị
cluster này cũng chính là chỉ số của Entry bắt đầu của tập tin trong FAT Structure, từ
Entry bắt đầu này, theo liên kết của FAT Structure sẽ tìm được tất cả các
cluster thuộc về tập tin.
Như vậy từ giá trị cluster bắt đầu, phải xác định được vị
trí của Entry tương ứng trong FAT Structure.
Gọi giá trị cluster bắt đầu là N.
Khi đó địa chỉ Offset tương ứng của N trên FAT Structure (kí
hiệu: FATOffset) được tính bằng công thức:
FATOffset = N *4
|
Đơn vị tính của FATOffset là byte. Mỗi Entry trong FAT32 có
kích thước 4 byte.
Từ FATOffset, tính chỉ số sector tương ứng trong
FATStructure (kí hiệu: ThisFATSecNum):
ThisFATSecNum = ResvdSecCnt + RoundUp(FATOffset
/ BytsPerSec)
Trong đó:
-
ResvdSecCnt: số sector vùng Reserved.
-
BytsPerSec: kích thước của một sector (byte)
-
RoundUp: “làm tròn lên” kết quả của phép chia.
|
Tính địa chỉ Offset trong sector (kí hiệu: ThisFATEntOffset)
ThisFATEntOffset = FATOffset %
BytsPerSec
Trong đó: “%” là phép chia lấy phần dư.
|
Ví dụ, xét một Entry trong Root Directory sau:
Byte thứ 20-21 chứa giá trị byte cao của cluster bắt đầu “04
00”, và byte thứ 26-27 chứa byte thấp của cluster bắt đầu “32 08”. Vậy, giá trị
của cluster bắt đầu là 0x00040832, đổi sang hệ thập phân là 264242.
Tính địa chỉ Offset tương
ứng của N trên FAT Structure
Ta có N = 264 242,
Vậy, FATOffset = 264 242 * 4 = 1 056 968 (byte)
Tính số sector tương ứng
trong FAT Structure
ThisFATSecNum = 38 + (1 056 968 / 512) = 38 + 2065 = 2103
Tính số sector vật lý
tương ứng trong FAT Structure
2103 + 63 = 2166
Tính địa chỉ Offset
trong sector
ThisFATEntOffset = 1 056 968 % 512 = 200
Lưu ý
Do FAT Structure
sử dụng từ Entry số 2 trở đi (Entry số 0 và số 1 không sử dụng), nên vị trí vật
lý của các Entry sẽ phải tịnh tiến lên 8 byte.
Nội dung của sector vật lý 2166 được thể hiện trong hình
sau.
Giá trị của Entry 264 242 trong FAT Structure là vùng tô màu đỏ ở hình
trên, có giá trị 0x0FFFFFFF (giá trị của EOF).
Nghĩa là dữ liệu của tập tin TENTAP~1.TXT chứa trong một
cluster, đó là cluster 264 242.
Đọc nội dung của tập tin trong vùng Data khi biết cluster bắt đầu
Để đọc nội dung của tập tin trong vùng Data khi biết cluster
bắt đầu:
-
Xác định chuỗi các cluster thuộc về tập tin (đọc
FAT Structure).
-
Tính sector bắt đầu khi biết giá trị cluster.
-
Đọc từng cluster dựa trên sector bắt đầu.
Tính sector bắt đầu khi biết giá trị cluster
Nếu biết giá trị cluster (kí hiệu: N) bất kì, có thể tính được
sector bắt đầu (sector tương đối) của cluster đó bằng công thức sau:
FirstSectorOfCluster
= ((N – 2) * SecPerClus) + FirstDataSector
|
-
FirstSectorOfCluster: sector bắt đầu của
cluster
-
SecPerClus: số sector/cluster
-
FirstDataSector: sector đầu tiên của cluster số
2 trong vùng Data
|
Ví dụ, giá trị của cluster bắt đầu N = 0x00040832, đổi sang
hệ thập phân là 264242.
Áp dụng công thức trên:
FirstSectorOfCluster = ((264 242 - 2) * 4) + 31 920 = 1 088
880.
Vậy sector vật lý là: 1 088 880 + 63 = 1 088 943.
Đọc sector vật lý 1 088 943 sẽ được phần nội dung đầu tiên của
tập tin, như hình dưới đây.
LGC.
-------------------------------------------Cập nhật 27/4/2013
------------------------------
Tham khảo:
[3] FAT32_Hardware White Paper
[5] Brian Carrie, File
System Forensic Analysis, Addison Wesley Professional, 2005