GIF(图形互换格式),用于以超文本标记语言(HTML)方式显示索引彩色图像,在因特网和其他在线服务系统上得到广泛应用
GIF是一种位图。位图大致原理是:图片有许多的像素组成,每个像素都被指定了一种颜色,这些像素综合起来就构成了图片。GIF采用的是LZW(Lempel-Zev-Welch)压缩算法,支持256种颜色。
一个GIF文件的结构可以分为:文件头(File Header)、GIF数据流(GIF Data Stream)、文件结尾(Trailer)三部分
GIF图像文件是由多个图像帧组成的,因此可以呈现出动态效果。每一帧都在GIF文件中进行编码,并在播放时按照既定的时间间隔依次显示。相当于一帧一帧的播放每个图片,达到动态效果、
这里只详细讲解GIF文件里重要的结构
GIF的文件结构
著名(Signature) | 文件头 | |
版本(Version) | ||
逻辑屏幕标识符(Logical Screen Descriptor) | GIF数据流 | |
全局颜色列表(Global Color Table) | ||
图形控制扩展(Graphic Control Extension) | 图像块 | |
注释扩展(Comment Extension) | ||
应用程序扩展(Application Extension) | ||
图像标识符(Image Descriptor) | ||
局部颜色列表(Local Color Table) | ||
图像数据(Imgae Data) | ||
文本扩展(Plain Text Extension) | ||
结尾(Tariler) | 文件结尾 |
文件头包括著名和版本,著名为47 49 46,对应的ASCII码为"GIF",版本号由3字节组成,可分为"87a"或"89a"
逻辑屏幕标识符——7字节
就在文件头之后,由7字节组成,定义了GIF图像的大小、颜色深度,背景色以及有无全局颜色列表和颜色列表的索引数
名称 | 字节数 | 含义 |
宽度 | 2 | 像素数,定义GIF图像宽度 |
高度 | 2 | 像素数,定义GIF图像高度 |
packet fields | 1 | 第7位:全局颜色列表标志,1表示有全局颜色,4-6:颜色深度,3:分类标志,1表示全局颜色列表优先度排序,0-2:全局颜色列表大小 |
Blackground | 1 | 图像透明区域的背景色在调色盘里的索引 |
Pixel Aspect | 1 | 像素宽高比,一般为 |
可以发现的是宽高都为F4 01,转换后发现,宽高为62625,很明显是不现实的,这里就是一个逆序的顺序,其实宽高字节应为01 F4。这是GIF文件的一个特点
全局颜色列表——任意字节,取决于列表数目
一张连续的GIF,每一帧的信息都差距不大,颜色是被大量重复运用的。全局颜色列表就是把图片中用到的颜色提取出来,组成一个调色盘,这样在存储真正的图片点阵时,只需要存储每个点在调色盘里的索引值。如果调色盘放在文件头,作为所有帧的公用信息,就是全局调色盘。如果放在每一帧的信息中,那就是局部调色盘。
图像标识符——10字节
一个GIF文件可以包含多幅图像,一幅图像结束之后紧接着是下一副图像标识符,图像标识符以"2C"这个字节开始,紧接着就是图像的性质,包括对于逻辑屏幕边界的偏移量,图像大小以及有无局部颜色列表和颜色列表大小
名称 | 字节数 | 含义 |
Start Flag | 1 | 图像标识符开始,固定为2C |
x_offset | 2 | X方向偏移量 |
y_offset | 2 | Y方向偏移量 |
宽度 | 2 | 像素数,定义GIF图像宽度 |
高度 | 2 | 像素数,定义GIF图像高度 |
packet fields | 1 | 第7位:局部颜色列表标志,1表示有全局列表,6:交织标志,置位时图像数据使用交织方式排列,5:分类标志,如果置位标志紧跟着局部颜色列表分类排列,3-4:保留,必须初始化为0,0-2:局部颜色列表大小 |
GIF文件尾
GIF文件的结尾是一个固定值,"3B",用来标志整个文件的结束
GIF的三种隐写方法
(1)追加插入隐写,就是在GIF文件后插入其他文件。这种隐写非常容易识别。用010 editor打开GIF图片,找到结尾,如果发现结尾标识后还有其他东西,就可以判断出GIF文件后附加了其他文件,将附加数据提取出来即可
(2)基于图片的隐写
GIF中可以包含多个图像,并且每个图像都是一帧一帧播放的,如果其中有几个图片存在隐藏信息,人眼很难看出来。出题人可以在某幅图片隐写信息,要想得到信息,就需要提取出GIF的每幅图片进行观察,对每幅图片进行分析
可以去找在线网站,搜索GIF图片分割即可
(3)基于时间的隐写
这种方式非常隐蔽,因为GIF中的每幅图像都会有延迟时间可以约定不同的延迟时间代表不同的含义,例如延迟100ms代表1,延迟50ms代表0,从而达到传输秘密信息的目的
如果遇到基于延迟时间的隐写,那么就要用到kali的一个命令来提取延迟时间
命令:identify -format "%T" 图片名称.gif
记得在图片的同一目录下使用该命令