常见文件格式与二进制结构

常见文件格式与二进制结构,包括图片二进制魔数、exe的PE结构的观察和记录。

图片文件

PNG

PNG 是一种无损压缩格式。其魔数为 89 50 4E 47 0D 0A 1A 0A。各字节含义为:

  • 89:确保文件不会被旧式文本处理程序误读为文本
  • 50 4E 47:ASCII “PNG”
  • 0D 0A:CRLF 换行符,用于跨平台兼容
  • 1A:EOF 控制字符
  • 0A:再一个换行符

其文件内容由若干 IHDR块 (长度 4字节 + 类型 4字节 + 数据 + CRC 4字节) 组成,存储图片宽、高、位深、颜色类型等关键信息。

JPG/JPEG

JPG 和 JPEG 没有任何技术上的区别。它们指向的是同一种文件格式,其内部结构、压缩算法和图像质量完全一致。

在早期的 MS-DOSWindows 3.1 操作系统中,文件系统(FAT16)对后缀名有严格的 “8.3” 限制:文件名最多 8 个字符,后缀名最多 3 个字符。因此,为了在 Windows 上运行,.jpeg 必须缩减为 .jpg。而当时的 Macintosh (Mac)UNIX 系统没有这个限制,所以它们一直使用 .jpeg 后缀。随着 Windows 的升级(从 Windows 95 开始支持长文件名),这种限制早已消失。目前 .jpg 在 Windows 用户中更常见,而 .jpeg 在 Linux 和 Web 开发中也很流行。

两者的魔数也完全相同,文件开头与结尾各有一个。

1
2
开始标记 (SOI): FF D8
结束标记 (EOI): FF D9

JPEG / JPG 是基于段结构的压缩格式,每段以 0xFF + 类型标识开始,例如:

  • FF E0:APP0 段(通常包含 JFIF 信息)
  • FF DB:DQT 段(量化表)
  • FF C0:SOF0 段(图像帧信息,宽高、颜色通道)

WEBP

Webp 是 Google 开发的图片格式,在现代互联网中十分常见。其魔数为 52 49 46 46 XX XX XX XX 57 45 42 50

其文件体段结构(12字节)包含三部分:

  • 前 4 字节RIFF(参考 RIFF 容器格式)

  • 接下来的 4 字节:文件大小(小端序)

  • 再接 4 字节WEBP 标识 WebP 文件

GIF

一种动态图片格式,其魔数为ASCII码的 GIF87aGIF89a 区分不同的版本。

其文件体由逐帧图像+压缩数据块组成,具体包含三个组成部分:

  • Logical Screen Descriptor:逻辑屏幕描述符,7字节。包含宽度、高度、全局调色板标识、颜色深度

  • Image Descriptor:每帧的起始信息

  • 数据块:LZW 压缩的图像数据和可选扩展块(如注释、动画控制等)

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy