16 сентября 2026, 11:25

Старый Xiaomi Redmi 9 с 3 ГБ оперативной памяти и накопителем на 32 ГБ уже тяжело назвать комфортным повседневным смартфоном. Зато это неплохая основа для отдельного лабораторного устройства: дешёвого, автономного и не связанного с личными аккаунтами.

Я решил превратить такой аппарат в лёгкий HackFon для собственной лаборатории. Главным приоритетом были не самая новая версия Android и не максимальное количество предустановленных инструментов, а умеренный расход памяти, предсказуемая работа и возможность восстановить телефон после ошибки.

В результате на Redmi 9 заработала связка:

  • LineageOS 20 на Android 13 без GApps;
  • R-vendor от MIUI 12.5.6.0;
  • Magisk 30.7;
  • Kali NetHunter Lite 2026.2 с минимальным ARM64 chroot.

Это рассказ о реальном процессе: с несовпадающими именами устройства, опасным переходом между vendor-базами, ошибкой подписи в recovery и несколькими моментами, когда перезагрузка была бы плохой идеей.

Все действия выполнялись на моём собственном телефоне со снятой гарантией. Разблокировка загрузчика и прошивка стирают данные и могут привести к неработоспособности устройства. NetHunter следует использовать только в собственной лаборатории или там, где у вас есть явное разрешение владельца инфраструктуры.

identify + backup
        |
        v
unlock bootloader
        |
        v
LineageOS Recovery
        |
        +--> R-vendor firmware
        |       (no reboot)
        v
LineageOS 20 --> clean boot --> patched boot.img --> Magisk
                                                      |
                                                      v
                                            NetHunter Lite chroot

Исходная точка

Аппарат — Xiaomi Redmi 9 Global, модель M2004J19AG, 3/32 ГБ, платформа MediaTek Helio G80. В fastboot он определяется как lancelot, но запущенная MIUI первоначально сообщала galahad. Это важная деталь: у Redmi 9 существует семейство близких вариантов, и ориентироваться только на одно системное свойство опасно.

Перед началом конфигурация выглядела так:

  • MIUI 12.0.4.0 QJCRUXM;
  • Android 10;
  • заблокированный загрузчик;
  • A-only-разметка;
  • dynamic partitions;
  • шифрование пользовательских данных.

Целью стала LineageOS 20 на Android 13, собранная под R-vendor. Google Apps, microG, DFE и стороннее ядро я сознательно исключил.

Сначала — идентификация и резервная копия

Самая полезная часть всего процесса произошла ещё до первой записи во flash. Я сверил модель в Android, ADB и fastboot, проверил разметку и сохранил критические MTK-разделы.

В резервную копию вошли nvram, nvdata, nvcfg, persist, persistbak, protect1, protect2, proinfo, devinfo, seccfg, boot, recovery, dtbo, все разделы vbmeta и preloader. Для каждого файла была рассчитана SHA-256.

Особенно важны разделы с радиокалибровками и идентификаторами модема. Потеря nvram или nvdata способна превратить удачную прошивку в телефон без нормальной сотовой связи. Обычная копия фотографий здесь не помогает.

Для работы с MediaTek использовался открытый mtkclient. После проверки бэкапа загрузчик был переведён в unlocked-состояние, а пользовательские данные очищены. В fastboot аппарат подтвердил:

product: lancelot
unlocked: yes
slot-count: 0

Redmi 9 в режиме fastboot

Телефон в fastboot. На этом этапе особенно важно ещё раз проверить product и состояние загрузчика.

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

Выбранная LineageOS 20 требует vendor-базу Android 11 — так называемый R-vendor. На телефоне при этом стояла MIUI на Android 10.

Для перехода потребовалась firmware:

fw_lancelot_miui_LANCELOTGlobal_V12.5.6.0.RJCMIXM_725b167c13_11.0.zip
MD5:    2477eccb151c6733a50cd2c0e22b8f65
SHA256: 296e4df45778b96714ce6f056af8a606a4f9e758405a303a56abdf440fe7bed6

У этого перехода есть неприятная ловушка: после установки firmware 12.5.6 нельзя загружать старую систему на Q-vendor. Firmware обновляет низкоуровневые компоненты, но не заменяет весь Android. Поэтому последовательность должна быть непрерывной: firmware, затем совместимая ROM — и только потом перезагрузка.

Я заранее проверил содержимое ZIP, его метаданные и контрольные суммы. То же самое сделал с ROM и recovery:

lineage-20.0-20260821-UNOFFICIAL-lancelot.zip
SHA256: e5ac7c0974eaec2c3642e5751f6b56ef24e0c26947e1945be6976cbe045de59b

lineage-20.0-20260821-UNOFFICIAL-lancelot-recovery.img
SHA256: b1dbb4ca1390874d548a2ad486cb66dc70b5b0d080dec883f7c551e18b584b9c

Recovery совпала с образом, вложенным в ZIP LineageOS, побайтово. Это сняло один из главных рисков: несовместимая recovery могла неправильно работать с dynamic partitions или шифрованием.

Recovery и два последовательных sideload

Через fastboot я прошил только проверенную LineageOS Recovery и загрузился непосредственно в неё. После Format data телефон перешёл в режим ADB sideload.

Сначала была установлена firmware 12.5.6. Recovery сообщила об ошибке проверки подписи — ожидаемо, поскольку firmware ZIP не подписан ключом LineageOS. Это не было проигнорировано вслепую: контрольная сумма файла уже была сверена, а встроенный updater завершил запись со статусом 0.

Ключевой момент: после firmware телефон не перезагружался. Я снова включил sideload и сразу установил LineageOS 20. Инсталлятор пересоздал логические разделы system, vendor, product и system_ext, а также записал согласованные boot, dtbo и vbmeta.

