Skip to content

zsteg

zsteg 是一款开源的命令行隐写分析工具,主要用于检测和提取 PNG 和 BMP 图像文件中隐藏的机密数据。它能够自动化测试多种常见的隐写算法,是进行文件格式分析和数据取证时的核心利器。

1. 核心功能与支持范围

zsteg 通过暴力穷举和模式匹配的方式,自动探测图像中可能存在的隐藏信息。其核心检测能力包括:

  • LSB 隐写检测: 支持 1 到 8 位的最低有效位(LSB)或最高有效位(MSB)隐写。

  • 通道组合分析: 可自由组合 RGB、RGBA、Alpha 通道进行扫描。

  • 多维遍历顺序: 支持按 xy(从左到右,从上到下)、yx(从上到下,从左到右)等不同像素坐标顺序读取。

  • 特定算法识别: 内置对 zlib 压缩数据、OpenStego、Camouflage、以及基于调色板的 LSB 隐写(如 EZStego)的检测签名。

2. 安装方法

zsteg 是基于 Ruby 开发的,因此需要通过 gem 包管理器进行安装:

Bash

# 安装 zsteg
gem install zsteg

3. 基础与高频用法

在大多数情况下,使用默认配置即可快速扫描图像中明显隐藏的文本或文件结构。

3.1 默认快速扫描

运行基本命令后,zsteg 会尝试最常见的隐写组合(如 b1,rgb,lsb,xy),并输出发现的 ASCII 文本或文件头。

Bash

zsteg image.png

3.2 深度全面扫描 (-a)

如果默认扫描未发现线索,可以使用 --all 参数强制 zsteg 穷举所有支持的通道、位数和读取顺序组合。注意:此操作耗时较长,输出内容极多。

Bash

zsteg -a image.png

3.3 提取特定通道的数据 (-E)

当扫描结果显示某个特定配置(例如 b1,rgb,lsb,xy)中存在有意义的数据(如 ZIP 压缩包或 ELF 可执行文件)时,需要将其以二进制形式提取出来,重定向保存到本地。

Bash

# 提取数据并保存为 output.bin
zsteg -E "b1,rgb,lsb,xy" image.png > output.bin

4. 高阶参数与载荷标识符解析

zsteg 的输出结果和 -E 提取参数严重依赖于载荷标识符(Payload Identifier)。理解这些标识符的含义是精准定位数据的关键。

一个典型的载荷标识符格式为:b1,rgb,lsb,xy,其拆解如下:

参数类别 标识符示例 含义解释 命令行对应参数
比特数 (Bits) b1, b2, b8 每次从像素通道中提取的比特位数(1-8位)。b1 最常见。 -b 1, -b 8
通道 (Channels) r, g, b, rgb, rgba, a 提取数据时使用的颜色通道组合。 -c rgb, -c a
取位方式 (Bit Order) lsb, msb lsb 为最低有效位,msb 为最高有效位。 --lsb, --msb
遍历顺序 (Pixel Order) xy, yx, xyb xy: 横向逐行扫描;yx: 纵向逐列扫描;带有 b 通常表示反向。 -O xy, -O yx

其他常用命令行控制参数

  • -l, --limit N: 限制输出的字节数。当隐藏的数据是一段非常长的文本时,可以使用此参数截断输出,避免终端刷屏(例如:zsteg -l 256 image.png)。

  • -v, --verbose: 启用详细输出模式。显示扫描的进度、内部错误以及更详细的检测匹配过程,有助于排查为何某些组合被跳过。

  • --invert: 反转提取出的所有比特。在某些对抗性较强的隐写中,数据可能在嵌入前被按位取反,此参数可直接进行还原。

5. 典型分析工作流

  1. 第一步:探测与定性。 直接执行 zsteg target.png 观察是否出现清晰的明文或已知文件头(如 PK\x03\x04 表示 ZIP,\x89PNG 表示内嵌图片)。

  2. 第二步:精准提取。 记录下存在有效数据的配置字符串(例如:发现 b2,b,lsb,yx .. file: Zip archive data)。

  3. 第三步:重定向输出。 执行 zsteg -E "b2,b,lsb,yx" target.png > hidden.zip 将文件无损剥离。

  4. 第四步:兜底扫描。 如果毫无头绪,最后使用 zsteg -a target.png 进行全面爆破,并配合 grep 过滤关键字。