如何提取附加到png文件的二进制数据?

2024-05-18 17:51:56 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我将二进制数据附加到png文件的末尾,png文件仍然是可见的。因此png文件仍然是有效文件。有没有办法从原始文件大小未记录的png文件中自动提取这样的尾随数据


Tags: 文件数据png二进制末尾办法未记录
2条回答

PNG以“IEND”块结尾。最后12个字节看起来总是一样的。因此,您可以使用:

dd if=appended.png of=extracted.png bs=1 count=$((($(od -t x1 appended.png | awk '{$1=""}1' | tr -d \\n | sed "s/00 00 00 00 49 45 4e 44 ae 42 60 82/XMATCHX/" | tr X \\n  | grep -b MATCH | cut -f1 -d:)-2)/3+12))

上面的代码比在macos上工作所需的时间稍长,macos处理grep -b的方式与GNUGREP不同

其要点是:

  • 使用dd从appended.png的开头提取计数字节
  • 通过以下方式确定计数:
    • 使用od/awk/tr将文件转换为一行上以空格分隔的字节的十六进制字符串
    • 使用sed/tr搜索IEND模式并替换为MATCH
    • 使用grep -bcut获取匹配的偏移量
    • 计算实际文件长度(减去额外空间/CR,除以每个字节3个十六进制字符/空间,对于IEND len加12)

注意:如果不是不可能的话,12字节IEND块不太可能出现在PNG中,但是上面没有检查它

那是一个有趣的运动-谢谢

您可以运行pngcheck -v YOURFILE.png,它会告诉您末尾是否有额外的字节,并以错误状态退出2

它还将告诉您文件的实际结束位置:

# Generate legitimate PNG with ImageMagick
convert -size 300x400 gradient:yellow-red orig.png

# Check its size
ls -l orig.png
-rw-r r   1 mark  staff  2509  3 May 17:47 orig.png

# Check it with `pngcheck` - exit status = 0, i.e. all ok
    File: orig.png (2509 bytes)
  chunk IHDR at offset 0x0000c, length 13
    300 x 400 image, 48-bit RGB, non-interlaced
  chunk gAMA at offset 0x00025, length 4: 0.45455
  chunk cHRM at offset 0x00035, length 32
    White x = 0.3127 y = 0.329,  Red x = 0.64 y = 0.33
    Green x = 0.3 y = 0.6,  Blue x = 0.15 y = 0.06
  chunk bKGD at offset 0x00061, length 6
    red = 0xffff, green = 0xffff, blue = 0xffff
  chunk IDAT at offset 0x00073, length 2276
    zlib: deflated, 32K window, maximum compression
  chunk tEXt at offset 0x00963, length 37, keyword: date:create
  chunk tEXt at offset 0x00994, length 37, keyword: date:modify
  chunk IEND at offset 0x009c5, length 0
No errors detected in orig.png (8 chunks, 99.7% compression).

现在在末尾添加一些垃圾:

ls -l >> orig.png

# Check the size again
ls -l orig.png
-rw-r r   1 mark  staff  8398  3 May 17:53 orig.png

# And check again - exit status =2
pngcheck -v orig.png
File: orig.png (8398 bytes)
  chunk IHDR at offset 0x0000c, length 13
    300 x 400 image, 48-bit RGB, non-interlaced
  chunk gAMA at offset 0x00025, length 4: 0.45455
  chunk cHRM at offset 0x00035, length 32
    White x = 0.3127 y = 0.329,  Red x = 0.64 y = 0.33
    Green x = 0.3 y = 0.6,  Blue x = 0.15 y = 0.06
  chunk bKGD at offset 0x00061, length 6
    red = 0xffff, green = 0xffff, blue = 0xffff
  chunk IDAT at offset 0x00073, length 2276
    zlib: deflated, 32K window, maximum compression
  chunk tEXt at offset 0x00963, length 37, keyword: date:create
  chunk tEXt at offset 0x00994, length 37, keyword: date:modify
  chunk IEND at offset 0x009c5, length 0
  additional data after IEND chunk
ERRORS DETECTED in orig.png

它还告诉您文件的实际结尾在第三行到最后一行的位置,即0x009c5。您需要在上面添加8,以考虑IEND本身的大小


顺便说一句,如果在macOS上,您可以使用自制安装pngcheck,方法是:

brew install pngcheck

相关问题 更多 >

    热门问题