我有一些技术文档,这些文档以通用Windows查看器和数据库的形式提供。数据库包含不同的“书”,它们由一堆文件表示:一堆.bli-页面上的文本条目,这是一个猜测

一堆.ilg--页面上的媒体,这也是一个猜测

这些文件具有纯文本标题,剩下的是通过某种方式压缩或加密的数据:

upd:data_header实际上是数据的未压缩长度


我尝试运行binwalk和XorSearch,但没有成功。我想现在我必须调试它,但是我对此非常,非常不熟悉。我将x32dbg与xAnalyzer插件一起使用。我尝试在ReadFile上设置一个断点并从那里进行跟踪,但是它会产生非常大的日志。但是,我看到它使用了cruss32.dll-“旧的C / Win32压缩库”并运行了一些ors / xor和字节移位(shr),这在一定程度上加强了我对压缩/加密使用的看法。


所以我的问题是如何从这里开始?我至少如何使用相应的指令转储所有字符串,即达到该字节混乱成为可读字符串的地步?我绝对被困住了。提前谢谢!

评论

这不是一个真正的答案,但是您是否研究了加密功能的可执行文件? (crush32.dll外部)。我对rush32.dll不熟悉,但是您还可以在其导出函数上设置断点,并转储每个调用的输入/输出。

@wisk,谢谢!我记得rush32有一些像cxOpen之类的功能,可能值得研究。以及我如何确定特定功能是加密的?寻找各种变化等吗?另外我的可执行文件不包含函数名,都只是子函数。*** :(

您是否对文件格式进行了反向工程?我正在寻找相同的:)希望有更多关于文件格式的信息。

@loluengo我中途放弃了。有一个C#库可以解压缩Crush32,您可以在这里找到它:github.com/cyberjunk/meridian59-dotnet/blob/master/Meridian59/………在我的情况下,经过解压缩后,我无法恢复其他专有文件格式,因此我采用了另一种方法。

#1 楼

我从互联网上抢了一些crush32.dll,它有一些非常有趣的出口: />
我将在所有它们上设置一个断点,让您的程序运行,等待bp命中,检查堆栈参数以查找输入/输出缓冲区,让函数运行,然后查找可读数据。

评论


谢谢!我在crunch32函数上放置了断点,发现它在程序启动时运行cxInit,然后在读取文件的数据块后运行cxBuf2BufInit和cxBuf2BufExpand。跟踪cxBuf2BufExpand的执行将导致记录324000条指令。我还搜索了这些说明,发现这是90年代初创建的“ Crusher!Data Compression Toolkit”。可以找到很多关于如何解压缩它的代码实现,但是到目前为止,当我尝试解压缩时,我只从美眉32.dll中得到内存分配错误。

–智能土豆
19年3月6日在22:50



好的,我已经成功解包.bbi和.bli。一旦我也解压缩.ilg,将提交详细的帖子。

–智能土豆
19 Mar 7 '19 at 2:18

#2 楼

这是我用于解压缩的代码。它使用来自https://github.com/cyberjunk/meridian59-dotnet/blob/c45a65552333509220b11b41ecc46d75023b5acd/Meridian59/Files/BGF/BgfBitmap.cs和Kaitai Struct(https://kaitai.io/)的Crush32.cs进行切片。 。它应该适用于book.bbi,也可能适用于其他格式,已经很长时间了,所以我不记得在解压缩和修改这些文件时遇到的所有困难。 .ksy文件如下:
book_bbi.ksy
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);
    }
}

bli_03.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
  

ilg_00.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

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