Đĩ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







Đĩa cứng - 9 - Directory Entry

(Tiếp theo của đĩa cứng 8)


Directory (thư mục)

Directory là cấu trúc dữ liệu tương tự như Root Directory, nó cũng chứa các Directory Entry.
Trong khi Root Directory thường nằm ở phần đầu của vùng Data, thì Directory có thể nằm ở vị trí bất kì trong vùng Data.
Directory thực tế là một tập tin, tập tin này chứa các cấu trúc dữ liệu (Directory Entry) mô tả thông tin về các tập tin hay thư mục con của Directory.
Trong một ổ đĩa logic chỉ có một Root Directory, nhưng có nhiều Directory.
Root Directory là đầu mối để hệ thống truy cập tới các tập tin, các Directory con nằm trong thư mục gốc của ổ đĩa. Các Directory lại là đầu mối để đi đến các tập tin hoặc Directory con trong nó.
Directory trong hệ thống FAT32 được tổ chức theo cấu trúc cây, trong đó, Root Directory là nút gốc.
Hình sau minh họa về cấu trúc của Directory.



Directory Entry

Directory Entry có kích thước 32 byte. Mỗi Directory Entry sẽ mô tả thông tin về một tập tin (thư mục), gồm: tên tập tin, kích thước, địa chỉ bắt đầu của vùng nội dung và một số thông tin khác.
Các trường của một Directory Entry được minh họa trong bảng dưới đây:
Byte thứ
Mô tả
0-0
Kí tự đầu tiên của tên tập tin, hoặc trạng thái cấp phát (0xE5 hoặc 0x00: nếu chưa được cấp phát)
1-10
Kí tự thứ 2 đến 11 của tên tập tin
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
Thời gian tạo tập tin (mili giây)
14-15
Thời gian tạo tập tin (giờ:phút:giây)
16-17
Ngày tạo tập tin
18-19
Thời gian truy cập mới nhất (gồm thao tác đọc/ ghi), nếu là ghi thì giá trị của trường này sẽ giống với trường WrtTime.
20-21
Phần byte cao (High word) của cluster bắt đầu.
22-23
Thời gian ghi tập tin mới nhất. Chú ý: tạo tập tin cũng được coi là ghi tập tin (giờ:phút:giây).
24-25
Ngày ghi tập tin mới nhất. Chú ý: tạo tập tin cũng được coi là ghi tập tin. Kí hiệu WrtTime.
26-27
Phần byte thấp (Low word) của cluster bắt đầu.
28-31
Kích thước của tập tin, đơn vị tính là byte. (nếu là thư mục, giá trị này là 0).
Chú ý: nếu tên của tập tin có kí tự đầu tiên là 0xE5, hệ thống sẽ thay thế giá trị này bằng 0x05. Nếu tên tập tin không sử dụng hết 8 byte, các byte không dùng sẽ được chèn bằng khoảng trắng (0x20).
Trường lưu kích thước của tập tin là bốn byte, do vậy kích thước tối đa của tập tin là 4GB. Với Entry là thư mục, trường này sẽ có giá trị là 0.
Các trường liên quan đến ngày tháng năm, gồm hai byte, được chia làm ba phần: năm bit thấp chứa Ngày (giá trị hợp lệ từ 1–31), bit 5–8 chứa Tháng (giá trị hợp lệ từ 1–12), bit 9-15 chứa Năm (giá trị hợp lệ 0-127), giá trị Năm này cộng với 1980 sẽ ra giá trị thật của Năm. Ví dụ về Ngày:Tháng:Năm được minh họa trong hình sau:


 Ví dụ, biểu diễn ngày 10/4/2013.


 
 

Các trường liên quan đến thời gian, gồm 16 bit, được chia làm ba phần: năm bit thấp là Giây, hệ thống đếm từng hai giây một, nên giá trị hợp lệ là 0-29, và giá trị giây thực tế là 0-58. Sáu bit kế tiếp là Phút, giá trị hợp lệ là 0-59. Năm bit cuối cùng là Giờ, giá trị hợp lệ là 0-23.
Ví dụ về Giờ:Phút:Giây được minh họa trong hình sau:

 

  Giá trị cụ thể các trường trong Byte thuộc tính được thể hiện trong bảng dưới đây.

