kernel_zimage_unpack
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 вручную.