如果图片具有Alpha通道(例如,带有透明层的PNG),则它允许您在没有Alpha通道的情况下查看图像或单独查看Alpha通道。它还提供了一个专注于Alpha通道的叠加层,还使您可以看到其余的内容。
如果图片的边框填充过多,例如使用JPEG(未与网格对齐的图片),则它将扩展图像以显示边框填充。在过去的几个月中,我一直看到第三种隐藏像素的数量有所增加:PNG填充。几乎所有这些目击事件都与隐写术挑战,夺旗法医比赛以及类似的难题有关。(自从人们因COVID-19而开始待在家里以来,似乎对安全性,隐写术和相关主题的兴趣日益增加。)如果您对这些类型的挑战感兴趣,则有很多起点。例如:Matt Kmety撰写的“ 初学者CTF指南:在图像中查找隐藏的数据 ”
“ 在图像隐藏文字 ”由CTF资源
FourOctets撰写的“ CTF花絮:第1部分-隐写术 ”
Root Me的Hacking ChallengeFotoForensics的元数据和隐藏像素分析仪可以帮助解决其中一些挑战。我已经修改了“隐藏像素”分析器,以查找可以隐藏在PNG图像中的两种以上数据:列填充和未使用的行。
(这是一个技术博客文章,内容涉及PNG如何编码像素,添加列填充时以及如何创建行填充。)
PNG像素编码PNG以光栅格式存储像素。每个像素具有1、3或4个颜色通道,具体取决于它是单色的(还是调色板索引),RGB(红色,绿色,蓝色)还是RGBA(带有透明度的alpha通道的RGB)。
每个像素从左到右,然后从上到下依次存储。第一个像素始终是左上角。下一个像素位于第一个像素的右边,依此类推,直到解析器到达行尾为止。然后,解析从下一行的最左侧像素开始。
每行的开头都有一个用于过滤器的额外字节。这用于产生更好的压缩。但是,过滤器与每个图像行的字节数或颜色无关。作为格式去,PNG是几乎一样简单,因为它可以得到的。有一个标头(IHDR),它定义图像的宽度,高度,颜色分量等。然后是压缩栅格像素的IDAT块(一个或多个)。要渲染PNG,您需要处理IHDR并分配一个图像缓冲区,对IDAT数据进行充气(解压缩),然后将像素一个一地渲染到图像缓冲区中。
PNG列填充大多数PNG图片使用全彩。这意味着每个颜色分量1个或2个字节,其中每个分量1个字节是最常见的。尽管这些颜色分量存储为字节,但通常用位数表示:8位或16位深度。8位RGB:每个像素3个字节。如果图像宽为1,000像素,则每行3,001字节。(RGB三元组中的3,000字节,外加1字节用于行过滤器。)
8位RGBA:每个像素四个字节。
16位RGB:“深色”图像表示每个分量2个字节,因此每个像素6个字节。由于大多数监视器显示的都是8位深度(如果是移动设备或笔记本电脑,则为8位深度),这意味着这些通常是特殊情况的图片。(罕见。)
16位RGBA:具有alpha通道的深色表示每个像素8个字节。深度为8位或16位时,每行都不会浪费空间。每个字节都被使用。
但是,PNG也支持较低的位深度。其中包括1位(共2种颜色),2位(共4种颜色)和4位(共16种颜色)。使用这些低位编码选项时,没有颜色。如果需要颜色,请使用调色板(PLTE),并将编码后的值视为调色板索引。否则,1位是单色(黑白)。2位具有黑色,白色和两个灰色。4位使用黑色,白色和14个灰度级。
对于低位深度,每个字节有多个像素。(4位表示每字节2个像素。2位表示4像素,而1位表示8像素。)这是发生水平填充的地方。可以帮助优化压缩的线滤波器必须本身就是一个字节。这意味着即使某些位未使用(填充),每一行也必须填写最后一列的字节。1位深度:每种颜色消耗1位。这意味着该行中的最后一个字节可以有足够的数据,最多可以增加7个列。
2位深度:行中的最后一个字节可以填充最多3个其他列。
4位深度:行中的最后一个字节可以填充另外1列。如果图像宽度是奇数,则您知道有足够的数据用于另外一列。低位PNG图像非常罕见。大多数是小图标或具有典型图标宽度的小部件,例如16或32列。这意味着没有多余的数据列(因为宽度均匀地填充到每行的字节数中)。但是,如果您确实碰到过一个,那么您就会知道每行可能会有额外的位被隐藏。
FotoForensics的新型“隐藏像素”解码器会检查这些潜在的额外列,并将其重新添加。
PNG后像素填充尽管列填充非常少见,但像素后填充通常用于各种游戏,难题和挑战。运作方式如下:从高大的PNG图片开始。(任何深度都可以。)
在图像底部插入您想要隐藏的任何内容。
保存PNG。使用非隔行编码。(我稍后将介绍隔行扫描。)
使用十六进制编辑器编辑PNG。
找到IHDR块。(它应该在文件开头附近,并带有字母“ IHDR”。)
IHDR之后的前四个字节为宽度;不要碰那个。后四个字节是高度;通过降低此值使其更短。这是发生的情况:当您查看图像时,解码器将加载IHDR并为指定的宽度和高度分配图像缓冲区。然后,它解码IDAT块并逐行存储像素。当图像缓冲区已满时,解码器停止。
尽管解码器已停止,但IDAT缓冲区中仍存在未压缩的字节。几乎每个在那里的PNG解码器都会静默忽略这些未使用的字节。结果,未使用的字节将被忽略。PNG底部的消息现在已隐藏,因为修改的图像高度阻止了它的呈现。
FotoForensics的新型“隐藏像素”解码器会检查可用的填充量。如果足以填充1或更多行像素,则相应地增加了图像高度。这是公共FotoForensics服务的三个示例。每个挑战都来自使用图像隐写术的某种地理缓存或捕获标志挑战。(单击以查看FotoForensics上的任何图片。)
这是呈现隐藏行的每个图像的样子:
这些图像中的每一个都包含额外的字节,这些额外的字节可以呈现为图片底部的其他行。这些示例在隐藏行中包含文本,GPS坐标以及其他部分拼图。
填充限制如果要使用这些填充方法来编码数据,请牢记以下几点:隔行扫描。PNG支持一种称为“ Adam7 ” 的隔行编码方法。对于非隔行扫描的PNG文件,可以隐藏PNG底部任意数量的行。使用Adam7,只能隐藏1行,并且必须是偶数行。否则,隔行扫描图案会移位并且图像会损坏。
垂直的。PNG从左到右然后从上到下存储所有像素。更改PNG的宽度将导致图像歪斜。唯一的情况不是低位深度图像,即使如此,也只能隐藏有限数量的列(每行位)。
非图片内容。任何数据都可以存储在低位水平填充中,也可以存储在最后一个像素的数据之后。如果最后一个像素的数据之后有足够的额外字节,则隐藏像素分析器将假定这些字节代表更多行。但是,最后一行之后的数据可以用于任何东西,它不需要存储像素数据。(公共的FotoForensics服务仅在少数情况下会遇到多余的字节包含非图像内容的情况。)新的隐藏像素分析器将尽可能扩展PNG文件,显示任何隐藏的列或行。让游戏开始!