Распаковка boot img linux

СТАТЬЯ ЕЩЕ СЫРАЯ

В данной статье я пытаюсь получить root для телефона Nomu S30 mini, на базе MTK6735.

Разблокировка бутлоадера

Для того, чтобы в телефон можно было заливать модифицированные образы нужно разблокировать бутлоадер.
ВНИМАНИЕ!! при разблокировке или блокировке бутлоадера пользовательские данные теряются.
Устанавливаем adb-tools

sudo apt-get install android-tools-adb android-tools-fastboot

Включаем в Developer Options опцию USB Debugging.
В Developer Options включаем OEM Unlocking.
Включаем телефон и подключаем к компу. Телефон спросит — можно ли использовать с этим компьютером USB Debug — отвечаем Yes.

Теперь перезагружаем телефон в режим бутлоадера. Для этого при подключенном к компу телефоне (включенном) выполняем

Либо выключаем телефон, зажимаем Vol+ и PowerButton. Появится меню, в котором кнопкой Vol+ нужно выбрать fastboot и нажать Vol-.
После того, как на телефоне появится надпись FASTBOOT MODE на компе выполняем:

В результате компьютер скажет:

(bootloader) Start unlock flow OKAY

То есть теперь бутлоадер разлочен и мы можем прошивать новые прошивки через него.

Прошивка с помощью bootloader

Перезагружаем телефон в режим бутлоадера (fastboot):

Например, для того, чтобы прошить flash-блок system (в котором лежит собственно android) — подключаем аппарат к компу и выполняем:

fastboot flash system system.img

Эта команда прошьет блок с названием system файлом-образом system.img из текущего каталога. Аналогично прошиваются recovery и boot:

fastboot flash boot boot.img fastboot flash recovery recovery.img

Или перезагружаем его в recovery

Отключение dm-verity и включение userdebug

Для того, чтобы можно было загружать модицицированный system.img, нужно отключить проверку образа dm-verity. Это делается путем редактирования образа boot.img. Распаковываем boot.img с помощью AIK-Linux:

Из распакованного ramdisk удаляем файл verity_key

sudo rm ./ramdisk/verity_key

В файле ./ramdisk/fstab.mt6735 отключаем verify:

sudo sed -i '/\/system/ s/,verify//' ./ramdisk/fstab.mt6735

В файле ./ramdisk/default.prop меняем значение параметра ro.secure=1 на 0, меняем ro.debuggable=0 на 1 и добавляем строку ro.config.dmverity=false:

sudo sed -i '/ro.secure/ s/1/0/' ./ramdisk/default.prop sudo sed -i '/ro.debuggable/ s/0/1/' ./ramdisk/default.prop echo 'ro.config.dmverity=false' | sudo tee -a ./ramdisk/default.prop
adb reboot-bootloader fastboot flash boot ./image-new.img fastboot reboot

Всё, что написано ниже, неактуально, но может кому-то пригодиться

Перепаковка boot.img

Распаковка

wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/android-serialport-api/android_bootimg_tools.tar.gz tar -xvf ./android_bootimg_tools.tar.gz mkdir ./boot ./unpackbootimg -i ./boot.img -o ./boot/

В результате в папке ./boot будут файлики. И среди них два:

Читайте также:  Linux top process status

Чтобы распаковать ram-диск делаем так:

gunzip -c boot.img-ramdisk.gz | cpio -i

Упаковка initramfs

cd find . | cpio -o -H newc | gzip > ../newramdisk.cpio.gz

Отключение verify для раздела system

./unpackbootimg -i ./boot.img -o ./boot cd boot mkdir ./ramdisk cp ./boot.img-ramdisk.gz ./ramdisk/ cd ramdisk/ gunzip -c boot.img-ramdisk.gz | cpio -i rm -f ./boot.img-ramdisk.gz sed -i '/\/system/ s/,verify//' ./fstab.mt6735 rm -f ../boot.img-ramdisk.gz find . | cpio -o -H newc | gzip > ../boot.img-ramdisk.gz

Получение root в adb

В файлике default.prop нужно сделать так:

ro.secure=0 ro.debuggable=1 persist.service.adb.enable=1

Упаковка

./mkbootimg --kernel ./boot.img-zImage --ramdisk ./boot.img-ramdisk.gz --base 40078000 --cmdline 'bootopt=64S3,32N2,64N2' --pagesize 2048 -o ../newboot.img

Перепаковка boot.img с помощью abootimg

boot.img перепакованый таким образом нормально загружается, (даже не подписаный сертификатом) только в том случае, если не вносились изменения (не перепаковывался) initrd.img. Это значит, что secureboot проверяет initrd.img.

sudo apt-get install abootimg abootimg -x ./boot.img abootimg-unpack-initrd

Команда abootimg-unpack-initrd распакует файл initrd.img из текущей директории в папку ramdisk. После внесения изменений в файлы можно упаковать все обратно.

rm ./initrd.img abootimg-pack-initrd

