逆向工程文件格式 - ImageLink

逆向工程 文件格式 解密 解压 x64dbg
2021-06-18 04:14:40

我有一些技术文档,它们以通用 Windows 查看器和数据库的形式提供。数据库包含不同的“书籍”,由一堆文件表示:

  • book.bbi - 书籍索引,即书中有哪些页面
  • 一堆.bli的 - 页面上的文本条目,这是一个猜测
  • 一堆.ilg的 - 页面上的媒体,这也是猜测

所有这些文件都有一个纯文本头,剩下的是以某种方式压缩或加密的数据:

upd: data_header其实就是数据的未压缩长度 在此处输入图片说明

我尝试运行 binwalk 和 XorSearch,但没有成功。我想现在我必须调试它,但我对它非常非常陌生。我正在使用 x32dbg 和 xAnalyzer 插件。我尝试在 ReadFile 上设置断点并从那里进行跟踪,但它产生了一个非常大的日志。但是我可以看到它使用了crush32.dll——“旧的C/Win32压缩库”并运行了一些ors/xors和字节移位(shr),这有点强化了我对压缩/加密使用的想法。 在此处输入图片说明

所以我的问题是我如何从这里接近它?我如何至少使用相应的指令转储所有字符串,即达到这个字节混乱变成可读字符串的程度?我完全被困住了。提前致谢!

2个回答

crush32.dll从互联网上抓了一些,它有一些非常有趣的导出:

  • cxBufDecrypt
  • cxCompressFile
  • cxExpandFile
  • cxBuf2BufCompress
  • cxBuf2BufExpand

我会在所有这些上设置断点,让您的程序运行,等待 bp 命中,检查堆栈参数以查找输入/输出缓冲区,让函数运行,然后查找可读数据。

这是我用来解压的代码。它采用Crush32.cshttps://github.com/cyberjunk/meridian59-dotnet/blob/c45a65552333509220b11b41ecc46d75023b5acd/Meridian59/Files/BGF/BgfBitmap.cs开泰结构https://kaitai.io/)裁文件. 它应该适用于 book.bbi 并且可能也适用于其他格式,已经很长时间了,所以我不记得在解压缩和修改这些文件时遇到的所有困难。

foreach (string dir in Directory.EnumerateDirectories(@"F:\database\komatsu")) {
    foreach (string file in Directory.EnumerateFiles(dir, "book.bbi")) {
        Console.WriteLine("Decompressing " + file);
        Bbi03 page = Bbi03.FromFile(file);
        
        byte[] decompressedData = new byte[(int)page.UncompressedLength1];
        bool status = Crush32.Decompress(page.Data, 0, decompressedData, 0, (int)page.UncompressedLength1, (int)page.CompressedLength);
        Console.WriteLine(status);
        File.WriteAllBytes(@"saa6d1jc\" + Path.GetFileNameWithoutExtension(file) + ".bin", decompressedData);
    }
}

这是 .ksy 文件:

book_bbi.ksy

meta:
  id: book_bbi
  endian: le
  encoding: ASCII
  
seq:
  - id: file_header
    type: str
    size: 22
  - id: date
    type: str
    size: 16
  - id: magic
    # bbi 03-04.030: [0xff, 0x7f, 0xff, 0x7f]
    # bbi 04.100: [0x88, 0x03, 0xca, 0x03]
    size: 4
  - id: data_header_start
    contents: [0x02, 0x00]
  - id: compressed_length_with_header
    type: u4
  - id: uncompressed_length
    type: u4
  - id: uncompressed_length_2
    type: u2
  - id: compressed_length
    type: u2
  - id: data_header_end
    contents: [0x00, 0x00]
  - id: data
    size: compressed_length
  

bli_03.ksy

meta:
  id: bli_03
  endian: le
  encoding: ASCII
seq:
  - id: file_header
    type: str
    size: 22
  - id: date
    type: str
    size: 16
  - id: data_header_start
    contents: [0x02, 0x00]
  - id: compressed_length_with_header
    type: u4
  - id: uncompressed_length_1
    type: u4
  - id: uncompressed_length_2
    type: u2
  - id: compressed_length
    type: u2
  - id: data_header_end
    contents: [0x00, 0x00]
  - id: data
    size: compressed_length

ilg_00.ksy

meta:
  id: ilg_00
  endian: le
  encoding: ASCII
seq:
  - id: header
    type: str
    size: 22
    size: 16
  - id: smth1
    size: 4
  - id: width
    type: u2
  - id: height
    type: u2
  - id: bits_per_pixel
    type: u2
  - id: dpi
    type: u2
  - id: smth2
    size: 12
  - id: data_length
    type: u4
  - id: smth3
    size: 12
  - id: data
    size: data_length

ilg_03.ksy

meta:
  id: ilg_03
  endian: le
  encoding: ASCII
seq:
  - id: header
    type: str
    size: 22
  - id: date
    type: str
    size: 16
  - id: smth1
    size: 4
  - id: width
    type: u2
  - id: height
    type: u2
  - id: bits_per_pixel
    type: u2
  - id: dpi
    type: u2
  - id: smth2
    size: 12
  - id: data_length
    type: u4
  - id: smth3
    size: 12
  - id: data
    size: data_length