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
3. 基础与高频用法
在大多数情况下,使用默认配置即可快速扫描图像中明显隐藏的文本或文件结构。
3.1 默认快速扫描
运行基本命令后,zsteg 会尝试最常见的隐写组合(如 b1,rgb,lsb,xy),并输出发现的 ASCII 文本或文件头。
Bash
3.2 深度全面扫描 (-a)
如果默认扫描未发现线索,可以使用 --all 参数强制 zsteg 穷举所有支持的通道、位数和读取顺序组合。注意:此操作耗时较长,输出内容极多。
Bash
3.3 提取特定通道的数据 (-E)
当扫描结果显示某个特定配置(例如 b1,rgb,lsb,xy)中存在有意义的数据(如 ZIP 压缩包或 ELF 可执行文件)时,需要将其以二进制形式提取出来,重定向保存到本地。
Bash
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. 典型分析工作流
-
第一步:探测与定性。 直接执行
zsteg target.png观察是否出现清晰的明文或已知文件头(如PK\x03\x04表示 ZIP,\x89PNG表示内嵌图片)。 -
第二步:精准提取。 记录下存在有效数据的配置字符串(例如:发现
b2,b,lsb,yx .. file: Zip archive data)。 -
第三步:重定向输出。 执行
zsteg -E "b2,b,lsb,yx" target.png > hidden.zip将文件无损剥离。 -
第四步:兜底扫描。 如果毫无头绪,最后使用
zsteg -a target.png进行全面爆破,并配合grep过滤关键字。