文件格式 | 文件头 | 文件尾 |
---|---|---|
JPEG | FF D8 FF | FF D9 |
PNG | 89 50 4E 47 0D 0A 1A 0A 00 00 00 0D | AE 42 60 82 |
GIF | 47 49 46 38 | 00 3B |
ZIP | 50 4B 03 04 | 50 4B |
RAR | 52 61 72 21 | |
tar.gz | 1F 8B 08 | |
pyc | 03 F3 0D 0A | |
MP3 | FF FB 92 | |
255044462D312E |
PNG
-
图种:jpg 图片有文件尾标识 FF D9,而图片查看器只读取 FF D9 之前的数据显示为图片,因此 FF D9 之后的空间能够存放隐藏数据;png 的末尾 00 00 00 00 49 45 4e 44 ae 42 60 82 充当文件尾标识,情况类似
-
LSB隐写:将数据藏匿在最低有效位,因此只适合 无损压缩
png
或 无压缩bmp
图片格式
png 文件主要由4大块(Chunk)组成: 文件头数据块IHDR(header chunk) 调色板数据块PLTE(palette chunk) 图像数据块IDAT(data chunk) 图像结束数据块IEND(trailer chunk)
IDHR块
IHDR Chunk又称为图片文件头数据块(image header chunk),是 png
图片的第一个chunk,一张 png
图片有且仅有一个IHDR Chunk
png 文件头标识 89 50 4E 47 0D 0A 1A 0A
图片宽度为 00 00 01 f4,即 500 像素
高度为 00 00 01 a4,即 420 像素
CRC码为 cb d6 df 8a
PNG CRC爆破
import binascii import struct misc = open("2.png","rb").read() for h in range(1024): data = misc[12:20] + struct.pack('>i',h)+ misc[24:29] crc32 = binascii.crc32(data) & 0xffffffff if crc32 == 0xcbd6df8a: print h
IDAT块
图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。
IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,用户就可以很方便的生成PNG图像
IEND块
每个正常的 png
图片文件的IEND Chunk都是固定的
00 00 00 00 49 45 4e 44 ae 42 60 82
每个 png
文件的IEND Chunk都是 00 00 00 00 49 45 4e 44 ae 42 60 82
,占12字节,它作为 png
文件的文件尾标识
BMP
BMP文件由4部分组成:
-
位图文件头(bitmap-file header)
-
位图信息头(bitmap-informationheader)
-
颜色表(color table)
-
颜色点阵数据(bits data)
24位真彩色位图没有颜色表,所以只有1、2、4这三部分
位图信息头
名称 | 占用空间 | 内容 | 实际数据 |
---|---|---|---|
biSize | 4字节 | 位图信息头的大小,为40 | 0x28(40) |
biWidth | 4字节 | 位图的宽度,单位是像素 | 0x200(512) |
biHeight | 4字节 | 位图的高度,单位是像素 | 0x200(512) |
biPlanes | 2字节 | 固定值1 | 1 |
biBitCount | 2字节 | 每个像素的位数 1-黑白图,4-16色,8-256色,24-真彩色 | 0x18(24) |