虽然 RE 是嵌入式设备,但我遇到了问题 - 我需要修补内核中没有可用资源的检查。解压缩内核和二进制补丁进行得很顺利。但是,我无法将 vmlinux 重新打包到 zImage/bzImage 中。
我使用extract-vmlinux
(修改为在此处显示偏移量)提取内核:
$ ../../extract-vmlinux zImage > vmlinux
Found valid magic - decompressed using unlzma (tail -c+15967 "zImage" | unlzma)
Header at: head -c15966
Compressed at: tail -c+15967
$ binwalk zImage
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
15966 0x3E5E LZMA compressed data, properties: 0x5D, dictionary size: 67108864 bytes, uncompressed size: -1 bytes
接下来,没有任何修改,我想重新压缩它并保留标题,据我所知它有解压代码:
$ cat <(head -c15966 zImage) <(lzma -z < vmlinux) > zImage-repacked
$ ls -l
-rw-r--r-- 1 user user 3032080 Jun 5 22:32 zImage
-rw-r--r-- 1 user user 3024065 Jun 6 00:04 zImage-repacked
$ binwalk zImage-repacked
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
15966 0x3E5E LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: -1 bytes
图像短了约 8k,这并不让我担心(因为我的压缩可能更加激进)。但是,图像现在已损坏:
$ ../../extract-vmlinux zImage-repacked > /dev/null
extract-vmlinux: Cannot find vmlinux.
我还发现,extract-linux
脚本管一切后,偏移unlzma
,但有9441个字节的东西,其unlzma
忽略。删除后,我得到一个纯存档,它与之后保存的大小相匹配:
$ tail -c+15967 zImage | head -c-9441 | unlzma > /dev/null ; echo $?
0
$ tail -c+15967 zImage | head -c-9441 | unlzma | wc --bytes
13871216
$ tail -c+15967 zImage | head -c-9437 | tail -c4 | od -i --endian=little
0000000 13871216
0000004
我知道经典的智慧是“你必须重新编译”,但我们在重新编译 - 这是不可能的;)
我怎样才能将修改后的 vmlinux 重新打包回 LZMA-zImage?