Архив рубрики: Hardware

Android: Получить root на ноунейм MTK-устройстве

В руки попался китайский бюджетный смартфон Mito A67.

Информация о системе


После установки приложения Сбербанк и последующем его запуском пользователь получил уведомление:

Обнаружен вирус HEUR:Trojan-Downloader.AndroidOS.Dwphon.a.

 

Пишет, что он находится в приложении «Беспроводное обновление».

Но в свойствах этого приложения нет указания на название пакета. А, поскольку оно не активно и на экране его нет, то пришлось удалить самое подходящее по смыслу:

pm uninstall -k --user 0 com.abfota.systemUpdate

Вирус вроде как удалён, но всё равно пользователь, при запуске Сбербанк-онлайн получает сообщение об обнаруженном вирусе, при этом удалить его не может:

Сбербанк нашёл вирус в системе

Попробую поставить рут. Проблема в том, что это ноунейм, а значит нет готовой прошивки с рутом. Придётся работать руками…

Все действия вы совершаете на свой страх и риск, т.к. есть шанс получить кирпич!

 

Инструкция тут.
1. Скачиваем и устанавливаем MTK-драйвер с офф. сайта

После установки потребуется перезагрузка компа.

 
2. Проверим драйверы, для этого зажмите Volume Down + Power, затем подключите USB (экран может остатся чёрным)
3. Откройте Диспетчер устройств ▶ раздел Ports (COM & LPT)

Должно отображаться: MediaTek USB Port (COMxx)
У меня отобразилось MediaTek USB VCOM (Android) (COM5)

 

4. Загрузим и распакуем MTK-Client.
5. Скачиваем и устанавливаем Microsoft C++ Build Tools:

  • MSVC v143 — VS 2022 C++ x64/x86 build tools
  • Windows 10 SDK (10.0.18362.0)
  • C++ CMake tools

6. Через Windows Store загрузим и установим Python (В сеансе Администратора тоже).

Только не ставьте самую последнюю версию, т.к. могут быть проблемы с зависимостями. Я поставил Python 3.12.

 

7. Установим WinFsp (для использования FUSE).

Не знаю, зачем это нужно в текущем проекте.

 

