Table of Contents

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

Приемы, работы с образами описанные тут актуальны, однако, для получения root достаточно просто корректно собрать TWRP.
Я собирал его так: Сборка TWRP из исходников для любого аппарата

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

https://forum.xda-developers.com/showthread.php?t=2684210
http://whiteboard.ping.se/Android/Rooting
http://andrew.bogdanovs.com/post/flashing_mt65xx_phones.html

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

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

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

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

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

adb reboot-bootloader

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

fastboot oem unlock

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

(bootloader) Start unlock flow

OKAY

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

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

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

adb reboot-bootloader

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

fastboot flash system system.img

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

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

Перезагружаем телефон:

fastboot reboot

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

fastboot reboot recovery

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

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

./unpackimg.sh ./boot.img

Из распакованного 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

Упаковываем обратно:

sudo ./repackimg.sh

И прошиваем в телефон:

adb reboot-bootloader
fastboot flash boot ./image-new.img
fastboot reboot



















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

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

https://unix.stackexchange.com/questions/64628/how-to-extract-boot-img
https://source.android.com/security/verifiedboot/verified-boot - про very_key. В файлике fstab.mt6735 в строке где монтируется /system надо убрать verify.
https://forum.xda-developers.com/android/software-hacking/signing-boot-images-android-verified-t3600606 - про то как подписать boot.img
https://android.googlesource.com/platform/bootable/recovery/+/android-4.4.2_r2/testdata/testkey.x509.pem

Распаковка

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

Скачиваем отсюда super-su: https://download.chainfire.eu/supersu-stable

http://www.mtkfirmware.com/content/linux-commands-instructions-tools-unpacking-and-repacking-system-images-mtk-devices-ext4-and
http://www.mtkfirmware.com/sites/default/files/dev-tools/img-tools_0.zip
http://4pda.ru/forum/lofiversion/index.php?t660562-40.html
https://www.tinkerboarding.co.uk/forum/thread-347-post-1216.html
https://tinkerboarding.co.uk/forum/archive/index.php/thread-264.html
https://nelenkov.blogspot.ru/2014/05/using-kitkat-verified-boot.html#!/2014/05/using-kitkat-verified-boot.html - вот тут про verity.
https://forum.xda-developers.com/android/general/cofface-filecontexts-bin-filecontexts-t3669824

При внедрении в образ 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 и распаковываем его:

./unpackimg.sh ./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

UNBRICK

http://noobslounge.blogspot.ru/2014/12/unbrick-any-hard-bricked-mediatek.html
https://spflashtool.com/