kernel_zimage_unpack icon indicating copy to clipboard operation
kernel_zimage_unpack copied to clipboard

Kernel Z-Image Unpack

Что это?

unpack.sh - это простенький скрипт позволяющий работать с Linux Kernel zImage (ARM, Little Endian) от MTK (Mediatek). Предположим что вы вытащили из boot.img или recovery.img образ Linux Kernel'а. В общем случае он состоит из самого бинарника ядра пожатого gzip'ом, dtb, loader'а и возможно некоторой служебной информации.

Возможны несколько вариантов, например:

  • По команде file recovery.img-kernel содержимое определяется как Linux kernel ARM boot executable zImage (little-endian).
  • Содержимое определяется как gzip compressed data, max compression, from Unix.

В первом случае структура файла следующая, вначале идет код boot executable, затем GZip самого ядра, затем таблица смещений и затем DTB, начинающийся с сигнатуры DTB_MAGIC - D0 0D FE ED (0xEDFE0DD0). Что представляет из себя таблица смещений?

  • DWORD (0x0)
  • DWORD (0x0)
  • DWORD (0x0)
  • Указатель на DTB_MAGIC
  • Указатель на таблицу смещений (т.е. на первый DWORD из данного списка)
  • ... (и т.п.)

Во втором случае структура проще, никаких boot executable нет, сразу идет GZip kernel'а, а затем DTB, начинающаяся с dtb-magic.

Скрипт корректно обрабатывает (по-крайней мере на тестовых примерах) оба варианта.

Запуск осуществляется следующим образом:

unpack.sh recovery.img-kernel 

В результате работы скрипта будут сгенерированы три файла:

  • 1_kernel_header.bin
  • 2_kernel_gzip.gz
  • 3_kernel_footer.bin

С названиями, думаю все понятно - в первом идет код boot executable (если он есть), во втором непосредственно чистый kernel.gz, и в третьем таблица смещений (при ее наличии) + DTB. Суммарный размер этих трех файлов должен быть равен размеру исходного recovery.img-kernel. Если это условие выполняется - значит ядро распаковано правильно.

Теперь можно разархивировать 2_kernel_gzip.gz и изучать (или модифицировать) бинарник ядра. При модификации важно, чтобы размер получившегося gz был равен размеру исходного gzip. Собрать все обратно можно так:

cat 1_kernel_header.bin 2_kernel_gzip.gz 3_kernel_footer.bin > recovery.img-kernel-new

Скрипт был написан благодаря вопросам, возникшим при общении с jemmini и hyperion70. На совершенство ни в коем случае не претендует, просто удобная "полезняшка" чтобы не запускать тот HIEW из под Wine и не резать recovery.img-kernel вручную.