8. В Проводнике из папки MTK-Client запускаем PowerShell (на пустом поле правая кнопка мыши и выбираем Open in Terminal.
9. Установим и обновим зависимости:

Выполнив всё это в сеансе пользователя, вы проведёте настройку для его окружения, но если дальше будете работать из-под Админа, то нужно выполнять в терминале PowerShell, запущенном от Админа!

 

pip install wheel setuptools --upgrade
pip install --upgrade pip
pip3 install -r requirements.txt
pip3 install .

10. Вызываем графический интерфейс MTKClient:

Administrator: Windows PowerShell
python .\mtk_gui.py
Preloader - Status: Waiting for PreLoader VCOM, please reconnect mobile to brom mode


...........


...........


...........


...........


..........Preloader
Preloader - [LIB]: Status: Handshake failed, retrying...


..Preloader -   CPU:                    MT6753()
Preloader -     HW version:             0x0
Preloader -     WDT:                    0x10212000
Preloader -     Uart:                   0x11002000
Preloader -     Brom payload addr:      0x100a00
Preloader -     DA payload addr:        0x201000
Preloader -     CQ_DMA addr:            0x10217c00
Preloader -     Var1:                   0x28
Preloader - Disabling Watchdog...
Preloader - HW code:                    0x337
Preloader - Target config:              0x0
Preloader -     SBC enabled:            False
Preloader -     SLA enabled:            False
Preloader -     DAA enabled:            False
Preloader -     SWJTAG enabled:         False
Preloader -     EPP_PARAM at 0x600 after EMMC_BOOT/SDMMC_BOOT:  False
Preloader -     Root cert required:     False
Preloader -     Mem read auth:          False
Preloader -     Mem write auth:         False
Preloader -     Cmd 0xC8 blocked:       False
Preloader - Get Target info
Preloader -     HW subcode:             0x8a00
Preloader -     HW Ver:                 0xca00
Preloader -     SW Ver:                 0x0
Preloader - Status: Waiting for PreLoader VCOM, please reconnect mobile to brom mode
Preloader
Preloader - [LIB]: Status: Handshake failed, retrying...

11. В предыдущем шаге мы получили Status: Handshake failed, retrying, поэтому повторяем попытку перевода телефона в режим BROM.

У телефона, который мне попался был «косяк» — он не выключался кнопкой питания. Т.е. если долго удерживать кнопку питания, то он просто перезагружался. А вот выключить чего через меню телефона нельзя, т.к. в этом случае будет не «глубокое» выключение, а поверхностное. Т.е. мы не получаем доступа к режиму BROM. Здесь пришлось ловить примерно двухсекундный момент, когда вы выключаете телефон кнопкой, тухнет экран, сразу подключаете USB-кабель.
Удерживайте обе кнопки: Volume Down (Громкость Вниз) и Volume Up (Громкость Вверх). Иногда работает только Volume Down или только Volume Up, попробуйте варианты.

 

12. В MTKClient GUI выбираем Прочитать разделыВыбрать все разделы
13. Снимаем галки с cache (400MB) и userdata (54GB)
14. Нажимаем кнопку Прочитать разделы
15. Выбираем папку сохранения архива.

MTK GUI get partitions

.....Preloader -        CPU:                    MT6753()
Preloader -     HW version:             0x0
Preloader -     WDT:                    0x10212000
Preloader -     Uart:                   0x11002000
Preloader -     Brom payload addr:      0x100a00
Preloader -     DA payload addr:        0x201000
Preloader -     CQ_DMA addr:            0x10217c00
Preloader -     Var1:                   0x28
Preloader - Disabling Watchdog...
Preloader - HW code:                    0x337
Preloader - Target config:              0x0
Preloader -     SBC enabled:            False
Preloader -     SLA enabled:            False
Preloader -     DAA enabled:            False
Preloader -     SWJTAG enabled:         False
Preloader -     EPP_PARAM at 0x600 after EMMC_BOOT/SDMMC_BOOT:  False
Preloader -     Root cert required:     False
Preloader -     Mem read auth:          False
Preloader -     Mem write auth:         False
Preloader -     Cmd 0xC8 blocked:       False
Preloader - Get Target info
Preloader -     HW subcode:             0x8a00
Preloader -     HW Ver:                 0xca00
Preloader -     SW Ver:                 0x0
Preloader - Jumping to 0x200000
Preloader - Jumping to 0x200000: ok.
m_emmc_ret = 0x0
m_emmc_boot1_size = 0x400000
m_emmc_boot2_size = 0x400000
m_emmc_rpmb_size = 0x1000000
m_emmc_gp_size[0] = 0x0
m_emmc_gp_size[1] = 0x0
m_emmc_gp_size[2] = 0x0
m_emmc_gp_size[3] = 0x0
m_emmc_ua_size = 0xe8f800000
m_emmc_cid = 5036424d15010047c2f8956742018ea3
m_emmc_fwver = 0100000000000000

Progress: |██████████| 100.0% Read (0x1800/0x1800, ) 2.28 MB/s
Progress: |██████████| 100.0% Read (0x2800/0x2800, ) 2.26 MB/s29 MB/s
Progress: |██████████| 100.0% Read (0x5000/0x5000, ) 2.40 MB/s23 MB/s
Progress: |██████████| 100.0% Read (0x5000/0x5000, ) 2.20 MB/s30 MB/s
Progress: |██████████| 100.0% Read (0x400/0x400, ) 3.26 MB/s
Progress: |██████████| 100.0% Read (0x400/0x400, ) 3.15 MB/s
Progress: |██████████| 100.0% Read (0x8000/0x8000, ) 2.23 MB/s20 MB/s
Progress: |██████████| 100.0% Read (0xC000/0xC000, ) 2.27 MB/s46 MB/s
Progress: |██████████| 100.0% Read (0x4000/0x4000, ) 2.29 MB/s39 MB/s
Progress: |██████████| 100.0% Read (0x5000/0x5000, ) 2.34 MB/s49 MB/s
Progress: |██████████| 100.0% Read (0x400/0x400, ) 3.08 MB/s
Progress: |██████████| 100.0% Read (0x1000/0x1000, ) 2.27 MB/s
Progress: |██████████| 100.0% Read (0x3000/0x3000, ) 2.34 MB/s31 MB/s
Progress: |██████████| 100.0% Read (0x4000/0x4000, ) 2.23 MB/s32 MB/s
Progress: |██████████| 100.0% Read (0x2800/0x2800, ) 2.26 MB/s25 MB/s
Progress: |██████████| 100.0% Read (0x2800/0x2800, ) 2.28 MB/s37 MB/s
Progress: |██████████| 100.0% Read (0x400/0x400, ) 3.20 MB/s
Progress: |██████████| 100.0% Read (0x800/0x800, ) 2.27 MB/s
Progress: |██████████| 100.0% Read (0x10000/0x10000, ) 2.36 MB/s3 MB/s
Progress: |██████████| 100.0% Read (0x10000/0x10000, ) 2.00 MB/s8 MB/s
Progress: |██████████| 100.0% Read (0xA400/0xA400, ) 3.19 MB/s21 MB/s
Progress: |██████████| 100.0% Read (0x274000/0x274000, ) 2.20 MB/s30 MB/sMB/s

16. Скачиваем Magisk
17. Устанавливаем его на телефон:

.\adb.exe install "D:\Distr-Android\Magisk\Magisk-v29.0.apk"
Performing Streamed Install
Success

18. Закидываем распакованный boot.bin (обратите внимание, что мы его переименовываем):

.\adb push "D:\Hardware\MT6753\boot.bin" /sdcard/Download/boot.img

19. Патчим boot.img:
MagiskInstallNextSelect and Patch a FileLET’S GO

- Device platform: armeabi-v7a
- Installing: 29.0 (29000)
- Copying image to cache
- Unpacking boot image
- Checking ramdisk status
- Stock boot image detected
- Patching ramdisk
- Pre-init storage partition: userdata
- Patch fstab in boot image kernel_dtb
- Repacking boot image

****************************
Output file is written to
/storage/emulated/0/Download/magisk_patched-29000_zfCBM.img
****************************
- All done!

20. Скачиваем пропатченный файл:

./adb pull /sdcard/Download/magisk_patched-29000_zfCBM.img "D:\Hardware\Android utils\MTK-Client\mtkclient-main\boot_rooted.bin"
/sdcard/Download/magisk_patched-29000_zfCBM.img: 1 file pulled, 0 skipped. 12.9 MB/s (16777216 bytes in 1.245s)

21. Переходим в папку с mtk (подставите свою папку):

cd "D:\Hardware\Android utils\MTK-Client\mtkclient-main"

22. Разблокируем загрузчик и отключим проверку целостности:

python mtk.py da vbmeta 3
Port - Device detected :)
Preloader -     CPU:                    MT6753()
Preloader -     HW version:             0x0
Preloader -     WDT:                    0x10212000
Preloader -     Uart:                   0x11002000
Preloader -     Brom payload addr:      0x100a00
Preloader -     DA payload addr:        0x201000
Preloader -     CQ_DMA addr:            0x10217c00
Preloader -     Var1:                   0x28
Preloader - Disabling Watchdog...
Preloader - HW code:                    0x337
Preloader - Target config:              0x0
Preloader -     SBC enabled:            False
Preloader -     SLA enabled:            False
Preloader -     DAA enabled:            False
Preloader -     SWJTAG enabled:         False
Preloader -     EPP_PARAM at 0x600 after EMMC_BOOT/SDMMC_BOOT:  False
Preloader -     Root cert required:     False
Preloader -     Mem read auth:          False
Preloader -     Mem write auth:         False
Preloader -     Cmd 0xC8 blocked:       False
Preloader - Get Target info
Preloader -     HW subcode:             0x8a00
Preloader -     HW Ver:                 0xca00
Preloader -     SW Ver:                 0x0
DaHandler - Device is unprotected.
DaHandler - Device is in Preloader-Mode.
DALegacy - Uploading legacy da...
DALegacy - Uploading legacy stage 1 from MTK_DA_V5.bin
LegacyExt - Legacy DA2 is patched.
LegacyExt - Legacy DA2 CMD F0 is patched.
Preloader - Jumping to 0x200000
Preloader - Jumping to 0x200000: ok.
DALegacy - Got loader sync !
DALegacy - Reading nand info
DALegacy - Reading emmc info
DALegacy - ACK: 04029b
DALegacy - Setting stage 2 config ...
DALegacy - Uploading stage 2...
DALegacy - Successfully uploaded stage 2
DALegacy - Connected to stage2
DALegacy - m_int_sram_ret = 0x0
m_int_sram_size = 0x20000
m_ext_ram_ret = 0x0
m_ext_ram_type = 0x2
m_ext_ram_chip_select = 0x0
m_int_sram_ret = 0x0
m_ext_ram_size = 0xc0000000
randomid = 0x3CC2FF1F2C622A7127708C1B8E860543

