He thong quan ly tap tin NTFS - 9 - Attribute $FILE_NAME & $DATA



(tiếp theo của He thong quan ly tap tin NTFS - 8 - Attribute $STANDARD_INFORMATION)


Attribute $FILE_NAME


Mỗi tập tin hoặc thư mục (từ đây gọi tắt là tập tin) luôn có ít nhất một attribute $FILE_NAME trong MFT entry của nó. Một bản sao của attribute $FILE_NAME cũng được lưu trong index của thư mục cha (chứa nó), hai phiên bản này không nhất thiết phải giống nhau hoàn toàn về nội dung. Nội dung của attribute $FILE_NAME trong index của thư mục cha sẽ được đề cập sau, phần này chỉ xem xét attribute $FILE_NAME trong MFT entry.

Mã loại của attribute này là 48. Kích thước của attribute này không cố định, tùy thuộc vào chiều dài của tên tập tin. Cụ thể, kích thước của attribute là: 66 + chiều dài của tên tập tin.

Tên của tập tin là một chuỗi kí tự kiểu UTF-16 Unicode, được định dạng theo kiểu DOS 8.3, Win32 hoặc POSIX. Windows thường yêu cầu một tập tin ít nhất phải có định dạng tên kiểu DOS 8.3, do đó trong attribute $FILE_NAME sẽ có cả hai loại định dạng là: DOS và dạng tên đầy đủ. Tùy thuộc vào kiểu định dạng tên, sẽ có quy định những kí tự nào gọi là hợp lệ khi đặt tên cho tập tin.

Attribute $FILE_NAME có chứa địa chỉ (file reference) MFT entry của thư mục cha chứa nó.
Attribute $FILE_NAME cũng chứa bốn thông tin về thời gian, tương tự như trong attribute $STANDARD_INFORMATION. Tuy nhiên, hệ thống Windows không cập nhật thông tin về thời gian thường xuyên như trong attribute $STANDARD_INFORMATION, thông thường nó chỉ được cập nhật khi tập tin được tạo ra, được di chuyển hoặc khi đổi tên.

Trong attribute $FILE_NAME có trường cho biết kích thước của tập tin, tuy nhiên, giá trị trường này thường là 0.

Cuối cùng, attribute $FILE_NAME có chứa “cờ báo” cho biết một số thông tin liên quan đến tập tin này, ví dụ như: là thư mục, là tập tin chỉ đọc, là tập tin hệ thống, được nén, được mã hóa…v.v.

Nói chung, attribute $FILE_NAME chứa rất nhiều các thông tin tương tự như trong attribute $STANDARD_INFORMATION. Trong đó có hai thông tin quan trọng là tên của tập tin, tên này cũng được sử dụng để tạo chỉ mục trong thư mục và địa chỉ của thư mục cha, địa chỉ này giúp xác định đường dẫn.

Trong MFT entry, thông thường attribute $FILE_NAME nằm ở vị trí thứ hai và là attribute kiểu resident. Tuy nhiên, nếu một tập tin cần nhiều hơn một MFT entry thì sẽ có attribute $ATTRIBUTE_LIST nằm giữa attribute $STANDARD_INFORMATION và attribute $FILE_NAME.

Cũng như tất cả các attribute khác, cấu trúc của attribute $FILE_NAME gồm các phần sau.

Byte thứ
Mô tả
0 – 15
Cấu trúc header chuẩn của attribute $FILE_NAME.
16 – 19
Kích thước phần nội dung của attribute $FILE_NAME.
20 – 21
Nơi bắt đầu (offset) của phần nội dung attribute $FILE_NAME.

Để đọc được nội dung của attribute $FILE_NAME, trước hết cần tính byte bắt đầu của attribute này.
Attribute $FILE_NAME nằm ngay sau attribute $STANDARD_INFORMATION. Attribute $STANDARD_INFORMATION bắt đầu tại offset 56, kích thước của $STANDARD_INFORMATION là 96 byte, vậy attribute $FILE_NAME sẽ bắt đầu tại vị trí (byte): 56 + 96 = 152.

Từ offset 152, đọc 16 byte sẽ là nội dung header của attribute $FILE_NAME, xem Hình 28.



Bảng sau là nội dung header của attribute $FILE_NAME.

