![](https://habrastorage.org/web/f5a/fca/41f/f5afca41ffd64a2da2caf5f11f5b8f63.png)
Идея перевести сетевую карту телефона в режим монитора разрушилась по причине собственной наивности и незнания элементарной информации о том, что подавляющее большинство мобильных сетевых карт этот самый режим монитора и не поддерживают.
Идея реализации задумки с помощью внешнего беспроводного Wi-Fi адаптера или «свистка», поддерживающего желанный режим монитора, рушилась десятки раз из-за новых и новых ошибок и потери веры в то, что это вообще возможно, но переросла в данную статью.
Итак, как подключить внешний Wi-Fi адаптер к устройству на Android или бег с препятствиями на дистанции «вставил — netcfg wlan0 up»:
Должно быть в наличии:
- Телефон на Android
- Поддержка OTG и сам OTG
- Terminal Emulator
- ROOT
- Исходники ядра
FAQ — структура выглядит так:
Скриншот
- Внешний Wi-Fi адаптер («свисток»)
- Его firmware
- Linux дистрибутив
- ADB (не обязательно, но так удобнее)
Мой случай:
- Samsung GT-P5100 Galaxy Tab 2 10.1, Андроид 4.2.2
- OTG «30-pin — USB»
- Terminal Emulator for Android
- ROOT
- Исходники стокового ядра 3.0.31-1919150 с сайта Самсунг
- Адаптер TP-LINK TL-WN722N на чипсете AR9271
- ath9k_htc/htc_9271.fw
- Дистрибутив Ubuntu 15.04 в VMware
- 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
Появляется вот такое окно:
Скриншот![](https://habrastorage.org/r/w1560/web/c11/997/aaf/c11997aaf0a0421d87559acb92b9ab36.png)
![](https://habrastorage.org/web/c11/997/aaf/c11997aaf0a0421d87559acb92b9ab36.png)
Продвигаюсь по маршрутам:
- Networking support → Wireless
Спускаюсь к Generic IEEE 802.11 Networking stack (mac80211) и нажимаю на пробел, наблюдая появление значка М перед этим пунктом
- Device Drivers -> Network device support → Wireless LAN
Ставлю М у своего чипсета, в моем случае — Atheros Wireless Cards
Затем перехожу в сам этот раздел и внутри отмечаю все тем же пробелом и знаком M нужный мне пункт.
Скриншот
- 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Дописываю к EXTRAVERSION = недостающий кусок версии -1919150 так, чтобы получилось:
PATCHLEVEL = 0
SUBLEVEL = 31
EXTRAVERSION =
NAME = Sneaky Weasel
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); соответственно.
Скриншоты![](https://habrastorage.org/r/w1560/web/c8d/c8c/62f/c8dc8c62f24841e9b33aa2ec34ccb1b9.png)
![](https://habrastorage.org/r/w1560/web/455/b20/f39/455b20f39dea4de6a617adad698bd351.png)
![](https://habrastorage.org/web/c8d/c8c/62f/c8dc8c62f24841e9b33aa2ec34ccb1b9.png)
![](https://habrastorage.org/web/455/b20/f39/455b20f39dea4de6a617adad698bd351.png)
Опять перекомпилирую модули и двигаюсь дальше.
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.
А во втором этот самый значок заморожен и снять его нельзя. Это значит, что при выборе моего адаптера, автоматически выбирается «поддержка» светодиода, убрать которую нельзя. Конечно же, это мой случай:
Скриншоты![](https://habrastorage.org/r/w1560/web/383/dbf/5e4/383dbf5e47114fbab16479618f7e1358.png)
![](https://habrastorage.org/r/w1560/web/0ed/90c/d8c/0ed90cd8cb7f498da1a859e2a96808fe.png)
![](https://habrastorage.org/web/383/dbf/5e4/383dbf5e47114fbab16479618f7e1358.png)
![](https://habrastorage.org/web/0ed/90c/d8c/0ed90cd8cb7f498da1a859e2a96808fe.png)
Решение:
Кнопка помощи по Device Drivers → LED Support выводит следующую информацию по разделу:
Скриншот![](https://habrastorage.org/r/w1560/web/c2a/af6/200/c2aaf62004534c7baf8a54ee036976ab.png)
![](https://habrastorage.org/web/c2a/af6/200/c2aaf62004534c7baf8a54ee036976ab.png)
Меня интересует:
Defined at drivers/leds/KconfigА значит все настройки хранятся в данном файле. Долго я мучал Kconfig в /drivers/leds/ пока не додумался посмотреть такой же файл в своем /drivers/net/wireless/ath/ath9k, где нашел ответ на свой вопрос:
…Сходу удаляю строки, включающие страшное слово LED, получаю
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
...
…и сохраняю. Теперь можно снимать галочки:
config ATH9K_HTC
tristate «Atheros HTC based wireless cards support»
depends on USB && MAC80211
select ATH9K_HW
select ATH9K_COMMON
...
Скриншоты![](https://habrastorage.org/r/w1560/web/eb6/a9d/95d/eb6a9d95d6114db0bc3f9f9f6574032d.png)
Здесь и вовсе исчез пункт:
![](https://habrastorage.org/r/w1560/web/e8a/fd4/3ff/e8afd43ffedd45f4a7e08e0313ff8156.png)
![](https://habrastorage.org/web/eb6/a9d/95d/eb6a9d95d6114db0bc3f9f9f6574032d.png)
Здесь и вовсе исчез пункт:
![](https://habrastorage.org/web/e8a/fd4/3ff/e8afd43ffedd45f4a7e08e0313ff8156.png)
Опять и снова перекомпиляция, новые модули и т.п.
Вуаля. Все модули загружены. Выключаю 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
...
Скриншот![](https://habrastorage.org/r/w1560/web/993/6f4/3ae/9936f43ae74f4da8a03dff4ff52c3ed0.png)
![](https://habrastorage.org/web/993/6f4/3ae/9936f43ae74f4da8a03dff4ff52c3ed0.png)
Решение:
Просто качаем другой фирмварь, но уже требуемой версии, и кладем его вместо прошлого.
IV. Финиш
Теперь никаких проблем быть не должно. Выключаю родной Wi-Fi, все модули загружены, фирмварь нужной версии. Вставляю адаптер и netcfg впервые приносит счастье. Устанавливаю для появившегося сетевого интерфейса режим монитора и поднимаю его. Успех!
![](https://habrastorage.org/web/4a0/514/75a/4a051475ac824d3ea8a487259a0b275b.png)
Родной Wi-Fi выключен![](https://habrastorage.org/r/w1560/web/e8a/488/06a/e8a48806a1dc4af9bd3cded253fccbfd.png)
![](https://habrastorage.org/web/e8a/488/06a/e8a48806a1dc4af9bd3cded253fccbfd.png)
Ну а как и зачем зачастую используется режим монитора, вы и так все знаете. Спасибо за внимание!
Aircrack через OTG![](https://habrastorage.org/r/w1560/web/a3f/de1/d2f/a3fde1d2f1d64f108e8e0b691dc462cd.png)
![](https://habrastorage.org/r/w1560/web/479/500/25f/47950025f9b7439c87b54bd94b4e4443.png)
![](https://habrastorage.org/web/a3f/de1/d2f/a3fde1d2f1d64f108e8e0b691dc462cd.png)
![](https://habrastorage.org/web/479/500/25f/47950025f9b7439c87b54bd94b4e4443.png)