Giá trị
Mô tả
0000 0001 (0x01)
READ_ONLY: chỉ đọc
0000 0010 (0x02)
HIDDEN: ẩn
0000 0100 (0x04)
SYSTEM: hệ thống
0000 1000 (0x08)
VOLUME_ID: tên ổ đĩa
0001 0000 (0x10)
DIRECTORY: thư mục
0010 0000 (0x20)
ARCHIVE: lưu trữ
0000 1111 (0x0f)
LONG_NAME: tên tập tin dài

Hai bit cao của Byte thuộc tính là 2 bit dự trữ, được thiết lập giá trị 0.
Các Entry có thiết lập thuộc tính LONG_NAME sẽ có cấu trúc dữ liệu khác để thể hiện tên tập tin dài.
Ví dụ về Directory Entry, xét Entry số hai trong Root Directory.



 Nội dung của Entry số hai:


Byte thứ
Mô tả
0-0
W
1-10
INDOWS
11-11
0x10 => thư mục
12-12
0
13-13
0x8E
14-15
0x5228 => giờ tạo: 10h:17:17 AM
16-17
0x425C => ngày tạo: 28/2/2013
18-19
0x425C
20-21
0x0000 => byte cao của cluster bắt đầu
22-23
0x5229
24-25
0x425C
26-27
0x5003 => byte thấp của cluster bắt đầu
28-31
0x00000000 => không thể hiện dung lượng


LGC.
-------------------------------------------
Cập nhật 23/4/2013
------------------------------

 Tham khảo:

[3] FAT32_Hardware White Paper
[5] Brian Carrie, File System Forensic Analysis, Addison Wesley Professional, 2005

Đĩa cứng - 8 - Vùng Root Directory

(Tiếp theo của đĩa cứng 7)


Vùng Root Directory (Thư mục gốc)




Như đã đề cập ở phần trên, Root Directory là một cấu trúc dữ liệu, nằm trong vùng Data. Root Directory là siêu dữ liệu của tập tin (file metadata). Root Directory chứa thông tin mô tả các tập tin (thư mục) trong thư mục gốc của ổ đĩa logic gồm: tên tập tin, kích thước, địa chỉ bắt đầu của vùng nội dung và một số thông tin khác.
Với FAT32, vị trí bắt đầu của Root Directory không cố định, nó có thể nằm ở vị trí bất kì trong vùng Data, kích thước của Root Directory cũng không cố định, nó có thể tăng lên tùy ý.
Địa chỉ bắt đầu của Root Directory được lưu trong Boot Sector, byte thứ 44-47 (cluster bắt đầu của Root Directory), kích thước của Root Directory được tính dựa vào FAT Structure.
Tính sector bắt đầu của vùng Root Directory: 


Dựa vào byte thứ 44-47 trong Boot Sector, biết được Root Directory bắt đầu tại cluster số 2 trong vùng Data.
Vậy, để tính sector bắt đầu của vùng Root Directory, cần tính sector bắt đầu của cluster số 2 trong vùng Data.
Công thức để tính sector bắt đầu của cluster số 2 trong vùng Data:

 

FirstDataSector = ResvdSecCnt + (NumFATs * FATSz32)
-         FirstDataSector: số hiệu sector đầu tiên của cluster số 2 trong vùng Data
-         ResvdSecCnt: số sector của vùng Reserved
-         NumFATs: số FAT Structure
-         FATSz32: kích thước của một FAT Structure
Lưu ý: Số hiệu sector ở đây là số hiệu sector tương đối, nghĩa là tính từ đầu ổ đĩa logic chứa vùng FAT đang khảo sát.
Ví dụ:
FirstDataSector = 38 + (2 * 15941) = 31920
Vậy, sector vật lý của vùng Root Directory là: 63 + 31920 = 31983.
Đọc sector 31983. Một phần nội dung của Root Directory được thể hiện trong hình dưới đây.



Root Directory được chia thành các Directory Entry.

LGC

 -------------------------------------------
Cập nhật 23/4/2013
------------------------------

 Tham khảo:


[3] FAT32_Hardware White Paper
[5] Brian Carrie, File System Forensic Analysis, Addison Wesley Professional, 2005

