Думаю, кто читает эту статью, сталкиваются с проблемой драйверов для
внешних устройств, в частности Wi-Fi адаптеров, таких как ALFA, TP-Link и других на
чипсетах RTL. Здесь я опишу принципы компиляции ядер Samsung с использованием
системы сборки Soong для Android-устройств, а также расскажу, как подготовить среду
для компиляции и сборки ядра. Кроме того, я опишу, как скомпилировать внешние модули
ядра aircrack-ng для мобильных устройств.
Предупреждение
Не рекомендуется собирать и компилировать ядра и их модули в привилегированной
среде, так как это может повредить операционную систему. Также собранные вами
внешние модули могут повредить ядро и вызвать панику ядра, поэтому не рекомендуется
автоматически загружать модули при старте системы. Не обновляйте Android и ядро
вашего мобильного устройства, так как это может привести к полной несовместимости
ядра с внешним модулем. В данной статье процесс прошивки ядра не описывается,
поскольку устройства различаются, и процесс очень часто отличается!
Существует два метода сборки модулей, которые мне известны:
-
Первый метод не займёт много времени, но может не сработать на вашем
устройстве. -
Второй метод займет больше времени, потребует навыков и терпения.
Я объясню, в чём суть каждого метода.
Первый способ:
Сборка модуля ядра Linux без точных заголовочных файлов. Минусы этого метода в
большей степени описаны в статье, но я также хочу добавить от себя: даже если мы
успешно соберём модуль и попытаемся его загрузить, это может завершиться ошибкой:
insmod: ERROR: could not insert module module.ko: Unknown symbol in
module
Эта ошибка указывает на то, что в модуле обнаружены неизвестные символы ядра. Если
они отсутствуют в самом ядре, внешний модуль не сможет их использовать. Скорее всего,
эти символы устарели и больше не используются в коде и модулях ядра. Однако символы
могут оставаться в коде, просто не экспортироваться в процессе сборки ядра. Это можно
исправить, если они не удалены разработчиком, путём изменения конфигурации или
экспорта переменных в рабочую среду, в зависимости от того, каким способом и с
помощью какого инструмента собирается ядро. Этот метод описан Жуковым Андреем в
статье и в книге «Хакерство. Физические атаки с использованием хакерских устройств».
Вывод из первого метода:
Помимо других проблем, может возникнуть трудность с доступностью символов, которые
не были экспортированы при сборке ядра. К его преимуществам относятся: отсутствие
необходимости в исходных кодах оригинального ядра от вендора, точных заголовочных
файлов, а также отсутствие необходимости в компиляции и прошивке ядра.
Второй метод:
Требует конфигурации и сборки ядра, кросс-компиляции внешнего модуля и прошивки
ядра на мобильное устройство. Этот способ позволяет использовать
неэкспортированные символы, если они не удалены разработчиком.
Для примера возьмём ядро №1, которое я буду собирать. Здесь рассматриваются два
ядра, поскольку они различаются в процессе сборки ядра и модулей. Первое ядро новое
и использует систему сборки Soong от Google, а второе — устаревшую систему сборки на
основе Make. Второе я собирать не буду, так как у меня на данный момент нет устройства
для его проверки, а о процессе сборки таких ядер уже написано много статей на 4PDA,
Habr и подобных ресурсах. Однако я собирал ядра устройства M127F и могу сказать, что
для него внешний модуль собрать возможно.
-
https://opensource.samsung.com/uploadSearch?searchValue=A245FXXU5CXE1
Version:5.10.198 Device:Samsung Galaxy A24 Bootloader version:U5 Android
version: 14 -
https://opensource.samsung.com/uploadSearch?searchValue=M127FXXU3CVL2
Version:4.19.111 Device:Samsung Galaxy M12 Bootloader version:U3 Android
version: 13
Этап №1. Подготовка рабочей среды
Я использую дистрибутив Kali GNU/Linux 2024.4
. Cоветую вам обновить пакеты. После этого создайте рабочую директорию для
сборки в /usr/src/ или любом другом удобном месте. Также рекомендуется увеличить swap
до 30 ГБ, если у вас 16 ГБ ОЗУ.
sudo apt update && sudo apt upgrade
mkdir /usr/src/workdir
# Creating swap fileС
sudo fallocate -l 30G /swapfile && sudo chmod 600 /swapfile
sudo mkswap /swapfile && sudo swapon /swapfile
Этап №2. Скачивание и распаковка
Скачаем в рабочую директорию исходные коды ядра и Toolchain.
Toolchain для ядер Samsung, использующих систему Soong, можно скачать по ссылке: Samsung Toolchains.
Распаковываем архив, в котором находятся инструкции, архивы с исходными кодами README_Kernel.txt
и Kernel.tar.gz
. Остальные файлы, содержащие в названии platform, не нужны.
-
README_Kernel.txt — инструкция, в которой описаны все этапы сборки,
информация о том, где взять toolchain, а также куда его распаковать. -
Kernel.tar.gz содержит исходные коды ядра и скрипт сборки, который использует все команды, описанные в инструкции. Обычно скрипт написан на Bash и
содержит в названии слово build. В моем случае это build_kernel.sh.
Распаковываем toolchain. В моем случае это директория, содержащая build_kernel.sh
.

