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

Телефон в 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 установлена успешно. Строка Signature verification failed относится к ключу подписи recovery; подлинность файла была проверена заранее по MD5 и SHA-256.
Только после успешного завершения второго sideload я выбрал перезагрузку в систему.
Первая загрузка LineageOS
Первая загрузка заняла заметно больше обычной. После полного форматирования это нормально: Android создаёт структуру /data, готовит приложения и включает файловое шифрование.

Первая загрузка чистой 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-инструмент — с понятными ограничениями, проверяемой конфигурацией и возможностью восстановиться, если следующий эксперимент пойдёт не по плану.