Byte thứ
Giá trị (Hệ 16 – Hệ 10)
Mô tả
0 – 3
0x00000030 – 48
Mã loại là 48.
4 – 7
0x00000070 – 112
Kích thước của attribute $FILE_NAME là 112 byte.
8 – 8
0x00 – 0
Attribute thuộc kiểu resident.
9 – 9
0x00 – 0
Attribute này không được đặt tên, nên không có giá trị chiều dài của tên.
10 – 11
0x0000 – 0
Attribute này không được đặt tên, nên không có thông tin về vị trí của tên.
12 – 13
0x0000 – 0
Giá trị cờ báo.
14 – 15
0x0002 – 2
Định danh của attribute (attribute ID) $FILE_NAME là 2.


Đọc tiếp byte thứ 16 -> 19 để biết kích thước phần nội dung, 0x00000052 = 82 byte.

Đọc byte thứ 20 -> 21 để biết vị trí bắt đầu của phần nội dung, 0x0018 = 24, vậy phần nội dung sẽ được lưu bắt đầu từ byte thứ 24 tính từ đầu attribute.


Cấu trúc các trường của phần nội dung attribute $FILE_NAME được mô tả trong bảng sau.

Byte thứ
Giá trị hệ 16 – hệ 10
Mô tả
0 – 7
“05 00 00 00 00 00 05 00”
Địa chỉ MFT entry của thư mục cha (file reference).
8 – 15
0x01CF352F00BB73E4 – 130381390209053668
Thời gian tạo tập tin: Saturday, March 1, 2014 4:17:01AM UTC.
16 – 23
0x01CF352F00BB73E4 – 130381390209053668
Thời gian tập tin có thay đổi: Saturday, March 1, 2014 4:17:01AM UTC.
24 – 31
0x01CF352F00BB73E4 – 130381390209053668
Thời gian MFT entry có thay đổi: Saturday, March 1, 2014 4:17:01AM UTC.
32 – 39
0x01CF352F00BB73E4 – 130381390209053668
Thời gian truy cập tập tin mới nhất: Saturday, March 1, 2014 4:17:01AM UTC.
40 - 47
0x0000000000000000
Kích thước cấp phát cho tập tin. NTFS không sử dụng đến trường này, giá trị luôn là 0.
48 – 55
0x0000000000000000
Kích thước thật của tập tin. NTFS không sử dụng đến trường này, giá trị luôn là 0. Giá trị thật được lưu trong attribute $DATA.
56 – 59
0x00000020
Giá trị cờ báo, tập tin được đánh dấu là archive. (Xem thêm về giá trị và ý nghĩa của cờ đã đề cập trong phần attribute $STANDARD_INFORMATION).
60 – 63
“00 00 00 00”
Giá trị Reparse
64 – 64
0x08 – 8
Chiều dài của tên tập tin: 8 kí tự.
65 – 65
0x03 – 3
Giá trị cho biết định dạng tên tập tin (Namespace). Xem thêm bên dưới.
66+ (8)
“54 00 65 00 73 00 74 00”
Tên của tập tin: Test.txt

Bảng sau mô tả một số kiểu định dạng tên tập tin. 

Giá trị
Kiểu định dạng tên
Mô tả
0
POSIX
Tên có phân biệt chữ hoa, chữ thường. Cho phép sử dụng tất cả các kí tự Unicode ngoại trừ ‘/’ và NULL.
1
Win32
Tên có phân biệt chữ hoa, chữ thường. Cho phép sử dụng tất cả các kí tự Unicode ngoại trừ ‘/’, ‘\’, ‘ :’, ‘ >’, ‘<’ và ‘?’.
2
DOS
Tên không phân biệt chữ hoa, chữ thường, tất cả đều được chuyển sang dạng chữ hoa. Số kí tự của phần tên phải ít hơn hoặc bằng tám kí tự, phần mở rộng phải ít hơn hoặc bằng ba kí tự.
3
Win32 & DOS
Định dạng kép Win32 và DOS. Khi định dạng DOS có thể lưu đầy đủ tên tập tin rồi, thì mặc định hiểu là nó cũng được lưu ở định dạng Win32 mà không cần lưu ở hai định dạng riêng biệt.

 