Đĩa cứng - 7 - Vùng FAT

(Tiếp theo của đĩa cứng 6)

Vùng FAT



Vùng dữ liệu quan trọng kế tiếp của một ổ đĩa logic FAT32 là vùng FAT (File Allocation Table).
Vùng FAT có hai nhiệm vụ quan trọng:
-          Cho biết trạng thái cấp phát các cluster trong vùng Data.
-          Xác định các cluster thuộc về một tập tin. Nếu biết được cluster bắt đầu của một tập tin, dựa vào vùng FAT sẽ biết được các cluster còn lại của tập tin này.
Vùng FAT thực tế là hình ảnh của vùng Data thu nhỏ. Mỗi cluster trong vùng Data tương đương với một entry trong vùng FAT.
Vùng FAT bắt đầu ngay sau vùng Reserved. Thường gồm hai FAT Structure: FAT Structure chính và FAT Structure dự phòng. FAT Structure dự phòng – nếu có – sẽ bắt đầu ngay sau FAT Structure chính.
Số FAT Structure, kích thước của mỗi FAT Structure được chỉ định trong Boot Sector của ổ đĩa logic, tuy nhiên, thực tế có thể không sử dụng hết kích thước này.
FAT Structure được chia thành các entry, kích thước của mỗi entry tùy thuộc vào hệ thống FAT, ví dụ: FAT32 là bốn byte, FAT16 là hai byte,…v.v.
Các entry được đánh chỉ mục từ 0. Hai entry đầu tiên (FAT[0], FAT[1]) không sử dụng để chứa số hiệu cluster, FAT[[0] chứa mã loại đĩa (media type), FAT[1] chứa mã cho biết trạng thái sử dụng đĩa (ví dụ: cho biết máy đã bị tắt không đúng cách).
Một số giá trị của entry:
-          0: Nếu cluster chưa được cấp phát.
-          Khác 0: Nếu cluster đã được cấp phát, giá trị này chính là vị trí của cluster kế tiếp thuộc về tập tin.
-          Lớn hơn 0x0FFF FFF8: Nếu là cluster kết thúc của tập tin, đây là dấu hiệu kết thúc tập tin (EOF: End – Of – File).
-          0x0FFF FFF7: cluster tương ứng bị hư hoặc không thể cấp phát cho tập tin.
Khi biết được số hiệu cluster bắt đầu của một tập tin, tìm tới entry tương ứng trong FAT Structure, liên kết tới các entry kế tiếp cho tới khi gặp dấu hiệu kết thúc EOF. Tập hợp các entry này là các cluster chứa dữ liệu của tập tin trong vùng Data.
Ví dụ: TapTin1.txt nằm trên các cluster 3, 5, 8, 4 và TapTin2.doc nằm trên các cluster 6, 7, 9 được minh họa trong hình sau:



Từ Boot Sector xác định được:
-          Số sector của vùng Reserved: giá trị này chứa trong byte thứ 14 và 15 của Boot Sector.
-          Vùng FAT bắt đầu tại: Số sector của vùng Reserved + 1.
-          Số FAT Structure: giá trị này chứa trong byte thứ 16 của Boot Sector.
-          Kích thước (tính bằng sector) của mỗi FAT Structure: giá trị này chứa trong byte thứ 36-39 của Boot Sector.
-          Kích thước của vùng FAT (tính bằng sector) = Số FAT Structure * Kích thước của mỗi FAT Structure. Hình minh họa bên dưới.



Ví dụ, biết được vùng Reserved bắt đầu tại sector 63, từ bảng phân tích các trường của Boot Sector, biết được vùng Reserved có kích thước 38 sector, vậy vùng FAT sẽ bắt đầu tại sector: 63 + 38 = 101.
Số FAT Structure là 2. Kích thước của mỗi FAT Structure là 15941. Vậy kích thước của vùng FAT là: 2 * 15941 = 31882 (sector).
Một phần nội dung của vùng FAT được minh họa trong hình sau.


 ---------------------------
Cập nhật: 2013/4/9
-------------------------
Tham khảo:


[3] FAT32_Hardware White Paper
[4] http://en.wikipedia.org