程序下載地址
基于FAT32文件系統(tǒng)的數(shù)據(jù)隱寫實驗
實驗內(nèi)容
本實驗要求通過修改采用FAT32文件系統(tǒng)的分區(qū)結(jié)構(gòu),實現(xiàn)將數(shù)據(jù)隱寫在分區(qū)中的空閑扇區(qū),并且該隱寫數(shù)據(jù)不會被新拷入文件覆蓋。具體完成以下目標:
(1) 查找分區(qū)中未分配的扇區(qū),將小于4KB(4096字節(jié))的數(shù)據(jù)隱寫其中;
(2) 為了避免用戶發(fā)現(xiàn)墩划,寫入的數(shù)據(jù)不能夠以文件形式存在;
(3) 為了保證數(shù)據(jù)的可靠性嗡综,寫入的數(shù)據(jù)不能夠被新拷入的文件覆蓋。
實驗步驟
1. 初始化優(yōu)盤
將優(yōu)盤插入主機的USB接口,待主機識別后,雙擊“我的電腦”,找到優(yōu)盤所在分區(qū),右鍵點擊殊者,選擇“格式化”
模擬現(xiàn)實情況猖吴,向優(yōu)盤中拷入一些文件
2. 利用WinHex打開優(yōu)盤
雙擊WinHex.exe共屈,進入操作界面。點擊菜單“工具”?“打開磁盤”泼掠,選擇優(yōu)盤所在分區(qū)
3. 修改FSINFO保留扇區(qū)
為了找到可以寫入數(shù)據(jù)的空閑空間,打開分區(qū)的1號扇區(qū)(第2個扇區(qū)),即保留扇區(qū)右冻。注意可以通過該扇區(qū)0x0偏移的4個字節(jié)“52 52 61 41”以及0x1E4處的4個字節(jié)“72 72 41 61”來判斷定位的FSINFO扇區(qū)是否正確暗赶。
根據(jù)FAT32文件系統(tǒng)結(jié)構(gòu)被环,該扇區(qū)偏移0x1E8處連續(xù)的4個字節(jié)即為當(dāng)前分區(qū)所有的可用簇總數(shù)柱搜,得到值為“1C F6 1C 00”控乾,由于需要將數(shù)據(jù)寫入一個空閑簇慨仿,因此將其值減1,得到“1B F6 1C 00”相寇;同理绵脯,偏移0x1EC處的連續(xù)4個字節(jié)為當(dāng)前分區(qū)內(nèi)“下一個可用簇”的字段蛆挫,值為“A5 03 00 00”。注意該簇0x0362即為我們要寫入數(shù)據(jù)的空閑簇做粤。
通過FAT表找到連續(xù)4個全零字節(jié)所在簇吼和,我們這里找到的是0x0362阳距,將“下一個可用簇”的值0x0362改為0x0363.
0x0362就是我們要保護的簇
4. 修改FAT表
接下來需要修改FAT表中的空閑簇咖熟,在Winhex文件顯示窗口中點擊“FAT1”來到FAT1表的初始位置薪韩。
我們來計算一下需要修改的地址偏移
>>> hex((0x362)*4)
'0xd88'
>>> 0xd88+0x183400
1589640
>>> hex(1589640)
'0x184188'
>>> 0xd88+0x8c1a00
9185160
>>> hex(9185160)
'0x8c2788'
在FAT1表中,找到0x362簇的狀態(tài)字符拉盾,即相對起始處偏移0x362×4(0xd88)的指示的4個字節(jié)承桥,將其值“00 00 00 00”改為“FF FF FF 0F”或者“F7 FF FF FF”,前者表示該簇已被占用轻黑,后者表示該簇已壞,如圖1.8所示。將該簇狀態(tài)標志為壞簇或占用簇主要為了讓系統(tǒng)認為該簇已使用而不會被新寫入的數(shù)據(jù)覆蓋态罪。FAT2是FAT1的備份下面,為了保險起見复颈,也采用與FAT1同樣的處理方式。
5. 填寫數(shù)據(jù)
找到數(shù)據(jù)區(qū)“0x362”簇開始的位置诸狭,將連續(xù)的8個扇區(qū)內(nèi)容填入需要隱藏的數(shù)據(jù)券膀,由于本實驗只是為了驗證寫入數(shù)據(jù)不會被新文件覆蓋,因此我們手工將每個扇區(qū)的開始部分改為連續(xù)的0x66,即字符”f”驯遇。數(shù)據(jù)區(qū)的0x362簇位置可利用WinHex菜單中提供的工具查找芹彬,選擇菜單“位置>Go to Sector”,在Cluster處填入0x362轉(zhuǎn)換為十進制的數(shù)字866即可。
跳轉(zhuǎn)到這來的時候里面存滿了數(shù)據(jù)叉庐,說明這是快速格式化沒有徹底擦除數(shù)據(jù)的證據(jù)舒帮,這也是數(shù)據(jù)可以恢復(fù)的原因
跳轉(zhuǎn)到這里之后我們在扇區(qū)的開頭填上
fffffffffffffffffff
,這里僅僅是用來做一個標記在頭和尾的地方設(shè)置一個標記來判斷扇區(qū)數(shù)據(jù)是否被修改
然后我們算一下尾部地址
>>> hex(0x1360000+8*512)
'0x1361000'
同樣改完即可
修改完畢
6. 保存與驗證
點擊菜單“文件Save Sectors”將寫入的數(shù)據(jù)保存。接下來需要往優(yōu)盤中寫入新的文件玩郊,以用來驗證之前寫入的數(shù)據(jù)不會被覆蓋肢执。在拷入數(shù)據(jù)前,注意先將優(yōu)盤從系統(tǒng)中正常退出译红,重新插拔预茄。
向U盤里拷入新的文件:一部電影:
再次用WinHex將優(yōu)盤所在分區(qū)打開。定位到數(shù)據(jù)區(qū)的0x362簇的最后一個扇區(qū)侦厚,檢查一下看看先前在0x362簇寫入的數(shù)據(jù)是否被覆蓋
可以看出耻陕,先前寫入的0x362處的隱藏數(shù)據(jù)沒有被新文件覆蓋,新文件從0x363處開始寫入刨沦。在文件目錄中看不到隱藏數(shù)據(jù)的任何部分诗宣。
以上實驗中FAT區(qū)中的對應(yīng)簇狀態(tài)標識為壞簇也可達到同樣目的。
對上述步驟的程序化實現(xiàn)
Winhex腳本學(xué)習(xí)
通過上面的實驗想诅,我對步驟已經(jīng)比較熟悉了召庞,寫腳本也是得心應(yīng)手
對于python和winhex腳本的選擇,我選擇了后者来破,因為上述實驗都是在winhex實現(xiàn)篮灼,而且winhex腳本只需要一個winhex就可以運行,比較方便讳癌,然后語言也比較白癡穿稳,容易現(xiàn)學(xué)現(xiàn)賣存皂,把這個腳本寫出來也只花了一個小時
但是winhex腳本語言確實比較蠢晌坤,和網(wǎng)上教程還不一定全都相同,所以總結(jié)了一下:
Winhex腳本的坑
- winhex腳本不區(qū)分大小寫 盤符好像區(qū)分
- winhex腳本用“\\”符號表示注釋旦袋,但是有些環(huán)境下寫注釋就會報錯
- winhex腳本可以用雙引號或單引號將整數(shù)強制轉(zhuǎn)換為文本
- winhex腳本支持的運算符有加(+)骤菠、減(-)、乘(*)疤孕、除(/)商乎、取模(%)、按位與(&)祭阀、按位或(|)和按位異或(^)運算符
- 雖說支持運算鹉戚,但是必須在運算式外面加上括號,不然會識別為字符串
- 有時調(diào)試的話我用message把值給彈出來专控,但是寫運算式是不支持的抹凳,加上括號也不行,也就是最多只能彈一個變量2333333
- 至今不知道賦值怎么賦
寫程序
這里有點非常需要注意:
這兩種方式打開非常不一樣
后者打開的話這里所有的偏移算上U盤起始扇區(qū)的0x4000
而用前者打開就不需要加上0x4000
然后我們將每一步的偏移按公式就算出來可以寫出程序
實現(xiàn)效果
- FSINFO保留扇區(qū)已經(jīng)被改過來了伦腐,和上面寫實驗報告的時候前移了一個簇
- FAT表也修改成功了
- 最后在被保護的簇頭和尾寫下“666666666666666”
也算是一種金絲雀吧
-
然后我們還發(fā)現(xiàn)了上次手動修改留下的痕跡_(:3」∠)_
這個時候我們再存儲其他數(shù)據(jù)
將電影存進去之后
我們再檢查
發(fā)現(xiàn)我們要被隱藏的簇保存完好
電影從下一簇開始存儲
注意事項
其實腳本已寫好赢底,開始幾次試了一下,把電影拷進去,發(fā)現(xiàn)我們我們要保護的簇都被覆蓋了幸冻,暈死
試了好幾次粹庞,還好步驟已經(jīng)程序化了,不然嘗試幾次會累死
后來發(fā)現(xiàn)是
改完數(shù)據(jù)保存之后洽损,需要重新插拔一次U盤
前面做實驗的時候記得好像并沒有插拔也成功了庞溜,所以并沒有在意
我覺得需要插拔的原因可能是電腦需要更新一下FSINFO保留扇區(qū)吧