m_emmc_ret = 0x0
m_emmc_boot1_size = 0x400000
m_emmc_boot2_size = 0x400000
m_emmc_rpmb_size = 0x1000000
m_emmc_gp_size[0] = 0x0
m_emmc_gp_size[1] = 0x0
m_emmc_gp_size[2] = 0x0
m_emmc_gp_size[3] = 0x0
m_emmc_ua_size = 0xe8f800000
m_emmc_cid = 5036424d15010047c2f8956742018ea3
m_emmc_fwver = 0100000000000000

DaHandler - Dumping partition "para"
Progress: |██████████| 100.0% Read (0x400/0x400, ) 2.70 MB/s

23. Записываем пропатченный раздел загрузчика

python mtk.py w boot boot_rooted.bin

Если не сработало

Если на шаге выше не сработали — при запуске Magisk он показывает в статусе, что не установлен, то это сложности…
Итак, через командную строку образ boot.img вроде как записался, но Magisk его не признал. Проверяем. Для этого заново запускаем MTKClient GUI, но на этот раз сохраняем только раздел boot, под другим именем, чтобы не запутаться. Если это ошибка и Magisk глючит, то файлы будут совпадать.
Для сравнения используем PowerShell, просто измените в коде пути к файлам на свои и запустите:

Windows PowerShell
# Укажите пути к вашим файлам
$file1 = "D:\Drivers\Android utils\MTK-Client\mtkclient-main\boot_original.bin"
$file2 = "D:\Drivers\Android utils\MTK-Client\mtkclient-main\Dump\boot.bin"

