图片的结构

Gif

一个GIF文件的结构可分为文件头(File Header)、GIF数据流(GIF Data Stream)和文件终结器(Trailer)三个部分。

文件头部分

GIF署名(Signature)和版本号(Version)

GIF署名用来确认一个文件是否是GIF格式的文件,这一部分由三个字符组成:”GIF”;文件版本号也是由三个字节组成,可以为”87a”或”89a”.具体描述见下表:

对应到实际文件中:

GIF数据流部分(GIF Data Stream)

这部分不是按照顺序记录,详细顺序参照上面的Gif总结构表

图象标识符(Image Descriptor)

一个GIF文件内可以包含多幅图象,一幅图象结束之后紧接着下是一幅图象的标识符,图象标识符以0x2C(‘,’)字符开始,定义紧接着它的图象的性质,包括图象相对于逻辑屏幕边界的偏移量、图象大小以及有无局部颜色列表和颜色列表大小,由10个字节组成:

注释扩展(Comment Extension)

这一部分是可选的(需要89a版本),可以用来记录图形、版权、描述等任何的非图形和控制的纯文本数据(7-bit ASCII字符),注释扩展并不影响对图象数据流的处理,解码器完全可以忽略它。存放位置可以是数据流的任何地方,最好不要妨碍控制和数据块,推荐放在数据流的开始或结尾。具体组成:

文件结尾部分

文件终结器(Trailer)

这一部分只有一个值为0的字节,标识一个GIF文件结束.

对应到实际中:

参考文章

JPG

JPG/JPEG内部存储是块状类型(即文件内部分为若干块),这些块由ff开头,ff后紧跟的一个标记符指明了这个块的类型。

JPEG (jpg) 文件头:FFD8FF文件尾:FF D9

这些分块按出现顺序分别是:

文件开始&结束

FFE0 APP0 图像识别信息

  • FFE0:定义交换格式和图像识别信息
  • 4a46 4946 00:JFIF格式标识符
  • 01 01:版本号(第一个01是主版本好,第二个01是次版本号)
  • 01:单位(00=无单位;01=点数/英寸;02=点数/厘米)
  • 0078:为水平分辨率
  • 0078:为竖直分辨率
  • 00:水平点数
  • 00:竖直点数

TIPs

  • jpg文件缺少文件尾在windows下也能被正确打开。(bugku中的这是一张单纯的图片)

参考

PNG

PNG文件结构很简单,主要有数据块(Chunk Block)组成,最少包含4个数据块。

PNG图像标识符

根据PNG文件的定义来说,其文件头位置总是由位固定的字节来描述的:

IHDR数据块

文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。

文件头数据块由13字节组成,它的格式如下表所示:

  • 00 00 00 0D:IHDR头块长为13
  • 49 48 44 52:IHDR标识
  • 00 00 13 40:图像的宽
  • 00 00 0C C0:图像的高
  • 44 6D AD B8:CRC校验

IEND图像结束数据

它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

如果我们仔细观察PNG文件,我们会发现,文件的结尾12个字符看起来总应该是这样的:

由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。

压缩包

rar

rar 无加密状态下,压缩包里面每个文件前都有文件头表示 0x74

参考