Đĩa cứng - 10 - LFN Directory Entry

(tiếp theo của Đĩa cứng 9)



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