Идея перевести сетевую карту телефона в режим монитора разрушилась по причине собственной наивности и незнания элементарной информации о том, что подавляющее большинство мобильных сетевых карт этот самый режим монитора и не поддерживают.

Идея реализации задумки с помощью внешнего беспроводного Wi-Fi адаптера или «свистка», поддерживающего желанный режим монитора, рушилась десятки раз из-за новых и новых ошибок и потери веры в то, что это вообще возможно, но переросла в данную статью.

Итак, как подключить внешний Wi-Fi адаптер к устройству на Android или бег с препятствиями на дистанции «вставил — netcfg wlan0 up»:

Должно быть в наличии:

  1. Телефон на Android
  2. Поддержка OTG и сам OTG
  3. Terminal Emulator
  4. ROOT
  5. Исходники ядра

    FAQ — структура выглядит так:

    Скриншот


  6. Внешний Wi-Fi адаптер («свисток»)
  7. Его firmware
  8. Linux дистрибутив
  9. ADB (не обязательно, но так удобнее)

Мой случай:

  1. Samsung GT-P5100 Galaxy Tab 2 10.1, Андроид 4.2.2
  2. OTG «30-pin — USB»
  3. Terminal Emulator for Android
  4. ROOT
  5. Исходники стокового ядра 3.0.31-1919150 с сайта Самсунг
  6. Адаптер TP-LINK TL-WN722N на чипсете AR9271
  7. ath9k_htc/htc_9271.fw
  8. Дистрибутив Ubuntu 15.04 в VMware
  9. android-tools-adb

Начну. Но попрошу учесть, что далее все рассматривается для вышеперечисленного набора и алгоритм, скорее всего, не является универсальным, но отклонения незначительны.

I. Старт


Первым делом необходимо добыть фирмварь вашего адаптера. Вставляю адаптер в компьютер и выполняю команду dmesg. Нахожу:

...
[  256.815266] usbcore: registered new interface driver ath9k_htc
...

Где слово правее слова driver — искомая информация. У меня это — ath9k_htc. Гуглю для него firmware. Качаю. Закидываю .fw-файл на телефон в /system/etc/firmware

Затем устанавливаю ADB:

apt-get install android-tools-adb

Третьим этапом качаю тулчейн (компилятор под ARM) отсюда. Там большой архив, мне нужна лишь папка android-platform_prebuilt-android-sdk-adt_r20-0-ga4062cc.zip\android-platform_prebuilt-a4062cc\linux-x86\toolchain\arm-eabi-4.4.3, которую я распаковываю в произвольное место.

II. Разгон


Для начала пишу терминале:

export ARCH=arm
export CROSS_COMPILE=~/тот самый произвольный путь/arm-eabi-4.4.3/bin/arm-eabi-

Затем перехожу в терминале в каталог с исходниками ядра, загруженными ранее, пишу

make help и получаю тучу информации, среди которой нужно найти нечто, заканчивающееся на _defconfig, у меня это:

...
android_espresso10_omap4430_r02_user_defconfig - Build for android_espresso10_omap4430_r02_user
...

Скопировал, затем:

make android_espresso10_omap4430_r02_user_defconfig

И в завершении запускаю графическую конфигурацию ядра:

make menuconfig

Появляется вот такое окно:

Скриншот


Продвигаюсь по маршрутам:

  1. Networking support > Wireless
    Спускаюсь к Generic IEEE 802.11 Networking stack (mac80211) и нажимаю на пробел, наблюдая появление значка М перед этим пунктом

  2. Device Drivers -> Network device support > Wireless LAN
    Ставлю М у своего чипсета, в моем случае — Atheros Wireless Cards
    Затем перехожу в сам этот раздел и внутри отмечаю все тем же пробелом и знаком M нужный мне пункт.

    Скриншот

  3. Exit > Do you wish to save your new configuration? > Yes

Далее захожу в папку с исходниками ядра и открываю файл Makefile. Нахожу строку CFLAGS_MODULE = и дописываю туда -fno-pic так, чтобы получилось:
CFLAGS_MODULE = -fno-pic
Сохраняю. Возвращаюсь в терминал, а если вы его закрыли, то в и каталог с исходниками тоже, и выполняю сначала make modules_prepare, а следом просто make. Результат потребует ожидания. Мой итоговый набор:

