代码之家  ›  专栏  ›  技术社区  ›  David

检测文件压缩

  •  3
  • David  · 技术社区  · 15 年前

    我必须读取第三方应用程序在Acess 2000数据库中存储的一些数据。小贩再也不来问问题了。

    其中一个表包含似乎要压缩的图像数据,因为原始应用程序可以将blob字段的内容导出到xls导出文件中的嵌入png图像。

    我已经使用ADO和Delphi(TADOBlobStream)提取了记录的内容,将其保存到磁盘,并用十六进制编辑器打开它。

    十六进制的前100个字符如下

    F8 1B 00 07 C0 24 27 01 40 7F 20 EC 5D 24 2D 88 5C F0 A7 49 91 4A C4 EA 85 D2 98 6A B5 79 D7 B7 2B D5 48 F8 1B 00 07 C0 24 27 01 40 7F 20 EC 5D 24 2D 88 5C F0 A7 49 91 4A C4 EA 85 D2 98 6A B5 79 D7 B7 2B D5 48 1A 9A C8 D3 54 E3 E4 F5 29 C6 97 22 95 6A 8E 10 BD 3E 4B 0B 11 AA 6D A8 87 92

    有人能告诉我这是否符合常用的压缩算法吗。第三方应用程序似乎会使用zlib编码方法,因为在其bin目录中存在一个编码dll。但是使用zlib进行解压缩不会产生PNG。仅供参考,保存的文件大约是嵌入到XLS中的PNG文件大小的20%。

    谢谢

    5 回复  |  直到 15 年前
        1
  •  5
  •   Will Bickford    15 年前

    尝试差异攻击。

    1. 如前所述,使用报表/程序从数据库中提取两个图像。
    2. 对PNG文件执行二进制差异。
    3. 对数据库中的源blob执行二进制差异。

    比较blob格式和PNG格式文件之间的差异。这将有助于确定blob数据是完全不同的格式还是只是包装器。

    也可以尝试比较两个不同的图像点,看看有什么变化和什么(如果有的话)保持不变。

        2
  •  0
  •   Havenard    15 年前

    通用提取器可以给你一些答案。它是开源的。 http://legroom.net/software/uniextract

        3
  •  0
  •   Joshua    15 年前

    当你用zlib解压时,你说它不是PNG。你检查过其他的图像格式吗?可能是JPEG或GIF,甚至是位图?

        4
  •  0
  •   Loren Pechtel    15 年前

    我不知道如何测试它,但Pkware至少曾经用于市场(可能他们仍然这样做,但我已经很久没有看)一个压缩机的目的是纳入一个程序。它设计用于处理内存中的原始数据流,因此它不会在压缩的数据上留下任何明显的签名。

    我会试着把你的数据流输入他们的解压器(我知道有两个完全不同的版本),看看他们是否吐出了更合理的东西。

    他们的SDK在这里: http://www.pkware.com/software-developer-tools-margin/software-developer-kits

    我用的是旧的dos时代的版本,Windows版本太贵了,我从来没有处理过。

        5
  •  0
  •   itsadok    15 年前

    我对此很好奇,所以决定去看看。我需要把它转换成二进制形式,所以为了节省下一个家伙的工作,我用python做了这个。希望有帮助:

    #!/usr/bin/python
    from zlib import decompress; 
    
    f = open('/tmp/data', 'w+'); 
    s = "";
    for b in [int(x, 16) for x in ("F8 1B 00 00 07 C0 24 27 01 40 7F 20 " +
     "EC 5D 24 2D 88 5C F0 A7 49 91 4A C4 EA 85 D2 98 6A B5 79 D7 B7 2B " +
     "D5 48 F8 1B 00 00 07 C0 24 27 01 40 7F 20 EC 5D 24 2D 88 5C F0 A7 " +
     "49 91 4A C4 EA 85 D2 98 6A B5 79 D7 B7 2B D5 48 1A 9A C8 D3 54 E3 " +
     "A3 E4 F5 29 C6 97 22 95 6A 8E 10 BD 3E 4B 0B 11 AA 6D A8 C6 87 92".split(" ")]:
      s += chr(b);
    
    s = decompress(s);
    f.write(s);
    f.close();