我试图对HP打印机的固件进行逆向工程,因此我从板上丢弃了SPI芯片,并且有很多字符串,但是几乎总是这样:


我注意到一种模式,有时每增加8个字节FF字节一次。但是,这不是全部模式。有人知道这可能是什么吗?这不是转储错误,因为我很好地从未压缩的部分中提取了一些JPEG图像,并且多个转储生成了相同的文件。设法解压缩了这一部分并得到了它。可能是什么原因?

我将QuickBMS脚本用于LZSS算法(下面的代码)。
理想情况下,我想在python中进行操作,但是我发现的脚本没有即使使用相同的LZSS参数也可获得良好的结果。我对QuickBMS脚本不是很熟悉。

# lzss decompression function written in 100% bms scripting

set NAME string "unpacked.dat"
get ZSIZE asize
math SIZE = ZSIZE
math SIZE *= 10
log MEMORY_FILE 0 ZSIZE
callfunction LZSS_BMS_DUMP

# you must set: MEMORY_FILE (input), ZSIZE (input size), MEMORY_FILE2 (output), SIZE (max size)
startfunction LZSS_BMS_DUMP
    set EI long 12
    set EJ long 4
    set P long 2
    set rless long P
    set init_chr long 0x00

    set N long 1
    math N <<= EI
    set F long 1
    math F <<= EJ

    # pre-allocate memory for faster performances
    putvarchr MEMORY_FILE3 N 0
    for i = 0 < N
        putvarchr MEMORY_FILE3 i init_chr
    next i
    putvarchr MEMORY_FILE2 SIZE 0

    math r = N
    math r -= F
    math r -= rless
    math N -= 1
    math F -= 1

    math src = 0
    math dst = 0
    math srcend = ZSIZE
    math dstend = SIZE

    math flags = 0
    for src = 0 < srcend
        if flags & 0x100
        else
            getvarchr flags MEMORY_FILE src
            math src += 1
            math flags |= 0xff00
        endif
        if flags & 1
            getvarchr c MEMORY_FILE src
            math src += 1
            putvarchr MEMORY_FILE2 dst c
            math dst += 1
            putvarchr MEMORY_FILE3 r c
            math r += 1
            math r &= N
        else
            getvarchr i MEMORY_FILE src
            math src += 1
            getvarchr j MEMORY_FILE src
            math src += 1
            math TMP = j
            math TMP >>= EJ
            math TMP <<= 8
            math i |= TMP
            math j &= F
            math j += P
            for k = 0 <= j
                math TMP = i
                math TMP += k
                math TMP &= N
                getvarchr c  MEMORY_FILE3 TMP
                putvarchr MEMORY_FILE2 dst c
                math dst += 1
                putvarchr MEMORY_FILE3 r c
                math r += 1
                math r &= N
            next k
        endif
        math flags >>= 1
    next
    math SIZE = dst
    log NAME 0 SIZE MEMORY_FILE2
endfunction


评论

这对于按字符压缩(例如LZMA)很典型(如果我记得我的缩写正确的话)。这是从基本RLE(其中前导值或一个或多个位指示要重复的内容)开始的自然下一步。下一步是压缩位,在这种情况下,您将无法再找到纯文本。

感谢您指出正确的方向!好像实际上是LZSS。我设法解压缩了文件的一部分,显然是正确的。但是,其他一些具有相同压缩率的部分则无法正确解压缩。我想我还没有弄清楚确切的参数,或者可能是一些LZSS变体...

也许您可以在问题中显示当前代码。如果您还输入数据链接,则可能会有所帮助,因此其他人不必从屏幕快照中重新输入数据。

是的,很好,就在这里!

无法实际下载帖子中的第1个示例部分,该链接未设置为公开。

#1 楼

几年的经验之后,我重新访问了这个项目并弄清了!我提到的第二部分是有问题的,只是因为芯片转储中的压缩块之间有未压缩的块,因此,显然,它们需要分别提取和解压缩。正确地讲,我真的很喜欢《复古游戏考古学:探索旧计算机游戏》(第104页)中的解释方式(可以在Google图书上免费查看)。没有一个令人惊叹的社区,就不可能解决这个问题! :)

评论


您应该接受自己的答案。

– 0xC0000022L♦
5月29日19:53