# Вычислите контрольные суммы
$hash1 = Get-FileHash -Path $file1 -Algorithm SHA256
$hash2 = Get-FileHash -Path $file2 -Algorithm SHA256

# Сравните контрольные суммы
if ($hash1.Hash -eq $hash2.Hash) {
    Write-Host "Контрольные суммы файлов совпадают."
} else {
    Write-Host "Контрольные суммы файлов не совпадают."
}

У меня получилось, что контрольные суммы файлов с загрузчиком якобы пропатченным (тот, который я скачал с телефона второй раз) и оригинальным одинаковые, значит Magisk не врал. Т.е. boot-раздел не записался. На этот раз я отошёл от инструкции с XDA, а воспользовался MTKClient GUI. Если там он успешно читал раздел, то наверное можно было и попытаться записать через него тоже.

Открываем MTKClient GUI вкладку Записать разделы и отмечаем только Boot (16MB), для этого нажимаем на кнопку Установить и выбираем пропатченный образ загрузчика (у меня это boot_rooted.bin).
Затем нажимаем Записать разделы.

MTK GUI write partitions

На этот раз, загрузив телефон и включив Magisk, он показал, что root есть. Попытаюсь удалить вирус, который был вшит в прошивку.

 

24. Проверяем доступность телефона (не забыли ли мы включить отладку по USB и подтвердить цифровой отпечаток):

./adb devices
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached
0123456789ABCDEF        device

25. Запускаем шелл и получаем рута (при этом внимательно смотрим на экран смартфона, чтобы подтвердить запрос от Magisk):

adb shell
S23 Ultra:/ $ su
S23 Ultra:/ # cd /system/app/
S23 Ultra:/system/app # rm -r Rsota/
rm ro dir Rsota/ (y/N):y
rm ro Rsota/Rsota.apk (y/N):y
rm: Rsota.apk: Read-only file system
Ну да, файловая система доступна только для чтения.

 

26. Узнаём, где смонтирован system:

mount | grep system
/dev/block/mmcblk0p23 on /system type ext4 (ro,seclabel,relatime,data=ordered)
Раздел /system действительно монтируется отдельно, но в режиме read-only.

 

27. Примонтируем его:

mount -o remount,rw /system

28. Ошибок нет, можно удалять папку с вирусом:

S23 Ultra:/system/app # rm -r Rsota/
Сначала я пытался проверить, как именно примонтирован раздел:

S23 Ultra:/system/app # mount | grep ' /system '
/dev/block/mmcblk0p23 on /system type ext4 (ro,seclabel,relatime,data=ordered)

Потом попробовал её примонтировать, используя полученный путь:

S23 Ultra:/system/app # mount -o remount,rw /dev/block/mmcblk0p23 /system
mount: '/system' not in /proc/mounts

Неудача — прошивка использует system-as-root — т.е. раздел /system не монтируется отдельно, а встроен в корень.

 

