過去的文件隱寫術:直接將數據隱藏在扇區中

簡短的序言

如果有人不記得的話,隱寫術正在將資訊隱藏在某些容器中。 例如,在圖片中(討論過 這裡 и 這裡)。 您還可以隱藏檔案系統的服務表中的資料(這是關於 這裡), 乃至 TCP協定服務報文中。 不幸的是,所有這些方法都有一個缺點:為了在不知不覺中將訊息「插入」到容器中,您需要巧妙的演算法來考慮容器內部結構的特殊性。 容器的抗操作性會出現問題:例如,如果稍微編輯圖片,隱藏的資訊就會遺失。

是否有可能以某種方式不需要狡猾的演算法和微妙的資料操作,並且仍然確保容器的功能和隱藏資料的可接受的安全等級? 展望未來,我會說——是的,你可以! 我甚至會提供一個實用程式。

方法的血腥細節

基本想法就像敲打額頭一樣簡單:磁碟上有一些區域作業系統永遠不會寫入(或在極少數情況下寫入)。 為了避免使用狡猾的演算法搜尋這些區域,我們將使用冗餘 - 也就是說,我們將在磁碟的所有磁區中多次複製隱藏資訊。 然後,在所有這些輝煌之上,您可以創建必要的分區,格式化文件系統,寫入文件並安裝作業系統 - 儘管如此,部分秘密數據將被保存並可以檢索,並且重複複製將幫助我們將原來的整體從碎片中拼湊起來。

這種方法的優點是顯而易見的:我們不依賴文件格式,甚至不依賴所使用的檔案系統的類型。

我認為缺點也很明顯:

  • 秘密資料只能透過完全重寫整個磁碟來更改,然後重新建立使用者可見的內容。 但是,您不能使用從映像重新建立磁碟的軟體:它也會重新建立先前的秘密資料。
  • 秘密資料量越大,遺失某些資訊的可能性就越大。
  • 從磁碟檢索資料可能需要很長時間。 從幾分鐘到幾天(現代磁碟很大)。

現在讓我們繼續討論具體細節。

很明顯,如果你簡單地將秘密資料塗抹在整個磁碟上,它只會被肉眼隱藏。 如果你的目光配備了磁碟編輯器,那麼資料就會展現在你眼前。 因此,最好對資料進行加密,使其不洩漏。 我們將進行簡單但有品味的加密:使用 aes256-cbc 演算法。 我們將詢問用戶加密金鑰並讓他想出一個好的密碼。

下一個問題是我們如何區分「好」數據和壞數據。 這裡校驗和會幫助我們,但不是簡單的校驗和,而是 SHA1。 還有什麼? 它對於 git 來說已經足夠好了,所以它也適合我們。 決定:我們為每個儲存的資訊提供一個校驗和,如果解密後匹配,則說明解密成功。

您還需要秘密資料的片段編號和總長度。 碎片編號是為了記錄哪些碎片我們已經破解,哪些碎片還剩下。 總長度對我們處理最後一個片段時會有用,以免寫入不必要的資料(即填充)。 好吧,由於我們仍然有一個標頭,因此我們將在其中添加秘密文件的名稱。 解密後會有用,免得猜測如何開啟。

在實踐中測試該方法

為了進行檢查,我們採用最常見的媒體 - 快閃磁碟機。 我找到了一個舊的,容量為1GB,非常適合實驗。 如果您像我一樣提出了不使用實體介質,而是在檔案(磁碟映像)上測試它的想法,那麼我會立即說:它行不通。 當格式化這樣的「磁碟」時,Linux 會再次建立該文件,並且所有未使用的磁區都會用零填充。

作為一台Linux機器,不幸的是,我不得不在陽台上的Raspberry Pi 3上使用氣象站,那裡沒有太多內存,所以我們不會隱藏大檔案。 我們將最大大小限制為 10 MB。 隱藏太小的檔案也是沒有意義的:該實用程式以 4 KB 簇的形式將資料寫入磁碟。 因此,下面我們將限製檔案大小為 3 kb - 它適合這樣一個簇。

我們將分階段模擬閃存驅動器,在每個階段後檢查隱藏資訊是否可讀:

  1. 快速格式化為 FAT16 格式,簇大小為 16 KB。 這就是 Windows 7 為沒有檔案系統的隨身碟提供的功能。
  2. 將快閃磁碟機中的各種垃圾填滿50%。
  3. 將快閃磁碟機中的各種垃圾填滿100%。
  4. FAT16 格式的「長」格式化(覆蓋所有內容)。

