<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Forensics on Roduygo | Blog</title><link>/categories/forensics/</link><description>Recent content in Forensics on Roduygo | Blog</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Fri, 08 May 2026 15:30:00 +0700</lastBuildDate><atom:link href="/categories/forensics/index.xml" rel="self" type="application/rss+xml"/><item><title>Phân tích NTFS</title><link>/post/ntfs/</link><pubDate>Fri, 08 May 2026 15:30:00 +0700</pubDate><guid>/post/ntfs/</guid><description>&lt;p&gt;Chào mừng các bạn quay trở lại với Series Giải phẫu Windows OS &amp;amp; SOC Analytics! Ở bài viết trước, chúng ta đã hiểu được bức tranh tổng thể về File System và &amp;ldquo;chiêu trò&amp;rdquo; giấu mã độc qua Alternate Data Streams (ADS).Hôm nay, chúng ta sẽ cầm kính lúp pháp y (Forensics) để soi vào tận cùng cấu trúc NTFS, bóc tách cuốn sổ cái MFT và trích xuất các &amp;ldquo;camera an ninh&amp;rdquo; ngầm của hệ thống.&lt;/p&gt;
&lt;h2 id="1-kiến-trúc-tổng-thể-của-ntfs-đường-đi-của-một-tệp-tin"&gt;1. Kiến trúc tổng thể của NTFS: Đường đi của một tệp tin
&lt;/h2&gt;&lt;p&gt;Để hiểu NTFS, trước tiên ta cần nắm được cách nó phân chia ổ đĩa. NTFS chia đĩa thành các Cluster (thường là 4KB). Ngay cả khi một file chỉ nặng 2KB, nó vẫn chiếm trọn 1 Cluster 4KB, phần dư thừa đó (Slack Space) không cho file khác dùng. Điều này giúp NTFS tăng tốc độ ghi đọc theo khối lớn và hỗ trợ điều tra dấu vết mã độc.&lt;/p&gt;
&lt;p&gt;Cấu trúc cốt lõi của một phân vùng NTFS bao gồm 4 phần chính:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Boot Sector:&lt;/strong&gt; Nằm ở phần đầu phân vùng, chứa Jump code để boot và vị trí của MFT.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MFT (Master File Table):&lt;/strong&gt; Cuốn sổ cái lưu trữ mọi thông tin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MFT Mirror ($MFTMirr):&lt;/strong&gt; Bản sao lưu một phần của MFT để phục hồi khi lỗi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Area:&lt;/strong&gt; Khu vực chứa nội dung dữ liệu thực sự của file.&lt;/li&gt;
&lt;/ul&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Luồng hoạt động khi bạn mở một tệp:&lt;/strong&gt; Hệ thống đọc Boot Sector -&amp;gt; Xác định vị trí MFT -&amp;gt; Đọc bản ghi (Record) của file trong MFT -&amp;gt; Tìm ra Cluster chứa dữ liệu -&amp;gt; Lấy dữ liệu từ Data Area.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="2-bóc-tách-trái-tim-mft-master-file-table"&gt;2. Bóc tách &amp;ldquo;Trái tim&amp;rdquo; MFT (Master File Table)
&lt;/h2&gt;&lt;p&gt;Trong NTFS, mọi thứ đều là một tệp, kể cả chính hệ thống tệp. MFT thực chất là một tệp đặc biệt có tên &lt;code&gt;$MFT&lt;/code&gt;. Cuốn sổ cái này được chia thành hàng nghìn bản ghi (MFT Records) có kích thước cố định. Mỗi tệp tin hoặc thư mục trên máy tính của bạn đều tương ứng với đúng 1 Record bên trong &lt;code&gt;$MFT&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="21-giải-phẫu-một-mft-record"&gt;2.1 Giải phẫu một MFT Record
&lt;/h3&gt;&lt;p&gt;Một bản ghi MFT chứa siêu dữ liệu (Metadata) cực kỳ chi tiết, bao gồm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Standard Information (Thông tin tiêu chuẩn):&lt;/strong&gt; Chứa các dấu thời gian (Timestamps), quyền hạn, và các cờ như Read-only, Hidden, System.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File Name:&lt;/strong&gt; Tên của tệp hoặc thư mục.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Attribute (Thuộc tính dữ liệu):&lt;/strong&gt; Đây là phần thú vị nhất. Nếu file của bạn cực nhỏ (dưới vài trăm byte), NTFS sẽ nhét thẳng nội dung của file đó vào bên trong MFT Record (gọi là Resident Data). Nếu file lớn, phần này sẽ chứa danh sách các con trỏ (Data Runs) trỏ ra các Cluster ngoài Data Area (gọi là Non-Resident Data).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security Descriptor:&lt;/strong&gt; Chứa danh sách kiểm soát truy cập (ACL) quy định ai được phép đọc/ghi file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="mft record structure" class="gallery-image" data-flex-basis="584px" data-flex-grow="243" height="246" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="/post/ntfs/mftf.png" width="599"&gt;&lt;/p&gt;
&lt;h3 id="22-góc-nhìn-điều-tra-số"&gt;2.2 Góc nhìn Điều tra số
&lt;/h3&gt;&lt;p&gt;MFT là &amp;ldquo;mỏ vàng&amp;rdquo; vì những lý do sau:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cờ In Use:&lt;/strong&gt; Xác định xem bản ghi này đang chứa một file hoạt động hay file đã bị xóa. Khi bạn xóa một file, dữ liệu trên đĩa chưa mất đi, NTFS chỉ đổi cờ In Use thành &amp;ldquo;chưa sử dụng&amp;rdquo;. Do đó, các tệp bị xóa vẫn tồn tại bản ghi trong MFT, hỗ trợ việc khôi phục dữ liệu (Carving).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Số thứ tự (Sequence Number):&lt;/strong&gt; Bộ đếm tăng lên khi một bản ghi MFT được sử dụng lại cho file khác, giúp phân biệt file cũ và mới trên cùng một mục nhập.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phân tích Dòng thời gian (Timeline):&lt;/strong&gt; MFT lưu trọn bộ 4 mốc thời gian MACB: Modified (Sửa đổi nội dung), Accessed (Truy cập cuối), Created (Tạo lập), và MFT Record Modified (Sửa đổi siêu dữ liệu). Đây là bằng chứng thép để tái tạo trình tự sự kiện của mã độc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bạn có thể dùng công cụ &lt;code&gt;MFTECmd.exe&lt;/code&gt; của Eric Zimmerman để trích xuất &lt;code&gt;$MFT&lt;/code&gt; ra file CSV và đọc bằng Timeline Explorer:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmd" data-lang="cmd"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#75715e"&gt;: Lệnh trích xuất và phân tích file $MFT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MFTECmd.exe -f C:\Evidence\$MFT --csv C:\Evidence --csvf MFT_record.csv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3-camera-an-ninh-của-ntfs-logfile-và-usn-journal"&gt;3. &amp;ldquo;Camera an ninh&amp;rdquo; của NTFS: $LogFile và USN Journal
&lt;/h2&gt;&lt;p&gt;Khi mã độc hoạt động, nó thường tạo file, ghi dữ liệu, rồi xóa ngay lập tức để phi tang dấu vết. Tuy nhiên, mọi hành động này đều bị hai &amp;ldquo;camera an ninh&amp;rdquo; của NTFS ghi lại trọn vẹn.&lt;/p&gt;
&lt;h3 id="31-logfile-nhật-ký-giao-dịch"&gt;3.1 $LogFile (Nhật ký giao dịch)
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;$LogFile&lt;/code&gt; là một tệp siêu dữ liệu đặc biệt ghi lại mọi thay đổi (tạo, xóa, sửa tệp) trước khi chúng được ghi chính thức xuống đĩa. Chức năng gốc của nó là để hệ thống có thể &amp;ldquo;phát lại&amp;rdquo; (replay) các giao dịch và khôi phục tính nhất quán nếu máy tính bị sập nguồn đột ngột.&lt;/p&gt;
&lt;h3 id="32-usnjrnl-update-sequence-number-journal"&gt;3.2 $USNJrnl (Update Sequence Number Journal)
&lt;/h3&gt;&lt;p&gt;Nếu &lt;code&gt;$LogFile&lt;/code&gt; phục vụ cho hệ thống, thì USN Journal là bản ghi lịch sử tuyệt vời dành cho các dịch vụ theo dõi và giám sát. Nó nằm ẩn trong thư mục &lt;code&gt;$Extend\$UsnJrnl&lt;/code&gt; ở thư mục gốc.&lt;/p&gt;
&lt;p&gt;Đặc biệt, &lt;code&gt;$USNJrnl&lt;/code&gt; bao gồm thành phần chính là &lt;code&gt;$J&lt;/code&gt;, nơi lưu trữ các bản ghi thay đổi thực tế. Đáng chú ý, &lt;code&gt;$J&lt;/code&gt; được Windows triển khai dưới dạng một luồng dữ liệu ẩn Alternate Data Stream (ADS) – chính là kỹ thuật chúng ta đã phân tích ở bài số 4!&lt;/p&gt;
&lt;p&gt;Khi phân tích file &lt;code&gt;$J&lt;/code&gt; (bằng &lt;code&gt;MFTECmd&lt;/code&gt;), chúng ta sẽ thấy các mã sự kiện (Update Reasons) &amp;ldquo;tố cáo&amp;rdquo; mã độc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;USN_REASON_FILE_CREATE&lt;/code&gt;: Tệp mã độc mới được tạo.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;USN_REASON_DATA_OVERWRITE&lt;/code&gt;: Dữ liệu trong tệp đã bị ghi đè.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;USN_REASON_FILE_DELETE&lt;/code&gt;: Tệp mã độc vừa tự xóa chính nó.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;USN_REASON_RENAME_OLD_NAME&lt;/code&gt;: Tệp tin bị đổi tên (thường thấy trong các vụ tấn công Ransomware đổi đuôi file).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="4-khám-phá-góc-khuất-i30-ntfs-index-allocation"&gt;4. Khám phá góc khuất $I30 (NTFS Index Allocation)
&lt;/h2&gt;&lt;p&gt;Để truy tìm dấu vết của các tệp tin đã bị xóa bốc hơi hoàn toàn khỏi MFT, các chuyên gia Forensics sẽ tìm đến một thuộc tính ẩn khác gọi là &lt;code&gt;$I30&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Thuộc tính &lt;code&gt;$I30&lt;/code&gt; là một chỉ mục (Index) thư mục, có nhiệm vụ duy trì cấu trúc sắp xếp các tệp và thư mục con bên trong một ổ đĩa NTFS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Góc nhìn Forensics:&lt;/strong&gt; Khi một tệp bị xóa, đổi tên hoặc di chuyển sang thư mục khác, tên của tệp đó sẽ bị gạch bỏ khỏi chỉ mục hoạt động của &lt;code&gt;$I30&lt;/code&gt;. Tuy nhiên, dữ liệu văn bản chứa tên tệp đó vẫn còn sót lại trong vùng không gian trống (Slack Space) của tệp &lt;code&gt;$I30&lt;/code&gt; cho đến khi bị ghi đè. Bằng cách quét vùng không gian Slack Space này, chúng ta có thể chứng minh được sự tồn tại trong quá khứ của một công cụ hack hoặc một tệp tin dữ liệu nhạy cảm mà kẻ tấn công tưởng chừng đã xóa sạch không tì vết.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Qua bài viết này, chúng ta đã đi sâu vào tận cùng các khối cấu trúc tĩnh của hệ thống tệp NTFS. Bằng cách kết hợp phân tích MFT, USN Journal và chỉ mục $I30, không một hành vi tạo, xóa hay sửa đổi tệp tin nào của mã độc có thể qua mắt được bạn. Ở bài viết tiếp theo, chúng sẽ chuyển sang một lĩnh vực đầy tính động và cực kỳ hấp dẫn: Giải phẫu Windows Registry và các điểm neo duy trì sự hiện diện của Malware. Đừng bỏ lỡ nhé!&lt;/em&gt;&lt;/p&gt;</description></item><item><title>File System - NTFS, FAT32 và ADS</title><link>/post/file-system-ads/</link><pubDate>Fri, 08 May 2026 11:30:00 +0700</pubDate><guid>/post/file-system-ads/</guid><description>&lt;p&gt;Ở các bài viết trước, chúng ta đã &amp;ldquo;mổ xẻ&amp;rdquo; quá trình khởi động và đọc hiểu cấu trúc phân vùng ổ cứng ở mức vật lý. Nhưng khi hệ điều hành đã lên, làm sao nó biết tệp tin &lt;code&gt;malware.exe&lt;/code&gt; nằm ở đâu giữa hàng tỷ byte dữ liệu hỗn độn? Hôm nay, chúng ta sẽ bước vào thế giới của Hệ thống tệp (File System) – người quản lý kho vĩ đại của hệ điều hành, và khám phá những góc khuất mà hacker thường lợi dụng để ẩn mình.&lt;/p&gt;
&lt;h2 id="1-hệ-thống-tệp-file-system-thực-chất-là-gì"&gt;1. Hệ thống tệp (File System) thực chất là gì?
&lt;/h2&gt;&lt;p&gt;Nếu bạn tưởng tượng ổ cứng vật lý là một cái kho chứa khổng lồ trống rỗng, thì Tệp (File) chính là những thùng hàng chứa đồ đạc. Vậy Hệ thống tệp (File System) là gì? Nó chính là thủ kho và bộ sổ sách quản lý. Thủ kho sẽ quyết định thùng hàng này đặt ở kệ nào, ghi chú vào sổ để khi bạn cần, họ có thể lấy ra ngay lập tức.&lt;/p&gt;
&lt;p&gt;Về mặt kỹ thuật, đĩa vật lý chia thành các Sector (đơn vị lưu trữ nhỏ nhất, thường là 512 byte). Tuy nhiên, để quản lý dễ dàng hơn, hệ điều hành gom các Sector lại thành các Cluster (Liên cung). Một Cluster là &amp;ldquo;đơn vị thuê đất&amp;rdquo; nhỏ nhất; một tệp dù chỉ chứa 1 chữ cái cũng sẽ được cấp ít nhất 1 Cluster.&lt;/p&gt;
&lt;p&gt;Nếu không có Hệ thống tệp, dữ liệu trên ổ cứng sẽ chỉ là một khối bit khổng lồ không có điểm bắt đầu hay kết thúc.&lt;/p&gt;
&lt;h2 id="2-fat32-kẻ-lỗi-thời-nhưng-không-thể-thay-thế"&gt;2. FAT32: Kẻ lỗi thời nhưng không thể thay thế
&lt;/h2&gt;&lt;p&gt;FAT32 (File Allocation Table 32-bit) ra đời từ thời Windows 95 để thay thế cho FAT16, sử dụng 28-bit để đánh số Cluster. Mặc dù đã cũ, nó vẫn được dùng rất phổ biến trên USB, thẻ nhớ máy ảnh và các thiết bị IoT vì tính tương thích cao với mọi hệ điều hành.&lt;/p&gt;
&lt;h3 id="21-kiến-trúc-cốt-lõi-của-fat32"&gt;2.1 Kiến trúc cốt lõi của FAT32
&lt;/h3&gt;&lt;p&gt;Một phân vùng FAT32 được chia làm 3 vùng chính:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reserved Region (Vùng lưu trữ):&lt;/strong&gt; Chứa Boot Sector (Sector 0) lưu các tham số cấu hình BIOS (BPB) và FSInfo (Sector 1) lưu số lượng Cluster còn trống.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FAT Region (Vùng bảng FAT):&lt;/strong&gt; Cuốn &amp;ldquo;mục lục&amp;rdquo; khổng lồ của ổ đĩa. Nó chứa Bảng cấp phát tệp (thường có FAT1 và bản dự phòng FAT2) ghi lại tệp nào nằm ở Cluster nào và Cluster tiếp theo là gì.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Region (Vùng dữ liệu):&lt;/strong&gt; Nơi chứa nội dung thực sự của các tệp và Thư mục gốc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Cơ chế nối xích (Cluster Chain):&lt;/strong&gt; Khi bạn lưu một file nặng 10KB vào đĩa có Cluster 4KB, file sẽ bị cắt làm 3 phần. Bảng FAT sẽ ghi lại mối liên kết: &amp;ldquo;Cluster A trỏ tới B&amp;rdquo;, &amp;ldquo;Cluster B trỏ tới C&amp;rdquo;, và &amp;ldquo;Cluster C là kết thúc (EOF)&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="22-những-giới-hạn-huyền-thoại-và-dấu-vết-forensics"&gt;2.2 Những giới hạn &amp;ldquo;huyền thoại&amp;rdquo; và Dấu vết Forensics
&lt;/h3&gt;&lt;p&gt;Điểm yếu chí mạng của FAT32 là nó chỉ hỗ trợ kích thước file tối đa 4GB và Windows mặc định chỉ cho tạo phân vùng tối đa 32GB. Ngoài ra, nó không hỗ trợ tính năng phân quyền bảo mật (như NTFS), ai cắm USB vào cũng có thể đọc được file.&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;Góc nhìn Forensics:&lt;/strong&gt; Khi một tệp bị xóa trên FAT32, hệ thống không hề xóa dữ liệu thực sự. Nó chỉ đổi ký tự đầu tiên của tên tệp thành mã Hex &lt;code&gt;0xE5&lt;/code&gt; để báo hiệu rằng vùng nhớ đó đã &amp;ldquo;được giải phóng&amp;rdquo;. Bằng các công cụ chuyên dụng (như Autopsy), SOC Analyst hoàn toàn có thể khôi phục lại (Carving) các tệp tin mã độc đã bị hacker vội vàng xóa đi.&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="3-ntfs-kẻ-kế-thừa-mạnh-mẽ-và-phức-tạp"&gt;3. NTFS: Kẻ kế thừa mạnh mẽ và phức tạp
&lt;/h2&gt;&lt;p&gt;Để đáp ứng nhu cầu bảo mật và lưu trữ khổng lồ, Windows hiện đại chuyển sang dùng NTFS (New Technology File System). NTFS vượt qua giới hạn 4GB, hỗ trợ phân quyền truy cập (ACLs), nén file và đặc biệt là khả năng tự phục hồi nhờ tính năng Nhật ký (Journaling).&lt;/p&gt;
&lt;p&gt;Cấu trúc NTFS bao gồm: Boot Sector, MFT (Master File Table), MFT Mirror (bản sao dự phòng), và Vùng dữ liệu (Data Area).&lt;/p&gt;
&lt;h3 id="31-trái-tim-mft-master-file-table"&gt;3.1 &amp;ldquo;Trái tim&amp;rdquo; MFT (Master File Table)
&lt;/h3&gt;&lt;p&gt;MFT là một tệp đặc biệt có tên &lt;code&gt;$MFT&lt;/code&gt;. Trong NTFS, mọi thứ đều là một tệp, kể cả chính hệ thống tệp! Mỗi tệp, thư mục trên ổ đĩa đều có một bản ghi (Record) tương ứng bên trong MFT.&lt;/p&gt;
&lt;p&gt;Bản ghi MFT chứa siêu dữ liệu cực kỳ chi tiết: Tên tệp, quyền truy cập, dấu thời gian (MACB - Modified, Accessed, Created, Birth), và con trỏ trỏ đến vị trí Cluster chứa dữ liệu thực sự. Nếu một tệp có kích thước cực nhỏ, nội dung của nó thậm chí được lưu trực tiếp ngay bên trong bản ghi MFT (Resident Data)!&lt;/p&gt;
&lt;h3 id="32-camera-an-ninh-journaling-logfile-và-usnjrnl"&gt;3.2 &amp;ldquo;Camera an ninh&amp;rdquo; Journaling ($LogFile và $USNJrnl)
&lt;/h3&gt;&lt;p&gt;Đây là &amp;ldquo;mỏ vàng&amp;rdquo; cho Blue Team khi điều tra dấu vết mã độc:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;$LogFile&lt;/code&gt;:&lt;/strong&gt; Ghi lại mọi thay đổi siêu dữ liệu (tạo, xóa, sửa tệp) trước khi chúng được ghi xuống đĩa, giúp hệ thống khôi phục tính nhất quán nếu bị sập nguồn.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;$USNJrnl&lt;/code&gt; (Update Sequence Number Journal):&lt;/strong&gt; Nằm trong thư mục &lt;code&gt;$Extend&lt;/code&gt;, nó cung cấp bản ghi lịch sử mọi hoạt động của tệp tin. Nếu mã độc tạo một file rồi xóa ngay lập tức để phi tang, &lt;code&gt;$USNJrnl&lt;/code&gt; (cụ thể là luồng dữ liệu &lt;code&gt;$J&lt;/code&gt;) vẫn lưu lại mã sự kiện &lt;code&gt;USN_REASON_FILE_CREATE&lt;/code&gt; và &lt;code&gt;USN_REASON_FILE_DELETE&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="USNJrn;" class="gallery-image" data-flex-basis="1074px" data-flex-grow="447" height="149" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="/post/file-system-ads/image.png" width="667"&gt;&lt;/p&gt;
&lt;h2 id="4-alternate-data-streams-ads---kỹ-thuật-ẩn-mình-của-mã-độc"&gt;4. Alternate Data Streams (ADS) - Kỹ thuật ẩn mình của Mã độc
&lt;/h2&gt;&lt;p&gt;Cuối cùng, chúng ta sẽ đề cập đến góc khuất nguy hiểm nhất của NTFS: Alternate Data Streams (ADS).&lt;/p&gt;
&lt;p&gt;Theo thiết kế ban đầu, ADS là một tính năng ẩn giúp một tệp tin NTFS có thể chứa nhiều luồng dữ liệu (streams) khác nhau. Luồng chính chứa nội dung mà chúng ta nhìn thấy, trong khi luồng phụ chứa các siêu dữ liệu. Điển hình nhất, Windows dùng luồng &lt;code&gt;Zone.Identifier&lt;/code&gt; để đánh dấu các tệp được tải về từ Internet nhằm hiển thị cảnh báo bảo mật.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kỹ thuật giấu mã độc (Hide Payload):&lt;/strong&gt; Hacker nhận ra rằng luồng phụ của ADS có thể chứa một lượng dữ liệu bất kỳ mà dung lượng file hiển thị bên ngoài trong File Explorer không hề thay đổi. Chúng có thể đính kèm một mã độc nặng hàng chục Megabyte vào đằng sau một tệp &lt;code&gt;.txt&lt;/code&gt; vô hại nặng vài Kilobyte!&lt;/p&gt;
&lt;h3 id="41-thực-hành-tạo-và-phát-hiện-ads"&gt;4.1 Thực hành tạo và phát hiện ADS
&lt;/h3&gt;&lt;p&gt;Bạn có thể tự tay tạo một luồng ADS bằng lệnh Command Prompt rất đơn giản:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmd" data-lang="cmd"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#75715e"&gt;: Nhét dòng chữ &amp;#34;hiden&amp;#34; vào luồng phụ mang tên &amp;#34;hiden&amp;#34; đằng sau tệp hiddendata.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;notepad hiddendata.txt:hiden
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#75715e"&gt;: Nhét toàn bộ nội dung của tệp hinhconmeo.jpg vào luồng ADS của file hiddendata.txt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; hinhconmeo.jpg &amp;gt; hiddendata.txt:hinhmeo.jpg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Để phát hiện mã độc đang lẩn trốn trong ADS, lệnh &lt;code&gt;dir&lt;/code&gt; thông thường sẽ hoàn toàn vô dụng. Bạn bắt buộc phải thêm tham số &lt;code&gt;/r&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmd" data-lang="cmd"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;:&lt;span style="color:#75715e"&gt;: Kiểm tra các tệp có chứa luồng dữ liệu ẩn (ADS)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;dir&lt;/span&gt; /r
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Khi chạy lệnh này, bạn sẽ thấy kết quả hiển thị dạng &lt;code&gt;&amp;lt;Tên_tệp&amp;gt;:&amp;lt;Tên_luồng&amp;gt;:$DATA&lt;/code&gt; (ví dụ: &lt;code&gt;hiddendata.txt:hiden:$DATA&lt;/code&gt;), bóc trần hoàn toàn vị trí ẩn náu của tệp tin độc hại.&lt;/p&gt;
&lt;h2 id="ads-hidden-file"&gt;&lt;img alt="ADS hidden file" class="gallery-image" data-flex-basis="472px" data-flex-grow="196" height="338" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="/post/file-system-ads/ads.png" width="665"&gt;
&lt;/h2&gt;&lt;p&gt;&lt;em&gt;Tóm lại, hiểu thấu bề mặt cấu trúc File System không chỉ giúp chúng ta biết máy tính lưu trữ dữ liệu ra sao, mà còn cung cấp bộ công cụ tối thượng để săn lùng các đoạn mã độc cố tình bị xóa hoặc bị che giấu tinh vi. Trong bài viết tiếp theo, chúng sẽ chuyển hướng sang một khu vực nhạy cảm không kém: Giải phẫu &amp;ldquo;Bộ não&amp;rdquo; cấu hình Windows Registry và các điểm neo duy trì sự hiện diện của Malware. Các bạn nhớ đón đọc nhé!&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Giải phẫu ổ cứng (Forensics)</title><link>/post/giai-phau-o-cung-forensics/</link><pubDate>Thu, 07 May 2026 16:40:00 +0700</pubDate><guid>/post/giai-phau-o-cung-forensics/</guid><description>&lt;p&gt;Ở bài viết trước, chúng ta đã đi qua bức tranh tổng thể của quá trình khởi động. Nhưng đối với một nhà phân tích SOC hay chuyên gia điều tra số (Forensics), &amp;ldquo;nhìn thấy&amp;rdquo; hệ điều hành khởi động là chưa đủ. Chúng ta cần phải nhìn thấu vào từng Byte, từng khối Hex trên mặt đĩa vật lý để biết hacker đang giấu gì. Hôm nay, hãy cùng mình mở công cụ HxD lên và đi sâu vào giải phẫu MBR, GPT, đồng thời thực hành một kịch bản &amp;ldquo;cứu hộ&amp;rdquo; kinh điển: Khôi phục MBR bị mã độc phá hủy.&lt;/p&gt;
&lt;h2 id="1-mbr-master-boot-record-dưới-lăng-kính-hex"&gt;1. MBR (Master Boot Record) dưới lăng kính Hex
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;💡 &lt;strong&gt;Nhắc lại kiến thức:&lt;/strong&gt; Ở bài viết trước, chúng ta đã tìm hiểu về cấu trúc 512 byte chật chội của MBR (gồm 446 byte Bootstrap, 64 byte Bảng phân vùng và 2 byte Chữ ký). Nếu bạn chưa nắm rõ phần này, hãy xem lại bài viết &lt;strong&gt;&lt;a class="link" href="/p/windows-booting/" &gt;Khởi nguồn hệ thống - Windows Booting&lt;/a&gt;&lt;/strong&gt; trước khi đi tiếp nhé!&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="Ví dụ về một bảng phân vùng" class="gallery-image" data-flex-basis="1510px" data-flex-grow="629" height="109" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="/post/giai-phau-o-cung-forensics/bangphanvung.png" width="686"&gt;&lt;/p&gt;
&lt;h3 id="11-giải-mã-16-byte-của-bảng-phân-vùng-partition-table"&gt;1.1 Giải mã 16 Byte của Bảng phân vùng (Partition Table)
&lt;/h3&gt;&lt;p&gt;Nhìn vào 16 byte của một phân vùng trong HxD, làm sao ta đọc hiểu được nó? Hãy lấy ví dụ một chuỗi Hex chuẩn của phân vùng khởi động:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;80 20 21 00 07 FE FF FF 00 08 00 00 00 B0 23 03
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Đây là cách chúng ta hiểu nó:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chỉ báo khởi động (Byte 1 - 80):&lt;/strong&gt; Giá trị &lt;code&gt;80&lt;/code&gt; nghĩa là phân vùng này có thể khởi động được (Active/Bootable). Nếu là &lt;code&gt;00&lt;/code&gt; thì đây chỉ là ổ chứa dữ liệu bình thường.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Địa chỉ CHS bắt đầu (Byte 2,3,4 - 20 21 00):&lt;/strong&gt; Tọa độ vật lý (Cylinder-Head-Sector) bắt đầu của đĩa. Ngày nay, thông số này không còn quá quan trọng.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mã hệ thống tệp (Byte 5 - 07):&lt;/strong&gt; Giá trị &lt;code&gt;07&lt;/code&gt; khẳng định đây là phân vùng định dạng NTFS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Địa chỉ CHS kết thúc (Byte 6,7,8 - FE FF FF):&lt;/strong&gt; Tọa độ vật lý kết thúc của phân vùng.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Địa chỉ LBA bắt đầu (Byte 9,10,11,12 - 00 08 00 00):&lt;/strong&gt; Tọa độ logic bắt đầu. Do Windows dùng định dạng Little-Endian (byte thấp đứng trước), ta phải đọc ngược lại thành &lt;code&gt;00 00 08 00&lt;/code&gt;. Đổi chuỗi Hex &lt;code&gt;0800&lt;/code&gt; ra hệ thập phân ta được 2048. Nhân với 512 byte/sector, ta biết phân vùng này bắt đầu tại Offset &lt;code&gt;1048576&lt;/code&gt; trên ổ cứng.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kích thước phân vùng (Byte 13,14,15,16 - 00 B0 23 03):&lt;/strong&gt; Đọc ngược Little-Endian thành &lt;code&gt;03 23 B0 00&lt;/code&gt;. Chuyển sang thập phân là 52,670,464 sectors. Nhân với 512 byte, ta tính ra phân vùng này nặng khoảng 26,967,277,568 bytes (xấp xỉ 26.9 GB).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Mẹo thực hành:&lt;/strong&gt; Trong HxD, bạn có thể bấm &lt;code&gt;Ctrl + G&lt;/code&gt; (Go to), nhập giá trị thập phân &lt;code&gt;1048576&lt;/code&gt; vào ô Offset để nhảy thẳng đến vị trí bắt đầu của hệ điều hành.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Nhớ chọn dec để di chuyển đến vị trí offset" class="gallery-image" data-flex-basis="237px" data-flex-grow="98" height="266" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="/post/giai-phau-o-cung-forensics/goto.png" width="263"&gt;&lt;/p&gt;
&lt;h2 id="2-thử-khôi-phục-mbr-bị-xóa"&gt;2. Thử khôi phục MBR bị xóa
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Kịch bản sự cố:&lt;/strong&gt; Máy chủ cơ sở dữ liệu quan trọng đột nhiên không thể khởi động. Điều tra cho thấy một nhân viên đã vô tình mở email chứa mã độc. Hệ thống bị ép khởi động lại và báo lỗi &amp;ldquo;Operating System not found&amp;rdquo;. Mọi nghi ngờ đổ dồn vào một Bootkit đã phá hủy MBR.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tiến hành phân tích:&lt;/strong&gt; Khi load file Image của ổ cứng nạn nhân vào HxD và soi vào Sector 0, ta phát hiện một điểm chí mạng: Ở Offset &lt;code&gt;000001F0&lt;/code&gt; (cuối Sector 0), thay vì kết thúc bằng chữ ký chuẩn &lt;code&gt;55 AA&lt;/code&gt;, nó lại chứa toàn &lt;code&gt;00 00&lt;/code&gt;. Không có chữ ký này, BIOS không công nhận đây là một ổ đĩa hợp lệ!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cách khôi phục:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Dò tìm VBR (Volume Boot Record):&lt;/strong&gt; Dù MBR bị xóa, nhưng phân vùng chứa hệ điều hành vẫn còn. Theo tiêu chuẩn mặc định của Windows, phân vùng đầu tiên (LBA bắt đầu) thường nằm ở Sector 2048.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Xác nhận:&lt;/strong&gt; Di chuyển tới Sector 2048. Nếu ta nhìn thấy chuỗi chữ ký NTFS hoặc thông điệp lỗi dạng &lt;code&gt;A disk read error occurred... NTLDR is missing&lt;/code&gt;, thì xin chúc mừng, dữ liệu chưa hề mất.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tái tạo:&lt;/strong&gt; Bằng các công cụ chuyên dụng (như Bootrec.exe hoặc TestDisk), ta có thể ghi lại 446 byte mã khởi động và chèn lại chữ ký &lt;code&gt;55 AA&lt;/code&gt; vào vị trí cũ, cứu sống hoàn toàn máy chủ mà không làm mất một bit dữ liệu nào.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="3-sự-tiến-hóa-mang-tên-gpt-guid-partition-table"&gt;3. Sự tiến hóa mang tên GPT (GUID Partition Table)
&lt;/h2&gt;&lt;p&gt;MBR có giới hạn chí mạng: Nó chỉ hỗ trợ tối đa 4 phân vùng và không thể quản lý dung lượng đĩa quá 2 Terabytes. Để đáp ứng các server khổng lồ, UEFI và GPT (hỗ trợ lên đến 9 Zettabyte, 128 phân vùng) ra đời.&lt;/p&gt;
&lt;p&gt;Để đảm bảo tương thích ngược và tránh việc các công cụ định dạng cũ tưởng nhầm đĩa GPT là đĩa trắng rồi &amp;ldquo;vô tình&amp;rdquo; ghi đè, GPT tạo ra một lớp giáp gọi là Protective MBR (MBR bảo vệ).&lt;/p&gt;
&lt;h3 id="31-mbr-bảo-vệ-protective-mbr"&gt;3.1 MBR Bảo vệ (Protective MBR)
&lt;/h3&gt;&lt;p&gt;Nó vẫn nằm ở Sector 0. Cấu trúc của nó y hệt MBR cũ, chứa đủ &lt;code&gt;55 AA&lt;/code&gt; ở cuối, nhưng bảng phân vùng của nó chỉ khai báo đúng 1 phân vùng duy nhất, chiếm toàn bộ đĩa đệm với mã loại (Type) là &lt;code&gt;EE&lt;/code&gt;. Mã &lt;code&gt;EE&lt;/code&gt; là tín hiệu để các hệ thống cũ lùi lại: &amp;ldquo;Đây là đĩa GPT, đừng có đụng vào!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Một gpt bình thường" class="gallery-image" data-flex-basis="272px" data-flex-grow="113" height="590" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="/post/giai-phau-o-cung-forensics/gpt.png" width="671"&gt;&lt;/p&gt;
&lt;h2 id="4-giải-phẫu-gpt-header-và-partition-entry-array"&gt;4. Giải phẫu GPT Header và Partition Entry Array
&lt;/h2&gt;&lt;p&gt;Với GPT, mọi thứ thực sự bắt đầu từ Sector 1 và Sector 2.&lt;/p&gt;
&lt;h3 id="41-gpt-header-sector-1"&gt;4.1 GPT Header (Sector 1)
&lt;/h3&gt;&lt;p&gt;&lt;img alt="gpt header" class="gallery-image" data-flex-basis="1470px" data-flex-grow="612" height="110" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="/post/giai-phau-o-cung-forensics/header.png" width="674"&gt;&lt;/p&gt;
&lt;p&gt;GPT Header chiếm 92 byte đầu tiên của Sector 1. Khi nhìn vào Hex, bạn sẽ thấy nó cực kỳ rõ ràng:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Chữ ký (8 Byte đầu):&lt;/strong&gt; Luôn là &lt;code&gt;45 46 49 20 50 41 52 54&lt;/code&gt; (Dịch ra mã ASCII là &amp;ldquo;EFI PART&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bảo vệ toàn vẹn (CRC32):&lt;/strong&gt; GPT lưu mã Hash CRC32 của chính nó. Nếu mã độc sửa đổi dù chỉ 1 byte trong Header, CRC32 sẽ thay đổi, UEFI sẽ lập tức phát hiện và báo lỗi.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LBA dự phòng (Backup LBA):&lt;/strong&gt; Một tính năng tuyệt vời của GPT! Nó khai báo vị trí của một bản sao lưu GPT Header ở tít tận Sector cuối cùng của ổ đĩa. Nếu Header chính bị mã độc phá, ta vẫn có thể dùng bản Backup để hồi sinh hệ thống.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="42-partition-entry-array-mảng-phân-vùng---sector-2-trở-đi"&gt;4.2 Partition Entry Array (Mảng phân vùng - Sector 2 trở đi)
&lt;/h3&gt;&lt;p&gt;GPT hỗ trợ quản lý tới 128 phân vùng, mỗi phân vùng được cấp hẳn 128 Byte để lưu trữ thông tin (thay vì 16 byte chật hẹp như MBR).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Một Partition Entry trong GPT chứa gì?&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GUID Loại Phân vùng (16 byte):&lt;/strong&gt; Định danh loại phân vùng. Đặc biệt, nó được lưu dưới dạng Mixed-Endian (Trộn lẫn giữa Little-Endian và Big-Endian). 3 khối byte đầu phải đọc ngược, trong khi 2 khối sau giữ nguyên.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GUID Phân vùng duy nhất (16 byte):&lt;/strong&gt; Căn cước công dân (ID) riêng biệt cho từng phân vùng đĩa.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LBA Bắt đầu &amp;amp; Kết thúc (16 byte):&lt;/strong&gt; Vị trí chính xác của phân vùng.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tên Phân vùng (72 byte):&lt;/strong&gt; Được lưu dưới định dạng chuỗi UTF-16. Nếu ném đoạn Hex này vào tool convert, ta sẽ thấy rõ ràng các tên như &amp;ldquo;Basic data partition&amp;rdquo; hay &amp;ldquo;EFI system partition&amp;rdquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Đặc biệt, hệ điều hành sẽ không boot từ một phân vùng chung chung nữa. Mọi file Bootloader (các file &lt;code&gt;.efi&lt;/code&gt;) đều phải được đặt gọn gàng trong một khu vực riêng gọi là Phân vùng hệ thống EFI (ESP). Mã độc muốn can thiệp quá trình Boot trên máy UEFI buộc phải tìm cách chui lọt qua Secure Boot và ghi dữ liệu vào phân vùng ESP này.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Việc đọc hiểu mã Hex của ổ cứng giúp các SOC và Forensics không bị phụ thuộc vào các công cụ tự động. Khi hệ thống sụp đổ hoặc mã độc ẩn mình dưới lớp vỏ bọc, chính những byte dữ liệu thô này sẽ nói cho chúng ta biết sự thật. Ở bài viết tới, chúng ta sẽ bắt tay vào phân tích sâu hơn hệ thống tệp NTFS và kỹ thuật giấu file bằng Alternate Data Streams. Hẹn gặp lại các bạn!&lt;/em&gt;&lt;/p&gt;</description></item></channel></rss>