什么是信息隐藏
信息隐藏指在设计和确定模块时,使得一个模块内包含的信息(过程或数据),对于不需要这些信息的其他模块来说,是不能访问的。通过信息隐藏,可以定义和实施对模块的过程细节和局部数据结构的存取限制。
信息隐藏的发展历史可以一直追溯到"匿形术"的使用。“匿形术”一词来源于古希腊文中”隐藏的”和"图形"两个词语的组合。虽然"匿形术"与"密码术"都是致力于信息的保密技术,但是,两者的设计思想却完全不同。"密码术"主要通过设计加密技术,使保密信息不可读,但是对于非授权者来讲,虽然他无法获知保密信息的具体内容,却能意识到保密信息的存在。而"匿形术"则致力于通过设计精妙的方法,使得非授权者根本无从得知保密信息的存在与否。相对于现代密码学来讲,信息隐藏的最大优势在于它并不限制对主 信号的存取和访问,而是致力于签字信号的安全保密性。
信息隐藏-使用隐写术来防止敏感数据被盗用
第一步:开始实验操作
第二步,进入实验机Windows 10,打开位于桌面上的文件夹“隐写术Images”进入“图种”路径中,找到名称为test.jpg的图片文件。使用7z工具打开该文件,右键打开方式选择“7-Zip File Manager”,将获得以下的内容,里面包含了一个可供下载的种子文件
发现隐藏的文件通过zip软件直接可以读取出来,值得注意的是,虽然这种方法简单快速,但如果同时将多个文件进行隐写可能会失败。
第三步,通过实验来看一下该文件的制作方法和原理:首先我们需要制作一个1.zip的压缩文件,然后将需要隐藏的文件添加到压缩包中,路径位于桌面下的隐写术Images\图种\source文件夹中
这里我们需要一张jpg的图片,使用命令copy /b [文件1]+[文件2] 目标文件,就可以得到一张新的图种test01.jpg
经计算源文件的大小770,256字节加上175,285字节刚好等于945,541字节,证实了它利用了copy命令,将两个文件以二进制方式连接起来,生成test01.jpg的新文件。
第四步,通过桌面上的工具WinHex对test01.jpg文件进行查看,直接将test01.jpg文件拖入WinHex的操作面板中进行查看
通过WinHex可以看到正常的JPG文件中FF D9十六进制码代表的是结束符,而图片查看器会忽略JPG结束符之后的内容,所以我们通过copy命令附加的zip文件不会影响图片的正常显示,并且可以正常读取。
总结一下:这种类型的隐写也是比较容易被发现的,如果发现是JPG图片的话,观察文件结束符之后的内容,即可识别是否有附加的内容,当我们用WinHex打开文件,发现文件最后数据块不是FF D9 JPG文件的结束标志,而是zip文件的结束标志,就可以直接将其修改后缀,然后提取文件:
第五步,还有一种情况是比较特殊的,如果遇到有多个文件隐藏在图片中的话,则需要通过kali上的一个工具binwalk来进行查看。以sample.png为例,先用kali下的binwalk命令来打开png文件:
在进行实验之前需要我们预先将”隐写术images\双图\sample.png”拷贝到kali下,可以使用WinSCP进行拷贝,要求kali开启ssh服务,使用命令service ssh start即可打开ssh服务,使用netstat命令查看是否监听22号端口
然后回到Windows下,打开桌面上的WinSCP,输入kali的ip地址,端口号22,用户名root,密码toor,配置完成后点击登录即可
出现如下警告,选择是将该主机密钥添加到缓存中
在会话中选中要上传的文件sample.png,然后点击上传按钮,即可将文件上传至kali的/root目录下
接下来,在kali的命令终端中使用命令binwalk sample.png对图片进行自动分析
软件的显示了三个信息:DECIMAL(十进制)、HEXADECIMAL(十六进制)、DESCRIPTION(描述),从上面的内容显然可以看出这个PNG文件还隐藏着另一个PNG文件,从1851832块偏移开始就是另一张PNG图片。
使用命令dd if=final.png of=final-1.png sikp=1922524 bs=1
这里if为制定输入文件,of为指定输出文件,skip为指定从输入文件开头跳过1851832个块后开始复制,bs设置每次读写块的大小为1字节。
然后使用命令eog分别打开两张图片
至此图片分离成功。分离文件的方法目前总结出来的有三种:dd分离法(在Linux/Unix下使用dd命令分离文件)、stegsolve工具自动分离法、WinHex编辑器分析法针对一些简单的图片隐写可以通过某一种方法即可实现文件的分离,但也不乏部分题目会设置一些障碍,以增加分离难度。如本案例中的图片文件final.png,需要我们综合的使用三种方法来将源文件进行分离,接下来我们复现它的分离过程。
第六步,首先,使用工具binwalk来确定final.png图片的数据偏移量
根据binwalk分析的结果,发现该文件中有两个PNG图片,并且我们可以确定它的偏移值是0x1D55DC,接下来切换到Windows使用WinHex工具来分离这两张图片。
使用WinHex打开final.png后,点击左侧的offset偏移量的任意位置,即可将十进制表示的偏移量转换为十六进制显示,然后在标题栏中点击右箭头(转到偏移量),定位到001D55D0的位置,点击确定
来到001D55D0的位置后,红框框住的部分为上一个文件的尾部,鼠标右键点击从右往左数第四个块的位置即PNG文件头的位置89 50 4E 47 0D 0A 1A 0A,然后选择“选块起始位置”或使用快捷键Alt+1
再然后拖到尾部的位置右键选择最后一个块的位置选择“块尾部”或使用快捷键Alt+2
最后剪切选中的部分到新的文件中保存为final-end.png,将剩下的部分保存为final-start.png
打开位于桌面的实验工具——隐写术工具——DiffImg——diffimg.exe,加载final-start.png为原图,加载final-end.png为比较图
在DiffImg中进行分析。
经过观察发现,左下角的图像中有异常的像素条,当发现两张PNG图片外观、大小、像素都基本相同时,可以考虑对两个图片进行结合分析,即将两个文件的像素RGB值进行XOR、ADD、SUB等操作,看能否得到有用的信息。StegSolve可以方便的进行这些操作。
第七步,打开位于桌面的实验工具——隐写术工具——Stegsolve,接下来我们使用Stegsolve来对图片进行分析。打开StegSolve,选择“file”->”open”打开一张图片文件,然后选择“analyse”->”image combine”选择另一张图片,默认的XOR操作就可以看到隐藏的信息。(注意打开顺序final-end.png在前,final-start.png在后)
点击窗口下方的箭头,可以看到不同combine方式下的结果。将两张图片进行combine后,进行异或对比(XOR),如果检测的结果为全黑则代表两张图每个字节都一样(因为异或运算,00则为黑色),但是我们检测到左下角细微的差异,点击Save将XOR异或相减的结果保存为solved.bmp。
将图片solved.bmp放大后发现图片右下角倒数第二行有红色像素条。通过异或对比发现一条红色像素条,
MP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。可以确定隐藏信息就隐藏在final-end.png的左下角的RGB像素通道的红色通道中,接下来就需要确定红色像素条的偏移处。
使用工具WinHex对上图异或的sloved.bmp图片进行查看,找出非黑色的偏移处,即非00处:
很容易在0x1110出发现异常的隐藏信息,该异常信息的偏移地址从0x1118开始至0x133D结束。
第八步,由于PNG格式的图片是经过压缩后的,对分析隐藏信息的偏移进行分析带来了一定的阻碍,此时我们便可以利用BMP格式的优势——存储信息无压缩,方便寻找偏移,具体操作:使用画图软件打开final-end.png,然后将其另存为final-end.bmp
接下使用工具WinHex打开final-end.bmp
通过左边的16进制地址定位栏,对偏移地址0x1118至0x133D进行标记:
将以上选中的部分,另存为diff_dump.bin
再仔细观察发现RGB在每个R通道里都是00/01,信息隐藏在R通道中,其他通道都是图片的正常像数信息,接下来我们需要想办法对其进行过滤过滤。(每3个Hex的第一个hex的值都是00/01)使用编辑器editplus打开diff_dump.bin选择编辑栏中的Hex按钮,以16进制查看,如下:
复制16进制部分的内容至新的文档中,然后将其另存为Sources.txt
第九步,由于信息是隐藏在Red通道中,那么其他的通道都是图片正常的像素信息,过滤掉即可,只保留其中的” 00/01”
使用命令python BinaryExtractTool.py对Sources.txt进行00 01字符串的提取
提取之后发现仍有换行符号和空格,此时我们可以借助Editplus的替换功能将其过滤掉,分别使用过滤公式替换换行符和空格,注意使用替换功能时勾上使用正则表达式
得到下面一组数据
再仔细观察,想到用常见的0101处理的几种方法:二维码——发现不是某数的平方、binary编码——发现不可见字符都无法解决,再回看RGB通道中的R通道信息,发现全是00或者01,按照出题人的思路,可能是将一串binary写入R通道中的时候,0变成了00, 1变成了01。思考一下是否可以通过逆向的方式来还原被隐藏的字符——最简单的方法就是将00替换成0、01替换成1。
使用editplus的替换功能,替换00为0,01为1即可,最终得到这样一组数据
在得到这组数后,长度是184,发现是8的倍数,需要将它转换成ascii码即可。
第十步,打开桌面的实验工具——隐写术工具——JPK_406.jar进制转换的小工具,对以上的数据进行转换,选择File——Load File as Ascii,以Ascii编码打开1.txt
然后点击Binary——Binary Format
最后选择Binary——Binary To Ascii
最终将得到隐藏的字符串信息,如下所示
转载:https://blog.csdn.net/qq_48609816/article/details/125861385