C/C++信息隐写术(一)之认识文件结构
所謂的隱寫術(shù)就是在不”破壞“(指正常打開,并不指修改二進(jìn)制文件)文件的情況下,把機(jī)密信息寫入進(jìn)文件,然后經(jīng)過(guò)處理后,把文件的信息提取出來(lái)。
舉一個(gè)例子:
在抗日戰(zhàn)爭(zhēng)時(shí)期,我方在偷取到日方機(jī)密文件后會(huì)寫下藏頭詩(shī)。這個(gè)藏頭詩(shī)一般人看不懂,只有特定的人才看得懂。
再舉一個(gè)例子:比如把一個(gè)bmp格式的圖片文件放入某人的身份證信息,正常打開這個(gè)圖片,只會(huì)顯示原圖片,經(jīng)過(guò)處理提取后才能把身份證信息提取出來(lái)。
所以這就產(chǎn)生了一個(gè)問(wèn)題,一個(gè)文件的格式,到底是什么樣的。我們可以對(duì)這個(gè)文件做什么樣的處理,才能不受破壞(指正常打開,并不指修改二進(jìn)制文件)。
在Windows上,有后綴名這個(gè)概念,Linux里面沒(méi)有后綴名概念,Windows上,后綴名只有讓操作系統(tǒng)找到打開他們的適合的方式,而這個(gè)文件是不是圖片或者音頻,就得看他的文件格式。
在認(rèn)識(shí)bmp文件格式之前,我們先來(lái)認(rèn)識(shí)下txt文件
先打開注冊(cè)表(運(yùn)行處輸入regedit),在HKEY_CLASSES_ROOT目錄下找到.txt,并且找到他的默認(rèn)的數(shù)據(jù),為txtfile,如下圖所示:
現(xiàn)在就知道.txt文件和一個(gè)叫txtfile的東西有關(guān),現(xiàn)在到注冊(cè)表找到這個(gè)txtfile。同樣在HKEY_CLASSES_ROOT下可以找到txtfile,如下圖所示:
這時(shí)我們可以看到它的默認(rèn)圖標(biāo)是調(diào)用了一個(gè)叫imagers.dll的東西。
然后我們繼續(xù)往下看
這里面我們可以看到打開方式是command也就是cmd。用的是notepad打開的。
意思就是說(shuō),我的這臺(tái)電腦,如果遇到.txt的文件就會(huì)調(diào)用notepad對(duì)它進(jìn)行打開。
如果我們把一個(gè)空的文件叫1.txt,改成1.bmp后,我們發(fā)現(xiàn),圖片瀏覽器根本打不開。這是因?yàn)檫@個(gè)1.txt里面文件內(nèi)部(二進(jìn)制代碼)并沒(méi)有發(fā)送改變。
下面來(lái)看看bmp文件格式。
首先我們用QQ接一個(gè)圖并且保存為bmp格式,如下圖所示:
現(xiàn)在提供給大家一個(gè)工具,這個(gè)工具對(duì)識(shí)別文件格式有相當(dāng)高的效率。
下載地址如下:
鏈接: https://pan.baidu.com/s/1boNo4px?
密碼: 4ysy
安裝以漢化里面都有說(shuō)明,在此不再說(shuō)明。
搞好后,我們打開010 Editor 然后把文件拖入進(jìn)入,如下圖所示:
此時(shí)圖如下我們來(lái)分析下:
在這個(gè)圖里面:
1.我們可以看到最開頭的兩個(gè)十六進(jìn)制為42H,4DH轉(zhuǎn)為ASCII后分別表示BM,這是bmp的標(biāo)識(shí)。
2.紅色箭頭是圖片的大小(這里對(duì)應(yīng)的十六進(jìn)制為26 3D 17 00,但這設(shè)計(jì)大小端轉(zhuǎn)化,所以他一個(gè)轉(zhuǎn)為00 17 3D 26,換成十進(jìn)制就為1522982)。
3.黃色的那兩個(gè)箭頭一般填充為0。
4.橘色監(jiān)聽的bfOffBits是從文件的第一個(gè)字節(jié)到位圖數(shù)據(jù)的偏移大小。
5.biSze是指這個(gè)struct BITMAPINDOHEADER bmih占40個(gè)字節(jié)大小。
6.biWidth,和biHeight指圖片的寬和高(為什么高度是負(fù)數(shù),大家可以嘗試下把高度該成正數(shù),然后修改第一個(gè)顏色的值,就可以發(fā)現(xiàn)問(wèn)題了(第一個(gè)點(diǎn)就變成了左下角))。
6.黑色箭頭bitBitCount代表:BGRA ?藍(lán)、綠、紅、alpha,來(lái)存儲(chǔ)一個(gè)像素,藍(lán)占多少,綠占多少,紅占多少,alpha是透明度,每一個(gè)分項(xiàng)占1byte每一個(gè)像素占4bytes(有些只有24位,意思就是沒(méi)有alpha這個(gè)透明度,因?yàn)檫@個(gè)alpha只有在高端的那些圖片處理上才用得著,一般的圖片瀏覽器不會(huì)顯示這個(gè)東西)。
7.這兩個(gè)結(jié)構(gòu)體結(jié)束后:剩下的部分就是像素的BGRA了。
我們現(xiàn)在來(lái)修改像素里面的BGR。改成如下情況:
我們保存,查看下圖片:
這時(shí)我們就可以看到這樣的圖片了:
這時(shí)我們?cè)俅涡薷乃耐该鞫热缦滤?#xff1a;
這時(shí)我們?cè)儆^察圖片:
我們發(fā)現(xiàn)圖片并沒(méi)有被改變
這是因?yàn)?#xff1a;目前的Windows系統(tǒng)下90%的圖片查看器會(huì)直接忽略掉bmp文件的alpha通道
只有那些高端的,要圖片處理的,才會(huì)用到alpha通道。
所以把機(jī)密信息拆開,保存到alpha通道里面,就實(shí)現(xiàn)了文件的隱藏,
隱藏后的文件,我們?cè)趯懸粋€(gè)特定的程序,就可以提取出來(lái)了。
下面幾節(jié)將介紹如何寫這種程序。
總結(jié)
以上是生活随笔為你收集整理的C/C++信息隐写术(一)之认识文件结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java高级语法笔记-文件读写(2)
- 下一篇: C/C++屏幕恶搞程序