Этап №3. Редактирование скрипта и экспорт переменных среды
В скрипте build_kernel.sh
встречается строка:
python scripts/gen_build_config.py ...
Это Python-скрипт, который генерирует конфигурацию сборки из входных данных. Иногда
требуется заменить python
на python2
или более новую версию, так как несовместимость может привести к ошибке. В моем случае я заменил на python2.
После вызова Python-скрипта в этом же скрипте можно увидеть строки export...
, задающие переменные среды для Bash-скрипта .
, который запускается в конце. build.sh
Скрипт build.sh
отвечает за сборку ядра и модулей. Если его просмотреть, можно увидеть все возможные переменные среды в виде комментариев с их описанием (см.ScreenShot-№2).
Если собрать ядро без определенных экспортированных переменных, получится
стандартное ядро без неиспользуемых символов.

В build_kernel.sh
добавляем строки (см. ScreenShot-№3):
-
TRIM_NONLISTED_KMI=0
# Позволяет экспортировать все неиспользуемые
символы. -
KMI_SYMBOL_LIST_STRICT_MODE=0
# Если установлено в 1, выполняет
строгую проверку символов. -
DO_NOT_STRIP_MODULES=0
# Если установлено в 1, сохраняет информацию
для отладки в собранных модулях.

Этап №4. Сборка ядра и отслеживание ошибок
Предоставим файлу скрипта права на исполнение:
sudo chmod +x ./build_kernel.sh
./build_kernel.sh # Start
Запускаем его и внимательно смотрим вывод. Ошибки не всегда выделяются красным
цветом, а многопоточная сборка может привести к тому, что ошибки будут выводится в
потоке, они могут затерятся в выводе.
В выводе могут появляться Warning
— предупреждения, которые обычно не критичны.
Частые ошибки:
-
Error 137 — процесс был принудительно остановлен (SIGKILL).
-
Error 2 — файл или каталог не найден. Чаще всего возникает из-за отсутствия bc, flex, bison.
Ядра Linux чувствительны к условиям и конфигурациям. Любые изменения могут
привести к множеству ошибок. Если столкнулись с проблемой, не стоит менять
конфигурацию ядра, а лучше предоставить ему всё необходимое: toolchain, системные
требования, пакеты.
Также в процессе сборки стоит найти переменные среды (см. ScreenShot-№4). Обычно
они выводятся в начале вывода и выглядят так:
PATH=<Value> LLVM=1 LLVM_IAS=1
Эти переменные понадобятся при сборке внешних модулей.