MODPOST 8 modules
  CC      drivers/net/wireless/ath/ath.mod.o
  LD [M]  drivers/net/wireless/ath/ath.ko
  CC      drivers/net/wireless/ath/ath9k/ath9k_common.mod.o
  LD [M]  drivers/net/wireless/ath/ath9k/ath9k_common.ko
  CC      drivers/net/wireless/ath/ath9k/ath9k_htc.mod.o
  LD [M]  drivers/net/wireless/ath/ath9k/ath9k_htc.ko
  CC      drivers/net/wireless/ath/ath9k/ath9k_hw.mod.o
  LD [M]  drivers/net/wireless/ath/ath9k/ath9k_hw.ko
  CC      drivers/net/wireless/bcmdhd/dhd.mod.o
  LD [M]  drivers/net/wireless/bcmdhd/dhd.ko
  CC      drivers/scsi/scsi_wait_scan.mod.o
  LD [M]  drivers/scsi/scsi_wait_scan.ko
  CC      net/mac80211/mac80211.mod.o
  LD [M]  net/mac80211/mac80211.ko
  CC      net/wireless/cfg80211.mod.o
  LD [M]  net/wireless/cfg80211.ko

Потребуются модули (.ko-файлы), включающие слово ath и mac80211.ko. Переношу их на телефон.

Можно использовать adb, работая через компьютер, а можно не использовать и работать через терминал телефона, печатая команды пальцами по экрану. Я выбрал adb.

Напомню, как он работает. Подключаю телефон через USB (отладка, естественно, включена) и выполняю:

adb start-server
adb shell
su


Я в телефоне и под рутом.

Смотрю, какие модули уже есть командой lsmod и выгружаю их все, если это возможно, командой rmmod имямодуля

Затем перехожу в каталог с вышеперечисленными модулями:

cd /sdcard/ваш путь/

Можно убедиться в их наличии командой ls.

a@ubuntu:~/Kernel$ adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
a@ubuntu:~/Kernel$ adb shell
shell@android:/ $ su
root@android:/ # cd /sdcard/temp
root@android:/sdcard/temp # ls
ath.ko
ath9k_common.ko
ath9k_htc.ko
ath9k_hw.ko
mac80211.ko

Загружаю их командой insmod имямодуля в такой и только такой последовательности (иначе просто не загрузится, выдавая ошибку):

ath.ko
ath9k_hw.ko
ath9k_common.ko
mac80211.ko
ath9k_htc.ko

III. Препятствия


В этом и вся соль, без которой статья была бы слишком простой.

1. Версии


Естественно, первая ошибка возникает на первом этапе.

insmod ath.ko

insmod: init_module 'ath.ko' failed (Exec format error)

Смотрю, что скажет об этом буфер сообщений ядра, выполнив команду dmesg:

... ath: version magic '3.0.31 SMP preempt mod_unload modversions ARMv7 p2v8' should be '3.0.31-1919150 SMP preempt mod_unload modversions ARMv7 p2v8'

Не совпадают версии. 3.0.31 не есть 3.0.31-1919150.

Решение:

Открываю тот самый Makefile в исходниках ядра и в самом верху файла нахожу:
VERSION = 3
PATCHLEVEL = 0
SUBLEVEL = 31
EXTRAVERSION =
NAME = Sneaky Weasel
Дописываю к EXTRAVERSION = недостающий кусок версии -1919150 так, чтобы получилось:
VERSION = 3
PATCHLEVEL = 0
SUBLEVEL = 31
EXTRAVERSION = -1919150
NAME = Sneaky Weasel
И сохраняю.
Заключительный этап пройдет в каталоге /include/config, где в файле kernel.release я поменяю 3.0.31 на 3.0.31-1919150
Снова make modules_prepare, make и далее по предыдущему пункту.

2. ewma


Загружая mac80211.ko снова имею ошибку, о которой dmesg скажет следующее:

<4>[ 3491.160949] C1 [         insmod] mac80211: Unknown symbol ewma_add (err 0)
<4>[ 3491.161865] C1 [         insmod] mac80211: Unknown symbol ewma_init (err 0)

Решение:

