You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何检测文件中的隐藏图像?Bash脚本实现方案问询

检测隐藏图像的实用方案:文件头/尾对照表+脚本思路

嘿,这个需求我之前折腾过!要从混合数据里抠出隐藏的图像,文件头/尾对照表是基础,另外还有几个比纯grep更靠谱的方案,给你详细说说:

一、常见图像格式的文件头&文件尾对照表

下面是主流图像格式的十六进制标识(注意有些格式的头有变体,尾可能无固定值):

  • JPEG/JPG
    • 文件头:FF D8 FF(通用起始,细分的话JFIF是FF D8 FF E0,EXIF是FF D8 FF E1
    • 文件尾:FF D9(固定结束标识)
  • PNG
    • 文件头:89 50 4E 47 0D 0A 1A 0A(独特的起始,避免被误判为文本)
    • 文件尾:49 45 4E 44 AE 42 60 82(固定结束块)
  • GIF
    • 文件头:47 49 46 38 37 61(GIF87a)或47 49 46 38 39 61(GIF89a)
    • 文件尾:00 3B(固定结束符)
  • BMP
    • 文件头:42 4D(对应ASCII的"BM")
    • 文件尾:无固定值(需从文件头的第3-6字节读取总文件长度来确定提取范围)
  • TIFF
    • 文件头:49 49 2A 00(小端字节序II)或4D 4D 00 2A(大端字节序MM)
    • 文件尾:无固定值(依赖内部的IFD图像目录结构确定结束位置)

二、除了grep之外的可行方案

1. 用现成工具直接提取(最省心)

别自己造轮子了!foremost或者scalpel这类工具就是专门干这个的——它们内置了几乎所有常见文件格式的头/尾规则,能自动扫描混合数据,完整提取出隐藏的文件。

在Bash里直接跑命令就行:

# 安装(Debian/Ubuntu)
sudo apt install foremost
# 提取图像到指定目录
foremost -i 你的目标文件 -o 提取结果目录

运行完之后,结果目录里会按格式分类存放提取出的图像,比自己写脚本高效N倍。

2. 自己写脚本的优化思路

如果一定要自己实现,纯grep处理二进制文件容易踩坑(比如null字节干扰匹配),可以试试这个流程:

  1. 先把文件转成连续的十六进制文本,方便搜索:
xxd -p 目标文件 > hex_dump.txt
  1. 定位文件头的起始位置(比如找第一个JPEG头):
start_line=$(grep -n "ffd8ff" hex_dump.txt | head -n 1 | cut -d: -f1)
  1. 从起始位置往后找最近的文件尾:
end_line=$(grep -n "ffd9" hex_dump.txt | awk -v start="$start_line" '$1 > start {print $1; exit}')
  1. 计算字节偏移,用dd提取完整图像:
# 每行xxd输出对应30字节(60个十六进制字符)
start_byte=$(( (start_line - 1) * 30 ))
# ffd9是2字节,对应4个十六进制字符,所以调整结束位置
end_byte=$(( start_byte + (end_line - start_line) * 30 + 2 ))
dd if=目标文件 of=提取的图像.jpg bs=1 skip=$start_byte count=$(( end_byte - start_byte + 1 ))

这个方法比直接grep二进制文件稳定很多。

三、注意事项

  • 对于BMP、TIFF这类无固定尾的格式,需要解析文件头里的长度字段来确定提取范围,比如BMP头的第3-6字节是文件总大小,直接提取对应长度即可。
  • 如果目标文件里有多个同格式的隐藏图像,上面的脚本只会提取第一个,你可以循环遍历所有匹配的头位置来批量提取。

内容的提问来源于stack exchange,提问作者Alex_DeLarge

火山引擎 最新活动