【问题标题】:Decompressing Linux zImage解压 Linux zImage
【发布时间】:2017-06-22 04:31:12
【问题描述】:

我正在尝试解压缩 zImage。我有一个从闪存芯片中转储的固件二进制文件。用 binwalk 分析得到如下结果:

$ binwalk flash_dump.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
352832        0x56240         Linux kernel ARM boot executable zImage (big-endian)
10617408      0xA20240        Linux kernel ARM boot executable zImage (big-endian)
10630468      0xA23544        device tree image (dtb)

我尝试分离第一个 Linux zImage:

$ dd if=flash_dump.bin of=zImage bs=1 skip=352832 count=10264576

10264576+0 records in
10264576+0 records out
10264576 bytes (10 MB, 9.8 MiB) copied, 13.7267 s, 748 kB/s

确保它仍然是 zImage:

$ file zImage

zImage: Linux kernel ARM boot executable zImage (big-endian)

搜索 gZip 标头:

$ arm-none-eabi-objdump -EB -b binary -D -m armv5t zImage | grep 8b1f

15e4c:  b81c8b1f    ldmdalt ip, {r0, r1, r2, r3, r4, r8, r9, fp, pc}
401f8:  0b3d2bfe    bleq    0xf8b1f8

我似乎找不到 gZip 标头。

如何解压缩 zImage?我想通过IDA Pro之类的反汇编程序来查看。

【问题讨论】:

标签: linux-kernel reverse-engineering compression disassembly firmware


【解决方案1】:

zImage 是大端的(参见 binwalk 结果)。您应该改为使用 grep 搜索 1f8b

【讨论】:

    【解决方案2】:

    (不能评论)

    @Gao Yuan notthis 特定情况下是正确的,因为它是由 header byte tag(也称为 MAGIC)组成的正在查找的 2 个单独(8 位)字节(而不是 16 位值),第一个是 1f,第二个是 8b,通常后面跟着 08(压缩方法)。

    IE。因为它是一个 MAGIC,所以在写入/创建时它是 not 字节交换的。它必须在任何字节序平台上都能被识别,否则它就违背了成为 MAGIC 的目的

    我刚刚在 RPi 上进行了测试:

    xxd /boot/kernel.img | grep '1f8b 08'(偏移量 0x4730 - 内核 zImage)

    xxd /boot/kernel8.img | grep '1f8b 08'(偏移量 0 - 标准 .gz)

    还有一个用于 Tadpole VME SBC 的 Linux-m68k 内核:

    xxd vmlinux.gz | grep '1f8b 08'(偏移量 0 - 标准 .gz)


    OP:您在1f8b 之后找到的下一个字节是0b,我想说的是压缩方法字节(只是不是标准的)。但是有些问题,因为 zImage 中的 15K HEX 有点过多(RPi zImage 内核大约为 4-5K HEX),但如果这是唯一的值,那么这就是 Gzip 头文件。

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 2018-07-04
      • 2018-04-06
      • 1970-01-01
      • 2022-11-11
      • 2013-02-14
      • 2011-10-31
      • 2017-08-25
      • 1970-01-01
      相关资源
      最近更新 更多