Сборка ядра Android и модулей aircrack-ng

в 6:16, , рубрики: android, arm64, kernel, modules, nethunter, информационная безопасность

Думаю, кто читает эту статью, сталкиваются с проблемой драйверов для
внешних устройств, в частности 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 и могу сказать, что
для него внешний модуль собрать возможно.

  1. https://opensource.samsung.com/uploadSearch?searchValue=A245FXXU5CXE1
    Version:5.10.198 Device:Samsung Galaxy A24 Bootloader version:U5 Android
    version: 14

  2. 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.

ScreenShot-№1: Директория с исходными кодами и скриптом.

ScreenShot-№1: Директория с исходными кодами и скриптом.

Этап №3. Редактирование скрипта и экспорт переменных среды

В скрипте build_kernel.sh встречается строка:

python scripts/gen_build_config.py ...

Это Python-скрипт, который генерирует конфигурацию сборки из входных данных. Иногда
требуется заменить python на python2 или более новую версию, так как несовместимость может привести к ошибке. В моем случае я заменил на python2.

После вызова Python-скрипта в этом же скрипте можно увидеть строки export... , задающие переменные среды для Bash-скрипта ./build/build.sh, который запускается в конце.

Скрипт build.sh отвечает за сборку ядра и модулей. Если его просмотреть, можно увидеть все возможные переменные среды в виде комментариев с их описанием (см.ScreenShot-№2).

Если собрать ядро без определенных экспортированных переменных, получится
стандартное ядро без неиспользуемых символов.

ScreenShot-№2: Bash скрипт build.sh.

ScreenShot-№2: Bash скрипт build.sh.

В build_kernel.sh добавляем строки (см. ScreenShot-№3):

  • TRIM_NONLISTED_KMI=0 # Позволяет экспортировать все неиспользуемые
    символы.

  • KMI_SYMBOL_LIST_STRICT_MODE=0 # Если установлено в 1, выполняет
    строгую проверку символов.

  • DO_NOT_STRIP_MODULES=0 # Если установлено в 1, сохраняет информацию
    для отладки в собранных модулях.

ScreenShot-№3: Переменные среды задающие правила для сборки.

ScreenShot-№3: Переменные среды задающие правила для сборки.

Этап №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

Эти переменные понадобятся при сборке внешних модулей.

ScreenShot-№4: Переменная PATH и LLVM=1 LLVM_IAS=1.

ScreenShot-№4: Переменная PATH и LLVM=1 LLVM_IAS=1.

Этап №5. Сборка внешних модулей ядра

  1. OUT_DIR/ — каталог с собранным ядром.

  2. OUT_DIR/staging/lib/modules/ — промежуточные файлы.

  3. OUT_DIR/arch/arm64/boot/Image — скомпилированное ядро, которое нужно прошить.

Подготовка к сборке внешних модулей

Для сборки внешнего модуля понадобится:

  • Директория OUT_DIR/staging/lib/module/ Копируем её в
    основную ОС в /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 Не трогаем.

ScreenShot-№5: ifeq

ScreenShot-№5: ifeq

Экспорт переменных среды перед сборкой

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.

ScreenShotError-№1: red errors.

ScreenShotError-№1: red errors.

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

ScreenShotError-№2: error scripts/mod/modpost: not found.

ScreenShotError-№2: error scripts/mod/modpost: not found.

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

ScreenShotError-№3: error unrecognized argument to.

ScreenShotError-№3: error unrecognized argument to.

Ошибки: 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(..., и так со всеми файлами и символами.

ScreenShotError-№4: error.

ScreenShotError-№4: error.

Этап №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>
Image: airodump-ng wlan1

Image: airodump-ng wlan1

⚠️ Примечание:

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

Автор Telegram: @ziroOnce

Автор: stopthe4ttack

Источник


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js