Установка firmware через LineageOS Recovery

Firmware установлена успешно. Строка Signature verification failed относится к ключу подписи recovery; подлинность файла была проверена заранее по MD5 и SHA-256.

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

Первая загрузка LineageOS

Первая загрузка заняла заметно больше обычной. После полного форматирования это нормально: Android создаёт структуру /data, готовит приложения и включает файловое шифрование.

Первая загрузка LineageOS 20

Первая загрузка чистой LineageOS 20 после перехода на R-vendor.

После минимальной настройки и повторного включения USB debugging система показала:

LineageOS:             20.0-20260821-UNOFFICIAL-lancelot
Android:               13 / SDK 33
Build ID:              TQ3A.230901.001
Security patch:        2026-02-01
Vendor:                V12.5.6.0.RJCMIXM
SELinux:               Enforcing
Encryption:            file-based, encrypted
Kernel:                4.14.320

ADB работал, загрузка завершилась с sys.boot_completed=1. Службы Wi‑Fi, Bluetooth, телефонии, геолокации и камеры присутствовали. На чистой системе оставалось около 18 ГБ пользовательского пространства.

Magisk без случайного boot.img

Для root использовался не образ из интернета и не boot от похожей сборки. Я извлёк boot.img непосредственно из установленного ZIP LineageOS и проверил его SHA-256:

fe3be42fe95f65a1f57304d97aee17893d6dbe951d5573fbc356f5df1ad38608

Затем установил официальный Magisk 30.7, передал этот boot на телефон и выбрал штатное «Пропатчить boot-образ». Получившийся файл сохранил на компьютере и только после проверки размера прошил в раздел boot через fastboot.

Телефон снова загрузился, а тест подтвердил настоящий root:

uid=0(root) gid=0(root) groups=0(root) context=u:r:magisk:s0
30.7:MAGISK:R
Enforcing

Важно, что SELinux остался в режиме Enforcing, а шифрование не отключалось.

NetHunter Lite вместо тяжёлой полной сборки

Для устройства с 3 ГБ RAM и 32 ГБ flash полный образ размером около 1,8 ГБ выглядел избыточно. Я выбрал официальный минимальный ARM64-инсталлятор:

kali-nethunter-2026.2-generic-arm64-minimal.zip
SHA256: 54d0387bfd011a9d2a81286b2442dddb79464dee49260aeaabec2280f53b2578

ZIP был установлен как модуль Magisk — это рекомендуемый для NetHunter Lite способ. Инсталлятор добавил:

  • приложение NetHunter;
  • NetHunter Terminal;
  • KeX;
  • NetHunter Store;
  • минимальный Kali ARM64 chroot.

После перезагрузки модуль Kali NetHunter 1.4.0 был активен, а chroot сообщил:

aarch64
PRETTY_NAME="Kali GNU/Linux Rolling"
uid=0(root) gid=0(root) groups=0(root)

Minimal-вариант содержит базовую систему, APT и Python. Остальные пакеты можно устанавливать выборочно, не превращая бюджетный телефон в переполненный образ со множеством редко используемых инструментов.

Что получилось в итоге

Финальная конфигурация:

Компонент Результат
Устройство Xiaomi Redmi 9, lancelot, 3/32 ГБ
Vendor MIUI 12.5.6.0 RJCMIXM, Android 11 base
Система LineageOS 20, Android 13, без GApps
Root Magisk 30.7
Kali NetHunter Lite 2026.2, minimal ARM64 chroot
SELinux Enforcing
Шифрование File-based encryption, включено
Свободное место Около 17 ГБ после установки NetHunter

Телефон стал заметно чище исходной MIUI и сохранил нормальную загрузку, ADB и базовые аппаратные службы. При этом Kali работает отдельно в chroot, а необходимые инструменты можно добавлять по мере необходимости.

Чего NetHunter Lite не даёт

Название NetHunter иногда создаёт неверное ожидание, будто любой Android после установки автоматически получает monitor mode, packet injection и USB HID attacks. Это не так.

В этой конфигурации нет специального NetHunter kernel. Поэтому аппаратные возможности, требующие патчей ядра, недоступны или ограничены:

  • Wi‑Fi monitor mode и injection на встроенном адаптере;
  • HID/BadUSB;
  • некоторые функции USB Arsenal;
  • специфические Bluetooth- и CAN-возможности.

Для обычного Kali CLI, сетевой диагностики, скриптов, SSH, Python, работы с внешними сервисами и учебной лаборатории NetHunter Lite подходит. Для аппаратных атак понадобится совместимое ядро и, часто, внешний USB Wi‑Fi-адаптер с OTG.

Главные выводы

Первый вывод — название модели на коробке недостаточно. Нужно сверять codename, разметку и фактический product в fastboot.

Второй — переход между Q-vendor и R-vendor опаснее самой установки LineageOS. Последовательность firmware → совместимая ROM без промежуточной загрузки здесь принципиальна.

Третий — контрольные суммы действительно полезны. Они позволили осознанно продолжить установку firmware даже после предупреждения recovery о чужой подписи.

Четвёртый — root лучше добавлять только после успешной чистой загрузки ROM. Так намного проще понять, на каком слое появилась проблема.

И наконец, для старого устройства минимальная система практичнее максимальной. LineageOS без GApps, Magisk и NetHunter Lite дают рабочую лабораторную платформу, не забивая память заранее тем, что может никогда не понадобиться.

Получился не «магический хакерский смартфон», а аккуратный карманный Linux-инструмент — с понятными ограничениями, проверяемой конфигурацией и возможностью восстановиться, если следующий эксперимент пойдёт не по плану.