Attribute $DATA


Attribute $DATA được sử dụng để lưu trữ tất cả các loại dữ liệu. Mã loại của attribute này là 128. Attribute $DATA không có kích thước cố định. Mỗi tập tin có thể gồm một hoặc nhiều attribute $DATA. Attribute $DATA đầu tiên không có tên, các attribute $DATA tiếp sau phải được đặt tên cụ thể.

Trong hệ thống Windows, attribute $DATA cũng được tạo thêm khi người dùng nhập thông tin vào mục “Summary” (chuột phải vào tập tin\ chọn properties\ Summary), được tạo thêm do trình anti-virus, hoặc được tạo thêm do chương trình sao lưu dự phòng…v.v.

Attribute $DATA có thể được mã hóa để đảm bảo an toàn thông tin. Khi được mã hóa, “cờ báo” trong header của attribute sẽ được thiết lập, “khóa” của quá trình mã hóa được lưu trong attribute $LOGGED_UTILITY_STREAM.

Hình 29 minh họa một tập tin với hai attribute $DATA đã được mã hóa.



Cấu trúc của attribute $DATA khá đơn giản. Sau phần header của attribute là phần nội dung, đây là dữ liệu ở dạng thô của một tập tin. Attribute $DATA không có kích thước tối thiểu và tối đa. Nếu kích thước phần nội dung vượt quá 700 byte, attribute sẽ được chuyển từ loại resident sang loại non-resident. Trong hầu hết các tập tin, attribute $DATA luôn nằm ở vị trí sau cùng trong MFT entry.

Phần sau đây trình bày quá trình đọc attribute $DATA, xem Hình 30.

Đọc header của attribute nằm kế sau attribute $FILE_NAME, gồm 16 byte. Xét mã loại,  byte 0 -> 3 có giá trị là  0x00000040 = 64, kết luận: đây là attribute $OBJECT_ID. Tính kích thước của attribute $OBJECT_ID để nhảy qua attribute kế tiếp, byte 4 –> 7 có giá trị là 0x00000028 =  40 byte.

Vậy ta sẽ bỏ qua 40 byte của attribute $OBJECT_ID, để đọc header của attribute kế tiếp.



Xét mã loại, byte 0 -> 3 có giá trị 0x00000080 = 128, kết luận: đây là attribute $DATA.

Bảng sau là nội dung header của attribute $DATA.

Byte thứ
Giá trị (Hệ 16 – Hệ 10)
Mô tả
0 – 3
0x00000080 – 128
Mã loại là 128
4 – 7
0x00000030 – 48
Kích thước của attribute $DATA là 48 byte
8 – 8
0x00 – 0
Attribute thuộc kiểu resident
9 – 9
0x00 – 0
Attribute này không được đặt tên, nên không có giá trị chiều dài của tên.
10 – 11
0x0018 – 24
Attribute này không được đặt tên, nhưng vẫn có thông tin về vị trí của tên?
12 – 13
0x0000 – 0
Giá trị cờ báo.
14 – 15
0x0001 – 1
Định danh của attribute (attribute ID) $DATA là 1.

Đọc tiếp byte thứ 16 -> 19 để biết kích thước phần nội dung, 0x00000015 = 21 byte.

Đọc byte thứ 20 -> 21 để biết vị trí bắt đầu của phần nội dung, 0x0018 = 24, tức là bắt đầu từ byte thứ 24 tính từ đầu attribute.

Nội dung của tập tin văn bản là “Du lieu dang van ban!”.

Cuối cùng, do chưa sử dụng hết 1024 byte của MTF entry, hệ thống sử dụng giá trị 0xFFFFFFFF để đánh dấu kết thúc phần nội dung của MFT entry.
-----------------------------
Tài liệu đã tham khảo:
Brian Carrie, File System Forensic Analysis, Addison Wesley Professional, 2005
-------------------
Cập nhật 2014/5/29
 ------------------
Đọc thêm
He thong quan ly tap tin NTFS - 1 - MBR
-----
Bạn muốn tự học HTML bài bản? Xem thêm

He thong quan ly tap tin NTFS - 8 - Attribute $STANDARD_INFORMATION

(Tiếp theo của He thong quan ly tap tin NTFS - 7 - Attribute)


