- СТАТЬЯ ЕЩЕ СЫРАЯ
- Разблокировка бутлоадера
- Прошивка с помощью bootloader
- Отключение dm-verity и включение userdebug
- Всё, что написано ниже, неактуально, но может кому-то пригодиться
- Перепаковка boot.img
- Распаковка
- Упаковка initramfs
- Отключение verify для раздела system
- Получение root в adb
- Упаковка
- Перепаковка boot.img с помощью abootimg
- Перепаковка с подписью сертификатом
- Перепаковка system.img
- How to extract boot.img?
- 4 Answers 4
- Unpack boot.img :
СТАТЬЯ ЕЩЕ СЫРАЯ
В данной статье я пытаюсь получить 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 будут файлики. И среди них два:
Чтобы распаковать 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, а затем запаковать его обратно.
Итак.
В отдельную папку (меня это пака ~/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
- If so, Is there any other method to extract boot.img ?
- If not, what is the problem for not extracting boot.img ?
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