我正在对 SJ4000 相机固件进行反转,但在打开它时我发现了一个问题。
这是我在图片上找到的标题:
00000000 42 43 4c 31 81 66 00 09 00 54 68 e0 00 2f 2b bf |BCL1.f...Th../+.|
如您所见,BCL1 是使用 LZ77 算法的“基本压缩库”(http://bcl.comli.eu/home-en.html)的标头,但我无法用它解压缩图像。
与固件头文件相比,我使用 BCL 构建了一些文件,并发现了这一点:
00000000 42 43 4c 31 81 66 00 09 00 54 68 e0 00 2f 2b bf |BCL1.f...Th../+.| < FIRMWARE
00000000 42 43 4c 31 00 00 00 09 00 00 4f 88 99 7f 45 4c |BCL1......O...EL| < LZ
00000000 42 43 4c 31 00 00 00 02 00 00 4f 88 20 03 06 90 |BCL1......O. ...| < HUFFMAN
00000000 42 43 4c 31 00 00 00 01 00 00 4f 88 99 7f 45 4c |BCL1......O...EL| < RLE
00000000 42 43 4c 31 00 00 00 0a 00 00 4f 88 56 01 64 9f |BCL1......O.V.d.| < SF
00000000 42 43 4c 31 00 00 00 03 00 00 4f 88 00 7f 45 4c |BCL1......O...EL| < RICE8
00000000 42 43 4c 31 00 00 00 04 00 00 4f 88 00 45 7f 46 |BCL1......O..E.F| < RICE16
00000000 42 43 4c 31 00 00 00 05 00 00 4f 88 00 46 4c 45 |BCL1......O..FLE| < RICE32
据此压缩算法是LZ77,除了2个字节外,它遵循相同的结构。
42 43 4c 31 < Magic Number
81 66 00 09 < unknown 2 bytes + 2 standard bytes
00 54 68 e0 < Original Size
00 2f 2b bf < Compressed Size
知道这 2 个字节是什么意思吗?
编辑:我尝试编辑那 2 个字节并用 00 00 覆盖它们,以便标头符合标准。之后尝试用BCL LZ77解压,提示分段错误:
LZ77 decompress FW96655A_ZERO.bin to test...
Input file: 3091395 bytes
Output file: 5531872 bytes
Segmentation fault
检查长度字节我得到以下结果:
0x005468E0 > Big Endian Long: 5531872
0x002F2BBF > Big Endian Long: 3091391
正如您所看到的,压缩数据长度有 4 个字节的差异,这可能会导致 Seg。过错。