正如預期的那樣,前兩次測試以完全勝利告終:該實用程式能夠成功地從閃存驅動器中提取 10 兆位元組的秘密資料。 但是當閃存驅動器裝滿文件後,出現故障:

Total clusters read: 250752, decrypted: 158
ERROR: cannot write incomplete secretFile

正如您所看到的,只有 158 個簇被成功解密(632 KB 的原始數據,這提供了 636424 位元組的有效負載)。 很明顯,這裡無法獲得 10 兆字節,但這些集群之間顯然存在重複。 你甚至無法透過這種方式恢復 1 MB。 但我們可以保證,即使在閃存驅動器被格式化並寫入容量之後,我們也能從閃存驅動器中恢復 3 KB 的秘密資料。 然而,實驗表明,從這樣的閃存驅動器中提取 120 KB 長的檔案是很有可能的。

不幸的是,最後一次測試表明整個閃存驅動器被覆蓋:

$ sudo ./steganodisk -p password /dev/sda
Device size: 250752 clusters
250700 99%
Total clusters read: 250752, decrypted: 0
ERROR: cannot write incomplete secretFile

沒有一個集群倖存下來......悲傷,但不是悲劇! 在格式化之前,我們嘗試在快閃磁碟機上建立一個分割區,並在其中建立一個檔案系統。 順便說一句,它從工廠來時就具有這種格式,因此我們不會做任何可疑的事情。
閃存驅動器上的可用空間略有減少是預料之中的。

完全滿的磁碟上不可能隱藏 10 兆字節,這也是意料之中的事。 但現在成功解密的叢集數量已經增加了一倍以上!

Total clusters read: 250752, decrypted: 405

不幸的是,不可能將碎片拼湊成一兆字節,但兩百千字節卻很​​容易。

好吧,關於最後第四次檢查的消息,這次是令人高興的:完全格式化這樣的閃存驅動器並沒有導致所有資訊被破壞! 4 KB 的秘密資料完全適合未使用的空間。

測試總結表:

過去的文件隱寫術:直接將數據隱藏在扇區中

一些理論分析:關於可用空間和未使用的扇區

如果您曾經將硬碟分割為多個分割區,您可能已經注意到並非總是可以分配磁碟上的所有可用空間。 第一部分總是以一些縮排開始(通常為 1 兆位元組,或 2048 個磁區)。 在最後一部分的後面,也碰巧還存在一小部分未使用的扇區「尾巴」。 有時章節之間會存在間隙,儘管這種情況很少見。

換句話說,磁碟上有一些磁區在磁碟正常工作時無法訪問,但可以向這些磁區寫入資料! 這也意味著閱讀它。 調整後,還有分割區表和開機載入程式碼,它們位於磁碟開頭的空白區域。

可以這麼說,讓我們暫時離開這些部分,從鳥瞰的角度看磁碟。 這裡我們的磁碟上有一個空分割區。 讓我們在其中建立一個檔案系統。 我們可以說磁碟上的某些磁區仍未被刪除嗎?

E-e-e-鼓聲響起! 答案幾乎總是肯定的! 事實上,在大多數情況下,建立檔案系統歸結為僅將幾塊服務資訊寫入磁碟,否則分割區的內容不會改變。

而且——純粹憑經驗——我們可以假設檔案系統不能總是佔據分配給它的所有空間,直到最後一個磁區。 例如,簇大小為16KB的FAT64檔案系統顯然無法完全佔用大小不是64KB倍數的分割區。 在這樣一個部分的末尾,必須有幾個扇區的“尾部”,無法儲存用戶資料。 然而,這一假設無法透過實驗得到證實。

因此,為了最大化隱寫圖的可用空間,您需要使用具有更大簇大小的檔案系統。 您也可以建立分割區,即使這不是必需的(例如在快閃磁碟機上)。 無需創建空白部分或留下未分配的區域 - 這將吸引感興趣的公民的注意。

實驗實用程式

您可以觸摸該實用程式的原始程式碼 這裡

要構建,您需要 Qt 5.0 或更高版本以及 OpenSSL。 如果某些功能不起作用,您可能需要編輯 steganodisk.pro 檔案。

您可以將簇大小從 4 KB 變更為 512 位元組(在 Secretfile.h 中)。 同時,服務資訊的成本也會增加:標頭和校驗和佔用固定的68位元組。

當然,您需要以 root 使用者權限運行該實用程序,並且要小心。 在覆蓋指定檔案或裝置之前不會提出任何問題!

享受。

來源: www.habr.com

添加評論