将 vmlinux 重新打包成 zImage/bzimage

逆向工程 二元分析 linux
2021-07-10 02:15:08

虽然 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

0个回答
没有发现任何回复~