Этап №5. Сборка внешних модулей ядра
-
OUT_DIR/
— каталог с собранным ядром. -
OUT_DIR
— промежуточные файлы. lib -
OUT_DIR
— скомпилированное ядро, которое нужно прошить. arm64 Image
Подготовка к сборке внешних модулей
Для сборки внешнего модуля понадобится:
-
Директория
OUT_DIR
Копируем её в lib
основную ОС в. modules/
-
Создаём директорию
externalModules
(например, в /usr/src/).
Скачиваем исходные коды внешних модулей в externalModules.
Настройка Makefile
Переходим в директорию модуля rtl8188eus/.
При запуске make может появиться ошибка:
/bin/sh: 1: cc: not found - не критично
/bin/sh: 1: x86_64-linux-gnu-gcc-14: not found
Внимательно смотрим строку make... -C /lib/modules//build.
Скорее всего это не ваши промежуточные файлы ядра.
Это означает, что в Makefile есть строка:
KVER := $(shell uname -r)
Её нужно изменить на:
KVER := <You Kernel version>
В Makefile ищем Platform Related.
У меня используется: CONFIG_PLATFORM_I386_PC=y.
Ищем ifeq с этим значением и исправляем его (см. ScreenShot-№5).
-
SUBARCH = arm64
-
ARCH = arm64
-
CROSS_COMPILE = <Ваше значение CROSS_COMPILE: см.ScreenShot-№3>
-
KSRC = /lib/modules/$(KVER)/build
-
MODDESTDIR, INSTALL_PREFIX, STAGINGMODDIR Не трогаем.

Экспорт переменных среды перед сборкой
export PATH=<Your_Value>
export ARCH=arm64
export LLVM=1
export LLVM_IAS=1
Запускаем сборку с помощью make. Остальные внешние модули aircrack-ng собираются по такому же принципу.
Частые ошибки при сборке
Ошибки: unknown warning option: см.ScreenShotError-№1 Эти ошибки
возникают когда компилятор незнает данных ему флагов, эти модули доблжны
собираться gcc но мы их собираем с помошью clang и он непонимает что это за
флаги, просто удаляем их из Makefile.

Ошибка: scripts/mod/modpost: not found см.ScreenShotError-№2 Может возникать
когда вы пересобрали ядро и в процесее оно до конца несобралось.

Ошибки gcc: error: unrecognized argument to и gcc: error: unrecognized command-line
option: см.ScreenShotError-№3 Скорее всего ошибки возникли из за того что вы
забыли экспортировать в рабочую среду нужные переменные.

Ошибки: ERROR: modpost: module 8188eu uses symbol kernel_read from namespace
VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver, but does not import it
см.ScreenShotError-№4. Чтобы исправить ошибку нужно добавить эту строку:
MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); в
файл исходного кода. Нужно найти использемые символы в исходном коде. Использую
grep для этого, но сначало выполним make clean, sudo grep -ir "" ./ поле выполнения grep откроем файл .c и добавим в него выше описанную
строку MODULE_IMPORT_NS(..., и так со всеми файлами и символами.

Этап №6. Загружаем внешний модуль .ko aircrack-ng
Копируем ранее собраный внешний модуль на мобильное устройство, и загружаем в ядро с помошью insmod или modprobe.
Сразу после загрузки модуля в ядро нужно убедится в его работоспособности, выполнимdmesg | tail -50
и внимательно осмотрим вывод на ошибки. Если
ошибок нету подключим устройсто использующиее чипсет aka wifi адаптер для которго мы
собирали модуль и попробуем найти новый интерфес который поддерживает режим
монитора с помощью ip a
, ifconfig
, iwconfig
.
Если все работает и новый интерфейс присутствует то попробуем протестировать его используя wifite
, airodump-ng
. Попробуем поменять режим managment на monitor.
sudo wifite --no-pmkid -i <New-interface>
# start airodump-ng
sudo ifconfig wlan1 up
sudo iwconfig wlan1 mode Monitor
sudo airodump-ng <New-interface>

Примечание:
Индикация led может неработать на подключенном устройстве потому что
эта функции может быть отключена в собраном модуле. wifite может неработать если вы
принудительно неукажете интерфес с помошью флага -i.
Автор Telegram: @ziroOnce
Автор: stopthe4ttack