Attribute $STANDARD_INFORMATION


Attribute $STANDARD_INFORMATION có trong tất cả các tập tin và thư mục, attribute này chứa một số thông tin quan trọng như: thời gian, ngày tháng, quyền sở hữu (ownership), phân quyền sử dụng (security), hạn ngạch đĩa (quota). Những thông tin này không cần thiết đối với việc lưu trữ tập tin, tuy nhiên, Windows rất cần đến nó trong các ứng dụng.

Mã loại (type ID) mặc định của attribute này là 16. Trong Windows 2000 và XP, attribute này có kích thước 72 byte, trong Windows NT là 48 byte, trong Windows 7 là 96 byte.

Hệ thống Windows luôn sắp xếp các attribute trong một MFT entry theo thứ tự tăng dần của mã loại. Do mã loại của attribute $STANDARD_INFORMATION có giá trị nhỏ nhất nên nó luôn nằm ở vị trí đầu tiên, ngay sau header của MFT entry.

Attribute này có bốn thông tin về thời gian, gồm:

-         Thời gian tạo tập tin (created).

-         Thời gian thay đổi mới nhất nội dung hai attribute $DATA hoặc $INDEX (Modified Time).

-         Thời gian thay đổi mới nhất thông tin mô tả tập tin (metadata). Thời gian này không được hiển thị cho người dùng (MFT Modified Time).

-         Thời gian truy cập nội dung tập tin mới nhất (Accessed Time).

Attribute này cũng chứa “cờ báo” (flag) cho biết thông tin về kiểu của tập tin: chỉ đọc (read only), tập tin hệ thống (system), thông tin liên quan đến việc lưu dự phòng (archive).

Với các MFT entry không phải là của tập tin hoặc thư mục, attribute $STANDARD_INFORMATION còn cung cấp thông tin về: nén, tập tin “thưa” (sparse) hoặc mã hóa (encrypted). Nếu là MFT entry của tập tin hoặc thư mục, các thông tin này sẽ được lưu trong header của MFT entry.

Trong các hệ thống NTFS phiên bản 3.0 về sau (Windows 2000, XP…v.v), attribute này có chứa thêm bốn thông tin gồm:

-         Thông tin về sở hữu (owner identity), được sử dụng trong việc tính hạn ngạch đĩa của mỗi người dùng.

-         Thông tin cho biết dung lượng của tập tin được tính vào hạn ngạch đĩa của người dùng.

-         Định danh bảo mật (Security ID), định danh này được sử dụng trong tập tin $Secure để xác định quyền truy cập tập tin.

-         Giá trị USN (update sequence number), hỗ trợ trong việc tìm kiếm hàng loạt các tập tin đã có thay đổi trong một khoảng thời gian nhất định.

Hình 27 là attribute $STANDARD_INFORMATION trong MFT entry của tập tin Test.txt.



Quan sát Hình 27, trong phần header của MFT entry, offset 0x14 -> 0x15 cho biết vị trí bắt đầu của các attribute, có giá trị là 0x0038 = 56.

Trong một MFT entry, các attribute được sắp xếp theo thứ tự tăng dần của mã loại (type ID). Attribute này có mã loại nhỏ nhất nên luôn luôn nằm ở vị trí đầu tiên.

Cấu trúc của attribute $STANDARD_INFORMATION được thể hiện ở bảng sau.

Byte thứ
Mô tả
0 – 15
Header của attribute $STANDARD_INFORMATION.
16 – 19
Kích thước phần nội dung của attribute $STANDARD_INFORMATION. 0x00000048 =  72 (byte).
20 – 21
Nơi bắt đầu (offset) của phần nội dung attribute $STANDARD_INFORMATION. 0x0018 = 24 (byte thứ 24 tính từ đầu attribute).

Bảng sau là nội dung header của attribute $STANDARD_INFORMATION.

Byte thứ
Giá trị (Hệ 16 – Hệ 10)
Mô tả
0 – 3
0x00000010 – 16
Mã loại là 16.
4 – 7
0x00000060 – 96
Kích thước của attribute $STANDARD_INFORMATION là 96 byte.
8 – 8
0x00 – 0
Attribute thuộc kiểu resident.
9 – 9
0x00 – 0
Attribute này không được đặt tên, nên không có giá trị chiều dài của tên.
10 – 11
0x0000 – 0
Attribute này không được đặt tên, nên không có thông tin về vị trí của tên.
12 – 13
0x0000 – 0
Giá trị cờ báo.
14 – 15
0x0000 – 0
Định danh của attribute (attribute ID) $STANDARD_INFORMATION là 0.

