Как распаковать Kernel.img при помощи скрипта mkboot

Когда я вчера писал инструкцию по установке Linux на Amlogic S905 Android TV вчера, я столкнулся с проблемой извлечения kernel.img которую я нашёл в Android прошивке, Но Google мне не помог пока я не нашёл mkboot в инструментах mkbootimg.

Но сначала давайте посмотрим, как создается kernel.img Google предоставляет сценарий на Python под названием mkbootimg, что совмещает образ ядра (Е, .g. ZImage), с корневым файловым / электронным диском и деревом устройств (DTB) файл командной строки выглядит как:

./mkbootimg --base=0 --kernel_offset=0x01080000  --kernel ${KERNEL} --ramdisk_offset=0x01000000 --ramdisk ./${ROOTFS} --second ${DTBFILE} --output ./kernel.img

Тем не менее компания AFAIK не обеспечивает сценарий «unmkbootimg» , и mkbootimg может быть использован только для создания kernel.img, его невозможно декомпилировать. Это работает для kernel.img и recovery.img. Давайте получим необходимые файлы:

git clone https://github.com/xiaolu/mkbootimg_tools

mkboot является Bash скриптом так, что мы можем использовать его сразу:

cd mkbootimg_tools
./mkboot 
<Unpack and repack boot.img tool>
----------------------------------------------------------------------
Not enough parameters or parameter error!
unpack boot.img & decompress ramdisk:
&nbsp;&nbsp;&nbsp; mkboot [img] [output dir]
&nbsp;&nbsp;&nbsp; mkboot boot.img boot20130905
Use the unpacked directory repack boot.img(img_info):
&nbsp;&nbsp;&nbsp; mkboot [unpacked dir] [newbootfile]
&nbsp;&nbsp;&nbsp; mkboot boot20130905 newboot.img

Его можно использовать как для распаковки так и архивирования kernel.img в / из каталога вывода. Давайте запустим команду к самому файлу kernel.img:

./mkboot kernel.img k1plus
Unpack & decompress ../kernel.img to k1plus
&nbsp; kernel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : kernel
&nbsp; ramdisk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : ramdisk
&nbsp; page size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 2048
&nbsp; kernel size&nbsp;&nbsp;&nbsp; : 7236663
&nbsp; ramdisk size&nbsp;&nbsp; : 4282196
&nbsp; second_size&nbsp;&nbsp;&nbsp; : 31763
&nbsp; base&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 0x01078000
&nbsp; kernel offset&nbsp; : 0x00008000
&nbsp; ramdisk offset : 0xfff88000
&nbsp; second_offset&nbsp; : 0xffe88000
&nbsp; tags offset&nbsp;&nbsp;&nbsp; : 0xfef88100
&nbsp; cmd line&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : 
ramdisk is gzip format.
Unpack completed.

Сценарий действительно декомпилирует kernel.img с ядром, в электронный диск, и second.img это файл DTB. img_info содержит информацию, показанную во время извлечения

ls -l k1plus/
total 11364
-rw-rw-r--  1 jaufranc jaufranc     250 ธ.ค.   7 10:22 img_info
-rw-rw-r--  1 jaufranc jaufranc 7236663 ธ.ค.   7 10:22 kernel
drwxrwxr-x 18 jaufranc jaufranc    4096 ธ.ค.   7 10:22 ramdisk
-rw-rw-r--  1 jaufranc jaufranc 4282196 ธ.ค.   7 10:22 ramdisk.packed
-rw-rw-r--  1 jaufranc jaufranc   31763 ธ.ค.   7 10:22 second.img
-rw-rw-r--  1 jaufranc jaufranc   32768 ธ.ค.   7 10:22 second.img.tmp

second.img и second.img.tmp отличаются по размеру, так что я проверил их через DTC, чтобы получить читаемый файл дерева устройств и в результате файлы оказались идентичны:

dtc -I dtb second.img -O dts -o k1plus.dtd
dtc -I dtb second.img.tmp -O dts -o k1plus.dtd.tmp
diff k1plus.dtd k1plus.dtd.tmp

Таким образом, временные файлы имеют какое-то дополнение, необходимое для создания second.img.
Теоритически вы можете изменить файлы ядра, randisk или дерево устройств, теперь давайте всё упакуем:

./mkboot k1plus kernelimg_new.img

Но пока это ещё не работает так как нам надо:

mkbootimg from k1plus/img_info.
  board          : k1plus
  kernel         : kernel
  ramdisk        : new_ramdisk
  page size      : 2048
  kernel size    : 7236663
  ramdisk size   : 4282403
  second_size    : 31763
  base           : 0x01078000
  kernel offset  : 0x00008000
  ramdisk offset : 0xfff88000
  second_offset  : 
  tags offset    : 0xfef88100
  cmd line       : 
ramdisk is gzip format.
Traceback (most recent call last):
  File "/home/jaufranc/edev/mini_mx/mkbootimg_tools/mkbootimg", line 140, in &lt;module&gt;
    main()
  File "/home/jaufranc/edev/mini_mx/mkbootimg_tools/mkbootimg", line 133, in main
    img_id = write_header(args)
  File "/home/jaufranc/edev/mini_mx/mkbootimg_tools/mkbootimg", line 57, in write_header
    args.pagesize))                                 # flash page size we assume
struct.error: 'I' format requires 0 &lt;= number &lt;= 4294967295
Make boot.img Error! pls check img_info file.
...

Если мы посмотрим на первую команду ./mkbootimg , мы можем увидеть некоторые отличия в декомпиляции образа, так что я изменил img_info по первой командной строке, с базой = 0, = 0x01080000 kernel_offset и ramdisk_offset = 0x01000000, и все получилось:

./mkboot k1plus kernelimg_new.img
mkbootimg from k1plus/img_info.
  kernel         : kernel
  ramdisk        : new_ramdisk
  page size      : 2048
  kernel size    : 7236663
  ramdisk size   : 4282403
  second_size    : 31763
  base           : 0
  kernel offset  : 0x01080000
  ramdisk offset : 0x01000000
  second_offset  : 
  tags offset    : 0xfef88100
  cmd line       : 
ramdisk is gzip format.
Kernel size: 7236663, new ramdisk size: 4282403, kernelimg_new.img: 11556864.
kernelimg_new.img has been created.

Благодарим сайт Cnx-software.com за предоставленную информацию.

Оригинал статьи тут

0 0 vote
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Inline Feedbacks
View all comments