Чудом прочитав на одном из англоязычных форумов опасное, но единственное в интернете, «решение», я перехожу в /net/mac80211/ и в файлах rx.c и sta_info.c и просто удаляю [либо комментирую (//)] строки ewma_add(&sta->avg_signal, -status->signal); и ewma_init(&sta->avg_signal, 1024, 8); соответственно.

Скриншоты




Опять перекомпилирую модули и двигаюсь дальше.

3. Светодиод


При загрузке ath9k_htc.ko и mac80211.ko очередные ошибки, у mac80211.ko это:

dmesg
<4>[ 2435.271636] C1 [         insmod] mac80211: Unknown symbol led_trigger_unregister (err 0)
<4>[ 2435.271820] C1 [         insmod] mac80211: Unknown symbol led_brightness_set (err 0)
<4>[ 2435.271972] C1 [         insmod] mac80211: Unknown symbol led_blink_set (err 0)
<4>[ 2435.272033] C1 [         insmod] mac80211: Unknown symbol led_trigger_register (err 0)
<4>[ 2435.272155] C1 [         insmod] mac80211: Unknown symbol led_trigger_event (err 0)


А у ath9k_htc.ko это:

dmesg
<4>[ 2709.396392] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_start_tx_ba_cb_irqsafe (err 0)
<4>[ 2709.396972] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_free_hw (err 0)
<4>[ 2709.397155] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_alloc_hw (err 0)
<4>[ 2709.397216] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_start_tx_ba_session (err 0)
<4>[ 2709.397369] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_register_hw (err 0)
<4>[ 2709.397430] C1 [         insmod] ath9k_htc: Unknown symbol led_classdev_unregister (err 0)
<4>[ 2709.397491] C1 [         insmod] ath9k_htc: Unknown symbol __ieee80211_create_tpt_led_trigger (err 0)
<4>[ 2709.397766] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_get_buffered_bc (err 0)
<4>[ 2709.397827] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_find_sta (err 0)
<4>[ 2709.398284] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_stop_tx_ba_cb_irqsafe (err 0)
<4>[ 2709.398376] C1 [         insmod] ath9k_htc: Unknown symbol wiphy_to_ieee80211_hw (err 0)
<4>[ 2709.398498] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_queue_delayed_work (err 0)
<4>[ 2709.398712] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_rx (err 0)
<4>[ 2709.398895] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_wake_queues (err 0)
<4>[ 2709.399230] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_tx_status (err 0)
<4>[ 2709.399291] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_stop_queues (err 0)
<4>[ 2709.399505] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_iterate_active_interfaces_atomic (err 0)
<4>[ 2709.399597] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_unregister_hw (err 0)
<4>[ 2709.399749] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_beacon_get_tim (err 0)
<4>[ 2709.399871] C1 [         insmod] ath9k_htc: Unknown symbol led_classdev_register (err 0)
<4>[ 2709.399932] C1 [         insmod] ath9k_htc: Unknown symbol ieee80211_queue_work (err 0)


Если ieee80211_-ошибки от ath9k_htc.ko это потому что я пытаюсь его загрузить до mac80211.ko, то led_-ошибки от обоих модулей от того, что телефон не понимает, что делать со светодиодом на моем адаптере. Тут два варианта развития событий.

В первом просто убирается в графической конфигурации ядра значок [*] напротив
Networking support > Wireless > Enable LED triggers и Device Drivers > LED Support.

А во втором этот самый значок заморожен и снять его нельзя. Это значит, что при выборе моего адаптера, автоматически выбирается «поддержка» светодиода, убрать которую нельзя. Конечно же, это мой случай:

Скриншоты



Решение:

Кнопка помощи по Device Drivers > LED Support выводит следующую информацию по разделу:

Скриншот


Меня интересует:
Defined at drivers/leds/Kconfig
А значит все настройки хранятся в данном файле. Долго я мучал Kconfig в /drivers/leds/ пока не додумался посмотреть такой же файл в своем /drivers/net/wireless/ath/ath9k, где нашел ответ на свой вопрос:

config ATH9K_HTC
tristate «Atheros HTC based wireless cards support»
depends on USB && MAC80211
select ATH9K_HW
select MAC80211_LEDS
select LEDS_CLASS
select NEW_LEDS
select ATH9K_COMMON
...
Сходу удаляю строки, включающие страшное слово LED, получаю

config ATH9K_HTC
tristate «Atheros HTC based wireless cards support»
depends on USB && MAC80211
select ATH9K_HW
select ATH9K_COMMON
...
и сохраняю. Теперь можно снимать галочки:

Скриншоты


Здесь и вовсе исчез пункт:


Опять и снова перекомпиляция, новые модули и т.п.

Вуаля. Все модули загружены. Выключаю Wi-Fi на телефоне и подключаю адаптер. Но светодиод на нем, как вы уже догадались, работать не будет. Оно и не нужно.

4. Версия firmware


Если все необходимые модули загрузились, но после подключения адаптера к телефону вы не наблюдаете ничего нового в выводе команды netcfg, то на помощь приходит все тот же dmesg.

[ 7582.477874] C0 [ khubd] ath9k_htc 1-1:1.0: ath9k_htc: Please upgrade to FW version 1.3
...
Скриншот


Решение:

Просто качаем другой фирмварь, но уже требуемой версии, и кладем его вместо прошлого.

IV. Финиш


Теперь никаких проблем быть не должно. Выключаю родной Wi-Fi, все модули загружены, фирмварь нужной версии. Вставляю адаптер и netcfg впервые приносит счастье. Устанавливаю для появившегося сетевого интерфейса режим монитора и поднимаю его. Успех!



Родной Wi-Fi выключен


Ну а как и зачем зачастую используется режим монитора, вы и так все знаете. Спасибо за внимание!

Aircrack через OTG



Поделиться с друзьями
-->

Комментарии (12)


  1. Dreyk
    20.07.2017 23:15
    +1

    мсье знает толк


  1. ooby
    21.07.2017 06:04

    а можно просто использовать Kali Nethunter)


    1. Rechnoy
      21.07.2017 06:49

      Увы, нет. Kali NetHunter поддерживает лишь Nexus 5, Nexus 6, Nexus 7, Nexus 9, Nexus 10 и OnePlus One.
      А встроенные сетевые карты, поддерживающие режим монитора, существуют на двух чипсетах — BCM4325 и BCM4329, и то это ошибка разработчиков.


      1. ooby
        21.07.2017 06:58

        на форумах kali есть сборки под большое количество устройств, у меня работает на Nexus 5, RPi 3, так и на HTC One mini 2, конечно не со встроенным чипсетом, у меня с 722N. Плюс в том, что в сборке все что надо уже есть


        1. Rechnoy
          21.07.2017 07:52

          Буду знать)


  1. AnarSultanov
    21.07.2017 11:36

    А не пробовали просто скомпилировать ядро, добавив нужный драйвер? По моему быстрее будет, чем с ошибками возиться.


    1. Rechnoy
      21.07.2017 11:57

      Не совсем понимаю, как это должно выглядеть. Выгрузить ядро с телефона (при том, что у меня даже конфиг ядра не получилось выгрузить), перекомпилировать на компьютере с драйвером, и загрузить обратно? Боюсь, что это как раз таки сложнее, либо вообще не реализуемо. Потому что:
      Статья Vorb:

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

      Википедия:
      Практически, динамическая загрузка модулей — это просто более гибкий способ изменения образа ядра во время выполнения — в отличие от перезагрузки с другим ядром. Модули позволяют легко расширить возможности ядра по мере необходимости.


      1. Rechnoy
        21.07.2017 12:03

        Не отобразились ссылки:
        Статья Vorb: ?https://habrahabr.ru/post/117654/
        Википедия: ?https://ru.m.wikipedia.org/wiki/Монолитное_ядро


      1. DaemonGloom
        21.07.2017 12:39

        Для вашего планшета есть исходники ядра официального. Как и для многих других — это особенности лицензирования ядра Linux. Соответственно и пересобрать его можно вполне. Как и загрузить после. Таким образом добавляли поддержку ntfs/exfat для флешек в ранних моделях планшетов.


        1. Rechnoy
          21.07.2017 12:57

          Но даже при этом версия ядра немного не совпадала.
          Это ведь уже перепрошивка самая настоящая, что обладает небольшим риском для устройства.
          Ну а вообще, я не пробовал и подобных способов в интернете не встретил при выполнении своей задачи. По этому, если работает — хорошо. Несколько путей всегда хорошо. Но, думаю, препятствий там тоже хватит)


  1. JustPeople
    21.07.2017 12:04

    nethunter + nexu5 + wn722n — заводится из коробки.


    1. Rechnoy
      21.07.2017 12:16

      Все верно, с ooby уже обсудили выше. У Nexus 5 дружеские отношения и полная совместимость с Kali NеtHunter, даже сборки искать не надо.

      Nexus 4/5 – Kali Linux NetHunter for the Nexus 5 provides you with the ultimate in penetration testing portability. With a quad-core 2.26GHz CPU and 2GB of RAM, you have an immense amount of power at your fingertips to run a wide range of attacks on a platform that easily fits in your pocket.