Phần nội dung của attribute $STANDARD_INFORMATION bắt đầu tại byte 24 (tính từ đầu attribute $STANDARD_INFORMATION), kích thước của phần nội dung là 72 byte.

Cấu trúc của phần nội dung attribute $STANDARD_INFORMATION được thể hiện ở bảng sau.

Byte thứ
Giá trị hệ 16 – Hệ 10
Mô tả
0 – 7
0x01CF 352F 00BB 73E4 -130381390209053668
Thời gian tạo tập tin: Saturday, March 1, 2014 4:17:01AM UTC.
8 – 15
0x01CF 352E EDCA 04D0 – 130381389891241168
Thời gian thay đổi mới nhất nội dung hai attribute $DATA hoặc $INDEX: Saturday, March 1, 2014 4:16:29AM UTC.
16 – 23
0x01CF 352F 0488 3354 – 130381390272803668
Thời gian thay đổi mới nhất thông tin mô tả tập tin: Saturday, March 1, 2014 4:17:07AM UTC.
24 – 31
0x01CF 352F 00BB 73E4 – 130381390209053668
Thời gian truy cập nội dung tập tin mới nhất: Saturday, March 1, 2014 4:17:01AM UTC.
32 – 35
0x00000020
Giá trị cờ báo, tập tin được đánh dấu là archive. (xem bảng về các giá trị của cờ ở bên dưới).
36 – 39
0x00000000
Maximum number of versions
40 – 43
0x00000000
Version number
44 – 47
0x00000000
Class ID
48 – 51
0x00000000
Định danh sở hữu - Owner ID (từ phiên bản 3.0 về sau).
52 – 55
0x000002D9
Định danh bảo mật - Security ID (từ phiên bản 3.0 về sau). Lưu ý: đây không phải là SID trong Windows.
56 – 63
0x00000000 00000000
Thông tin về hạn ngạch - Quota charged (từ phiên bản 3.0 về sau)
64 – 71
0x0000 0000 00BA EC10
Giá trị của USN (update sequence number) (từ phiên bản 3.0 về sau)

Giá trị về thời gian được biểu diễn bằng một số 64 bit, đây là kết quả của: (số nano giây tính từ thời điểm 1/1/1601 UTC)/100, hay nói cách khác, đây là số 100 nano giây tính từ thời điểm 1/1/1601 UTC. UTC là một thỏa hiệp viết tắt của Coordinated Universal Time, là giờ chuẩn quốc tế, tạm dịch là Giờ phối hợp quốc tế (wikipedia).

Ví dụ, thời gian tạo tập tin là: Saturday, March 1, 2014  4:17:01AM UTC sẽ được biểu diễn là: 0x01CF 352F 00BB 73E4, đổi ra hệ 10 là 130381390209053668 (trăm nano giây). Có thể sử dụng công cụ đổi tại website: www.silisoftware.com/tools/date.php.

Bảng sau là giá trị và ý nghĩa của cờ tại offset 32 –> 35.

Giá trị cờ
Ý nghĩa
0x0001
Chỉ đọc (read only).
0x0002
Ẩn (hidden).
0x0004
Thuộc hệ thống (system).
0x0020
Thông tin phục vụ việc lưu dự phòng. Tập tin được đánh dấu là archive.
0x0040
Thuộc thiết bị (Device).
0x0080
#Normal.
0x0100
Temporary.
0x0200
Tập tin ‘thưa’ - Spares file.
0x0400
Reparse point.
0x0800
Nén (compressed).
0x1000
Offline
0x2000
Nội dung không được tạo chỉ mục để tăng tốc độ tìm kiếm.
0x4000
Mã hóa (encrypted).
 
-----------------------------
Tài liệu đã tham khảo:
Brian Carrie, File System Forensic Analysis, Addison Wesley Professional, 2005
-------------------
Cập nhật 2014/5/29