Команда abootimg-pack-initrd упакует содержимое папки ramdisk в файл ./initrd.img
Теперь можно всё собрать обратно в newboot.img.

abootimg --create newboot.img -f ./bootimg.cfg -k ./zImage -r ./initrd.img

Перепаковка с подписью сертификатом

В сертификате указывал такие данные: C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com
Подписанный (но не измененный) boot.img НЕ загружается.

abootimg -x ./boot.img abootimg-unpack-initrd #sed -i '/\/system/ s/,verify//' ./ramdisk/fstab.mt6735 rm ./initrd.img abootimg-pack-initrd abootimg --create newboot.img -f ./bootimg.cfg -k ./zImage -r ./initrd.img openssl genrsa -f4 -out verifiedboot.pem 2048 openssl pkcs8 -in verifiedboot.pem -topk8 -outform DER -out verifiedboot.pk8 -nocrypt openssl req -new -x509 -sha256 -key verifiedboot.pem -out verifiedboot.x509.pem openssl x509 -outform DER -in verifiedboot.x509.pem -out verifiedboot.x509.der java -jar BootSignature.jar /boot newboot.img verifiedboot.pk8 verifiedboot.x509.der boot_signed.img java -jar BootSignature.jar -verify boot_signed.img adb reboot-bootloader fastboot flash boot ./boot_signed.img fastboot reboot

Перепаковка system.img

При внедрении в образ system.img файлов SuperSU нужно прописать их в SELinux. База данных SELinux хранится в образе boot.img, в файлике file_contexts.bin. После извлечения, файл file_contexts.bin нужно распаковать для внесения в него изменений с помощью утилиты sefcontext, а затем запаковать обратно и пересобрать образ boot.img.
Образ system.img нужно распаковать с помощью img-tools, смонтировать образ и добавить в него файлы SuperSU, а затем запаковать его обратно.

Читайте также:  Linux manjaro температура процессора

Итак.
В отдельную папку (меня это пака ~/AIK-Linux)распаковываем Android Image Kitchen кладем туда boot.img и распаковываем его:

Из папки ./ramdisk забираем файлик file_contexts.bin и кладем его в папку с утилитами img-tools, sefcontext и образом system.img — у меня это папка ~/s30mini/.

cp ./ramdisk/file_contexts.bin ../s30mini/

Теперь с помощью скрипта перепаковываем system.img и вносим изменения в file_contexts.bin:

#!/bin/bash SuperSU_PATH="/mnt/hdd/Downloads/UPDATE-SuperSU-v2.82-20170528234214" cd ~/img-tools/ ./simg2img ./system.img ./system.raw sudo mkdir /system sudo mount -t ext4 -o loop ./system.raw /system/ mkdir boot cp ./boot.img ./boot/ cp ./unpackbootimg ./boot/ cd ./boot ./unpackbootimg -i ./boot.img -o ./ gunzip -c boot.img-ramdisk.gz | cpio -i cd .. ./sefcontext -o ./file_contexts ./boot/file_contexts.bin sudo mkdir --parents /system/app/SuperSU && sudo cp $SuperSU_PATH/common/Superuser.apk /system/app/SuperSU/SuperSU.apk sudo chmod 0644 /system/app/SuperSU/SuperSU.apk echo "/system/app/SuperSU/SuperSU.apk u:object_r:system_file:s0" >> ./file_contexts sudo cp $SuperSU_PATH/common/install-recovery.sh /system/etc/install-recovery.sh sudo chmod 0755 /system/etc/install-recovery.sh echo "/system/etc/install-recovery.sh u:object_r:toolbox_exec:s0" >> ./file_contexts sudo cp $SuperSU_PATH/arm64/su /system/xbin/su sudo chmod 0755 /system/xbin/su sed -i '/^\/system\/xbin\/su/d' ./file_contexts echo "/system/xbin/su u:object_r:system_file:s0" >> ./file_contexts sudo mkdir /system/bin/.ext sudo cp $SuperSU_PATH/arm64/su /system/bin/.ext/.su sudo chmod 0755 /system/bin/.ext/.su echo "/system/bin/.ext/.su u:object_r:system_file:s0" >> ./file_contexts sudo cp /system/xbin/su /system/xbin/daemonsu echo "/system/xbin/daemonsu u:object_r:system_file:s0" >> ./file_contexts sudo cp /system/xbin/su /system/xbin/sugote echo "/system/xbin/sugote u:object_r:zygote_exec:s0" >> ./file_contexts sudo cp $SuperSU_PATH/arm64/supolicy /system/xbin/supolicy sudo chmod 0755 /system/xbin/supolicy echo "/system/xbin/supolicy u:object_r:system_file:s0" >> ./file_contexts sudo cp $SuperSU_PATH/arm64/libsupol.so /system/lib64/libsupol.so sudo chmod 0755 /system/lib64/libsupol.so echo "/system/lib\(64\)/libsupol.so u:object_r:system_file:s0" >> ./file_contexts sudo touch /system/etc/.installed_su_daemon sudo chmod 0644 /system/etc/.installed_su_daemon echo "/system/etc/.installed_su_daemon u:object_r:system_file:s0" >> ./file_contexts sudo cp /system/bin/sh /system/xbin/sugote-mksh sudo chmod 0755 /system/xbin/sugote-mksh echo "/system/xbin/sugote-mksh u:object_r:system_file:s0" >> ./file_contexts sudo cp /system/bin/app_process32 /system/bin/app_process32_original sudo chmod 0755 /system/bin/app_process32_original echo "/system/bin/app_process32_original u:object_r:zygote_exec:s0" >> ./file_contexts sudo mv /system/bin/app_process /system/bin/app_process_original sudo chmod 0755 /system/bin/app_process_original echo "/system/bin/app_process_original u:object_r:zygote_exec:s0" >> ./file_contexts sudo mv /system/bin/app_process32 /system/bin/app_process_init sudo chmod 0755 /system/bin/app_process_init echo "/system/bin/app_process_init u:object_r:system_file:s0" >> ./file_contexts sudo mv /system/bin/app_process64 /system/bin/app_process64_original sudo chmod 0755 /system/bin/app_process64_original echo "/system/bin/app_process64_original u:object_r:zygote_exec:s0" >> ./file_contexts sudo ln -s /system/xbin/daemonsu /system/bin/app_process sudo ln -s /system/xbin/daemonsu /system/bin/app_process32 sudo ln -s /system/xbin/daemonsu /system/bin/app_process64 sudo rm -f /system/bin/install-recovery.sh sudo ln -s /system/etc/install-recovery.sh /system/bin/install-recovery.sh SYSTEM_RAW_SIZE=$(stat --printf="%s" ./system.raw) sudo ./make_ext4fs -s -l $SYSTEM_RAW_SIZE -S ./file_contexts -a system newsystem.img /system/ sudo umount /system sudo chmod a+rw ./newsystem.img sudo rm -f ./system.raw sudo rm -Rf ./boot sudo rm -f ./file_contexts sudo rm -Rf /system

