C/C++信息隐写术(一)之认识文件结构

2/10/2017来源:ASP.NET技巧人气:351

所谓的隐写术就是在不”破坏“(指正常打开,并不指修改二进制文件)文件的情况下,把机密信息写入进文件,然后经过处理后,把文件的信息提取出来。

举一个例子:

在抗日战争时期,我方在偷取到日方机密文件后会写下藏头诗。这个藏头诗一般人看不懂,只有特定的人才看得懂。

再举一个例子:

比如把一个bmp格式的图片文件放入某人的身份证信息,正常打开这个图片,只会显示原图片,经过处理提取后才能把身份证信息提取出来。

所以这就产生了一个问题,一个文件的格式,到底是什么样的。我们可以对这个文件做什么样的处理,才能不受破坏(指正常打开,并不指修改二进制文件)。

在Windows上,有后缀名这个概念,linux里面没有后缀名概念,Windows上,后缀名只有让操作系统找到打开他们的适合的方式,而这个文件是不是图片或者音频,就得看他的文件格式。

在认识bmp文件格式之前,我们先来认识下txt文件

先打开注册表(运行处输入regedit),在HKEY_CLASSES_ROOT目录下找到.txt,并且找到他的默认的数据,为txtfile,如下图所示:

现在就知道.txt文件和一个叫txtfile的东西有关,现在到注册表找到这个txtfile。同样在HKEY_CLASSES_ROOT下可以找到txtfile,如下图所示:

这时我们可以看到它的默认图标是调用了一个叫imagers.dll的东西。

然后我们继续往下看

这里面我们可以看到打开方式是command也就是cmd。用的是notepad打开的。

意思就是说,我的这台电脑,如果遇到.txt的文件就会调用notepad对它进行打开。

下面我们来介绍Windows下最简单的图片文件bmp格式。

如果我们把一个空的文件叫1.txt,改成1.bmp后,我们发现,图片浏览器根本打不开。这是因为这个1.txt里面文件内部(二进制代码)并没有发送改变。

下面来看看bmp文件格式。

首先我们用QQ接一个图并且保存为bmp格式,如下图所示:

现在提供给大家一个工具,这个工具对识别文件格式有相当高的效率。

下载地址如下:

链接: https://pan.baidu.com/s/1boNo4px 

密码: 4ysy

安装以汉化里面都有说明,在此不再说明。

搞好后,我们打开010 Editor 然后把文件拖入进入,如下图所示:

此时图如下我们来分析下:

在这个图里面:

1.我们可以看到最开头的两个十六进制为42H,4DH转为ASCII后分别表示BM,这是bmp的标识。

2.红色箭头是图片的大小(这里对应的十六进制为26 3D 17 00,但这设计大小端转化,所以他一个转为00 17 3D 26,换成十进制就为1522982)。

3.黄色的那两个箭头一般填充为0。

4.橘色监听的bfOffBits是从文件的第一个字节到位图数据的偏移大小。

5.biSze是指这个struct BITMAPINDOHEADER bmih占40个字节大小。

6.biWidth,和biHeight指图片的宽和高(为什么高度是负数,大家可以尝试下把高度该成正数,然后修改第一个颜色的值,就可以发现问题了(第一个点就变成了左下角))。

6.黑色箭头bitBitCount代表:BGRA  蓝、绿、红、alpha,来存储一个像素,蓝占多少,绿占多少,红占多少,alpha是透明度,每一个分项占1byte每一个像素占4bytes(有些只有24位,意思就是没有alpha这个透明度,因为这个alpha只有在高端的那些图片处理上才用得着,一般的图片浏览器不会显示这个东西)。

7.这两个结构体结束后:剩下的部分就是像素的BGRA了。

我们现在来修改像素里面的BGR。改成如下情况:

我们保存,查看下图片:

这时我们就可以看到这样的图片了:

这时我们再次修改他的透明度如下所示:

这时我们再观察图片:

我们发现图片并没有被改变

这是因为:目前的Windows系统下90%的图片查看器会直接忽略掉bmp文件的alpha通道

只有那些高端的,要图片处理的,才会用到alpha通道。

所以把机密信息拆开,保存到alpha通道里面,就实现了文件的隐藏,

隐藏后的文件,我们在写一个特定的程序,就可以提取出来了。

下面几节将介绍如何写这种程序。