png图片隐写
png图片隐写
首先了解png图片的组成:
PNG是一种支持无损数据压缩的光栅图形文件格式。结构由一个文件署名(Signature)和数据块(Chunk)构成,数据块分关键数据块(IHDR、PLTE、IDAT、IEND)和辅助数据块两种。
png文件头:
文件头是8个字节:
89 | 避免被识别为文本的标识符 |
---|---|
50 4E 47 | PNG字符串 |
0D 0A | CLRF换行符 |
1A | DOS系统中文件结束符 |
0A | LF换行符 |
文件头之后是一系列块, 每个块都传达有关图像的某些信息。块将自己声明为关键块或辅助块,并且遇到不理解的辅助块的程序可以安全地忽略它。
块的组成:一个块由四部分组成:长度(4字节,大端),块类型/名称(4字节),块数据(长度字节)和CRC(循环冗余代码/校验和;4 字节 )。 CRC 是根据块类型和块数据计算的网络字节顺序 CRC-32,但不是长度。
块的名称:块类型被赋予四个字母大小写敏感的 ASCII 类型/名称;比较FourCC。名称中不同字母的大小写(字符数值的第 5 位)是一个位字段,它为解码器提供有关其无法识别的块的性质的一些信息。
- 第一个字母的大小写表示该块是否重要。如果第一个字母是大写,则该块是关键的;如果不是,则该块是辅助的。关键块包含读取文件所需的信息。如果解码器遇到它无法识别的关键块,它必须中止读取文件或向用户提供适当的警告。第二个字母的大小写指示该块是“公共”(在规范或特殊用途公共块的注册表中)还是“私有”(未标准化)。大写是公开的,小写是私有的。这确保了公共和私有块名称永远不会相互冲突(尽管两个私有块名称可能会冲突)。第三个字母必须大写以符合 PNG 规范。它是为将来的扩展而保留的。解码器应该将第三个字母小写的块与任何其他无法识别的块一样对待。第四个字母的大小写表明该块是否可以安全地被不识别它的编辑器复制。如果是小写,则无论文件修改的程度如何,都可以安全地复制块。如果是大写,则仅当修改未触及任何关键块时才可以复制。
关键数据块类型如下:
IHDR(文件头数据块):必须作为第一个数据块,用13个字节表示图像数据的基本信息。
PLTE:包含调色板:颜色列表。
IDAT:包含图像,该图像可以分割为多个 IDAT 块。这种分割会稍微增加文件大小,但可以以流方式生成 PNG。 IDAT块包含实际的图像数据,它是压缩算法的输出流。
- 其实这里还想补充一下关于png图片中的每一个像素是如何构成的哇:图像数据块中的像素数据按照扫描行的方式组织,每个扫描行的像素数据按照颜色类型和位深度进行编码。对于 RGB 色彩模式,通常每个像素由 3 个字节表示(分别表示红、绿、蓝分量),而对于 RGBA 色彩模式,每个像素通常由 4 个字节表示(分别表示红、绿、蓝和透明度分量)。具体的编码方式取决于图像的色彩模式、位深度以及使用的压缩算法。
- 比如如果是RGB色彩模式哇:
相应的通道哇:(红色通道)(绿色通道)(蓝色通道)
像素数据:[红] (255, 0, 0)
实际字节表现:\xFF\x00\x00
IEND:00 00 00 00 49 45 4E 44 AE 42 60 82,表示 PNG 文件结束,必须放在最后面,且 Chunk Data 为空。
就打开010在其分好的IDAT块的后面,在IEND前面塞入我们要加密的信息就好了。
分离的方法:(在kali里面)
指令:
binwalk -e 123.png
即可
还有一个方法。直接靠一个指令就好了
copy /b 原图.png + 加密的文件.zip 生成的图片.png
结果就是会直接在png的字节码后面添加上zip的字节码,解决方法也是直接binwalk就好。
此外,如果是中文的文件的话会有问题,可能是kali或者binwalk的原因吧。我直接单独用010提取出来的文件没有问题。
也就是说,在Windows中可以直接用一个指令来将文件的字节复制到一起:copy /b
命令会将指定的文件直接按字节进行复制,不管文件的内容是文本还是二进制数据。也就是说,即使文件中包含了特殊字符或者其他类型的数据(比如 ZIP 文件或者 PNG 文件),copy /b
命令也会简单地将它们的字节一一复制到目标文件中,而不会考虑其内容的含义。其合成的结果就是单纯包含了合成的两个文件的连续字节流。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现