Переносим новый file_contexts.bin в рамдиск boot.img и упаковывавем boot.img.

echo '' | sudo tee ~/AIK-Linux/ramdisk/file_contexts.bin sudo dd if=./new_file_contexts.bin of=~/AIK-Linux/ramdisk/file_contexts.bin

Источник

How to extract boot.img?

I am trying to see the content in a boot.img file from an Android image. I googled and found this article to extract system.img , but it doesn’t work for boot.img . When trying to do this for boot.img , it is showing the following:

Invalid sparse file format at header magi Failed to read sparse file 
  1. If so, Is there any other method to extract boot.img ?
  2. If not, what is the problem for not extracting boot.img ?
Читайте также:  Linux сколько строк кода

4 Answers 4

boot.img is a small(ish) file that contain two main parts.

Unpack boot.img :

It contains the following steps:

wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/android-serialport-api/android_bootimg_tools.tar.gz 
tar xvzf android_bootimg_tools.tar.gz 

We can extract the ramdisk also, using the following command

gunzip -c boot.img-ramdisk.gz | cpio -i 

After changing the files, we can again pack those files as boot.img using mkbootimg

Getting the same error for step 3 on Mint 17 here. Tried running them by sudo and after chmod 755 to no avail.

Fix for: «unpackbootimg command not found», you are running 32bit binary on a 64 bit machine without 32bit dependencies. Install them with «apt-get install gcc-multilib»

Install abootimg (available as a package, for example in Debian/Ubuntu and openSUSE).

To extract (boot|recovery).img :

$ abootimg -x (boot|recovery).img $ ls boot.img bootimg.cfg initrd.img zImage 

To repack (boot|recovery).img after modifying one of bootimg.cfg , zImage or initrd.img :

abootimg --create (boot|recovery).img -f bootimg.cfg -k zImage -r initrd.img 

This project is not maintained and did not work with my boot.img file, however the answer from @cfig worked.

boot.img is not a compressed filesystem image like system.img . It is read by the bootloader, and contains little more than a kernel image and a ramdisk image.

Some binary distribution ship the kernel and ramdisk images separately. In that case you don’t need to do anything with boot.img , just regenerate a new one with mkbootimg .

If you need to extract information from a boot.img , try split_bootimg (by William Enck, via the Android wiki).

You can use the following tool to extract and re-pack Android boot image

$ git clone https://github.com/cfig/Android_boot_image_editor.git 

copy your boot.img to the cloned git repository. Run:

First time run will need to download necessary libs from internet, be patient. You can get the contents at «build/unzip_boot/», like this:

build/unzip_boot/ ├── bootimg.json (boot image info) ├── kernel ├── second (2nd bootloader, if exists) ├── boot.img.avb.json (AVB only) └── root 

Источник

Оцените статью
Adblock
detector