PNG图片文件头结构

PNG图片文件头结构

耀鳞光翼 Lv3

简介

便携式网络图形(英语:Portable Network Graphics,PNG)是一种支持无损压缩的位图图形格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性。PNG的开发目标是改善并取代GIF作为适合网络传输的格式而不需专利许可,所以受广泛应用于互联网及其他方面上。

文件结构

PNG文件由文件署名数据块(chunk)组成

PNG格式
PNG格式

  1. 文件署名:

    图片的前8字节用来表示该文件是否是PNG文件,通常PNG文件的标识是89 50 4E 47 0D 0A 1A 0A

  2. 文件头数据块(IHDR):

    包含PNG图像数据的基本描述信息,一共13字节,作为第一个数据块出现在PNG数据流中,且一个PNG图片中,只有一个文件头数据块。

    名称字节数说明
    Length(长度)4字节指定数据块中数据域的长度,其长度不超过(231−1)(231−1)字节
    Chunk Type Code(数据块类型码)4字节数据块类型码由ASCII字母(A-Z和a-z)组成,表明类型名称
    Width4字节图像宽度,以像素为单位
    Height4字节图像高度,以像素为单位
    Bit depth1字节图像深度
    索引彩色图像:1,2,4或8 ;
    灰度图像:1,2,4,8或16 ;
    真彩色图像:8或16;
    ColorType1字节颜色类型
    0:灰度图像,1,2,4,8或16;
    2:真彩色图像,8或16;
    3:索引彩色图像,1,2,4或8;
    4:带α通道数据的灰度图像,8或16;
    6:带α通道数据的真彩色图像,8或16;
    Comdivssion method1字节压缩方法(LZ77派生算法)
    Filter method1字节滤波器方法
    Interlace method1字节隔行扫描方法:
    0:非隔行扫描
    1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)
    CRC (循环冗余检测)4字节存储用来检测是否有错误的循环冗余码
  3. 调色板数据块PLTE(palette chunk):

    它包含有与索引彩色图像((indexed-color image))相关的彩色变换数据,它仅与索引彩色图像有关,而且要放在图像数据块(image data chunk)之前。

    [!NOTE]

    (这部分目前没用到,知道在图像数据块之前就行,若未来用到,再在此添加笔记)

  4. 图像数据块IDAT(image data chunk):

    图像数据块IDAT(image data chunk):它存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。

    IDAT存放着图像真正的数据信息,因此,如果能够了解IDAT的结构,我们就可以很方便的生成PNG图像。

    PNG图片文件头部分
    PNG图片文件头部分

    PNG图片结尾部分
    PNG图片结尾部分

    名称十六进制说明
    数据块长度00 09 24 AF指明IDAT数据块长度(字节)
    数据块名称49 44 41 54数据块类型码 “IDAT” 的 ASCII 字母
    压缩的数据内容78 9C ...LZ77 派生压缩方法压缩的实际图像数据
    循环冗余校验81 16 EC 72CRC (循环冗余检测)
  5. 图像结束数据IEND(image trailer chunk):

    图像结束数据IEND(image trailer chunk):它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

    IEND结尾数据
    IEND结尾数据

    文件的结尾12个字符总应该是这样的00 00 00 00 49 45 4E 44 AE 42 60 82

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

样例

下面以一个PNG文件来做分析展示:

PNG文件
PNG文件

从图中可以看出,前8个字节是PNG的文件标识:

89 50 4E 47 0D 0A 1A 0A

接着就是IHDR文件头数据块部分:

00 00 00 0D 表明文件头数据块长度为13字节

49 48 44 52 表明IHDR的ASCII码名称

接下来是IHDR数据块的实际存储内容:

00 00 02 0C 表示图像宽1014像素

00 00 00 AF 表示图像高257像素

08 表示图像深度 8

06 表示带α通道数据的真彩色图

00 表示表示使压缩方法(LZ77派生算法),PNG Spec规定此处总为0(非0值为将来使用更好的压缩方法预留)

00 表示滤波器方法

00 表示隔行扫描方法:00非隔行扫描

91 91 86 66 表示CRC校验码

需要注意的(省流版)

[!IMPORTANT]

CTF中,对于一些图片隐写,通常会改变PNG的标识位(前8字节),让文件格式发生改变;或者是故意调整高度和宽度,隐藏FLAG,使图像失真。我们要注意的就是IHDR文件头数据块,了解结构和意义,才能方便修改回正确的样式。

附表:其他文件格式文件头标识符表

扩展名文件头标识(HEX)文件描述
7z37 7A BC AF 27 1C7-ZIP compressed file
doc0D 44 4F 43DeskMate Document file
doc12 34 56 78 90 FFMS Word 6.0
doc31 BE 00 00 00 AB 00 00MS Word for DOS 6.0
doc7F FE 34 0AMS Word
HDMP4D 44 4D 50 93 A7Windows heap dump file
hdr23 3F 52 41 44 49 41 4E 43 45 0Aadiance High Dynamic Range image file
html3C 21 44 4F 43 54HyperText Markup Language 3
html3C 48 54 4D 4C 3EHyperText Markup Language 2
html3C 68 74 6D 6C 3EHyperText Markup Language 1
html68 74 6D 6C 3EHTML
img00 01 00 08 00 01 00 01 01Ventura Publisher/GEM VDI Image Format Bitmap file
JPEG开始:FF D8
结束:FF D9
JPEG图片文件
PNG89 50 4E 47 0D 0A 1A 0APNG图片文件
GIF47 49 46 38 39(37) 61GIF文件(G I F 8 9 (7) a)
BMP42 4DBMP文件
JAR4A 41 52 43 53 00JARCS compressed archive
jar5F 27 A8 89JAR Archive File
MP3FF FB 50
mp400 00 00 18 66 74 79 70 33 67 70 35MPEG-4 video files
PDF25 50 44
PPTD0 CF 11
xls09 02 06 00 00 00 10 00 B9 04 5C 00MS Excel v2
xls09 04 06 00 00 00 10 00 F6 05 5C 00MS Excel v4
zip50 4B 30 30ZIP Archive (outdated)
Zip50 4B 30 30 50 4B 03 04WINZIP Compressed

相关参考资料:

PNG文件16进制详解

PNG文件解读(2):PNG格式文件结构与数据结构解读—解码PNG数据

  • 标题: PNG图片文件头结构
  • 作者: 耀鳞光翼
  • 创建于 : 2025-01-02 00:43:00
  • 更新于 : 2025-01-02 23:31:59
  • 链接: https://blog.lightwing.top/2025/01/02/PNGFormat/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论