Вместе с вирусом это удалит обновление системы «по воздуху». Т.е. теперь мы не сможем обновить систему через Настройки. Это конечно плохо, но не стоит расстраиваться, т.к. нам не накатят заново вирус ;)

 

Magisk

Удалять или оставлять Magisk (root) решать вам. Я оставил, на случай, если вдруг опять что-то потребуется, а проходить всё заново ой как не хочется. Поэтому просто в его настройках включу режимы Zygisk и Enforce DenyList
MagiskSettingsAppHide Magisk app
Ну и активирую скрытый режим:
MagiskSettingsMagiskZygisk
и
MagiskSettingsMagiskEnforce DenyListотметить приложения, для которых Magisk будет невидим

Preloader

Почему-то в процессе получения дампа в списке не было файла preloader.bin.

 

Пришлось выковыривать его отдельно!
29. Вернёмся ва консоль PowerShell и воспользуемся mtk.py:

Windows PowerShell
mtk rl dump_preloader
MTK Flash/Exploit Client Public V2.0.1 (c) B.Kerler 2018-2024

Preloader - Status: Waiting for PreLoader VCOM, please reconnect mobile to brom mode

Port - Hint:

Power off the phone before connecting.
For brom mode, press and hold vol up, vol dwn, or all hw buttons and connect usb.
For preloader mode, don't press any hw button and connect usb.
If it is already connected and on, hold power for 10 seconds to reset.

.......Port - Device detected :)
Preloader -     CPU:                    MT6753()
Preloader -     HW version:             0x0
Preloader -     WDT:                    0x10212000
Preloader -     Uart:                   0x11002000
Preloader -     Brom payload addr:      0x100a00
Preloader -     DA payload addr:        0x201000
Preloader -     CQ_DMA addr:            0x10217c00
Preloader -     Var1:                   0x28
Preloader - Disabling Watchdog...
Preloader - HW code:                    0x337
Preloader - Target config:              0x0
Preloader -     SBC enabled:            False
Preloader -     SLA enabled:            False
Preloader -     DAA enabled:            False
Preloader -     SWJTAG enabled:         False
Preloader -     EPP_PARAM at 0x600 after EMMC_BOOT/SDMMC_BOOT:  False
Preloader -     Root cert required:     False
Preloader -     Mem read auth:          False
Preloader -     Mem write auth:         False
Preloader -     Cmd 0xC8 blocked:       False
Preloader - Get Target info
Preloader - BROM mode detected.
Preloader -     HW subcode:             0x8a00
Preloader -     HW Ver:                 0xca00
Preloader -     SW Ver:                 0x0
Preloader - ME_ID:                      26BC32D21D0D825A847AE2F2766E9617
DaHandler - Device is unprotected.
DaHandler - Device is in BROM-Mode. Bypassing security.
PLTools - Loading payload from mt6753_payload.bin, 0x258 bytes
Exploitation - Kamakiri Run
Exploitation - Done sending payload...
PLTools - Successfully sent payload: C:\Users\opden\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.12_qbz5n2kfra8p0\LocalCache\local-packages\Python312\site-packages\mtkclient\payloads\mt6753_payload.bin
Port - Device detected :)
DaHandler
DaHandler - [LIB]: Device is in BROM mode. No preloader given, trying to dump preloader from ram.
DALegacy - Uploading legacy da...
DALegacy - Uploading legacy stage 1 from MTK_DA_V5.bin
LegacyExt - Legacy DA2 is patched.
LegacyExt - Legacy DA2 CMD F0 is patched.
Preloader - Jumping to 0x200000
Preloader - Jumping to 0x200000: ok.
DALegacy - Got loader sync !
DALegacy - Reading nand info
DALegacy - Reading emmc info
DALegacy - ACK: 04029b
DALegacy - Setting stage 2 config ...
DALegacy - DRAM config needed for : 470001154d423650a38e014267bef8c2
DALegacy - Reading dram nand info ...
DALegacy - Sending dram info ... EMI-Version 0x14
DALegacy - RAM-Length: 0xbc
DALegacy - Checksum: 5E95
DALegacy - M_EXT_RAM_RET : 0
DALegacy - M_EXT_RAM_TYPE : 0x2
DALegacy - M_EXT_RAM_CHIP_SELECT : 0x0
DALegacy - M_EXT_RAM_SIZE : 0xc0000000
DALegacy - Uploading stage 2...
DALegacy - Successfully uploaded stage 2
DALegacy - Connected to stage2
DALegacy - Reconnecting to stage2 with higher speed