Программист
0,0
рейтинг
30 сентября 2014 в 11:54

Разработка → Универсальный метод обхода запрета Yota раздавать интернет с телефона или собираем модуль ядра Android из песочницы

Старые методы и их недостатки


Я думаю, никому уже не интересно читать во второй раз (а может быть и в третий), о том, как Yota определяет, пользуется ли человек телефоном в режиме модема или точки доступа. «Зачем нам ещё одна статья?» — спросите вы.

Дело в том, что методы обхода, приведённые по ссылкам, не позволяют настроить телефон таким образом, чтобы позже при подключении любых устройств не потребовалось ничего настраивать заново. Кроме того, пользователь будет испытывать серьёзные неудобства, если он подключает несколько устройств с разными TTL. Придётся как минимум менять TTL на одном из них.

Именно эти причины мотивировали меня копать дальше в поисках ответа на вечный вопрос «Как же всё-таки нахаляву раздать интернет всему офису?». И найти такой ответ удалось (только для android, у меня нет яблока).

Готовая программа


Когда я узнал, что Yota следит за TTL, то предположил, что наверняка где-то в других странах есть провайдеры, которые поступают так же. Пробуем ввести TTL в поиске Play Market'а.

Я был прав: тут же нашлась программа TTLEditor. Очень приятно, что она мало того, что бесплатная, так ещё и с открытым исходным кодом.
Пользоваться очень просто: выбрать интерфейс (лучше всего выбирать интерфейс через который телефон связан с провайдером, у меня это rmnet0) и нажать кнопку OK. Можно также поставить программу срабатывать при загрузке телефона.



Только одна проблема возникла: программа выдала ошибку «TTL update failed». Прежде чем ругать автора в комментариях и минусовать на Play Market'е, я решил почитать исходный код.

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

Причина ошибки


Основное действие программы — запуск от имени root следующей команды:
iptables -t mangle -A POSTROUTING -o <интерфейс> -j TTL --ttl-set <значение TTL>
Много мозгов не нужно, чтобы понять, что делает эта команда (к тому же в программе написано об этом): она устанавливает заданное значение TTL всем пакетам, проходящим через определённый интерфейс (то есть как раз то, что нам требуется).

Я попробовал выполнить команду вручную и увидел вот такую ошибку: iptables: No chain/target/match by that name. Пара минут гугления показала, что эту ошибку iptables готов выдать почти на любые неверные параметры. Гуглим применительно к TTL и что-то всё же находим. Смотрим, насколько подходящую информацию мы нашли.

Команда cat /proc/net/ip_tables_matches выдаёт список, в котором есть ttl, то есть проверять TTL наше ядро умеет. А вот в списке, который выдаёт команда cat /proc/net/ip_tables_targets, нет TTL, поэтому модифицировать TTL наше ядро не умеет. Сдаваться перед таким наглым сговором мобильных провайдеров и производителей мы не станем, поэтому идём собирать модуль ядра, которого не хватает.

Я думаю, на этом этапе пользователи CyanogenMod уже злобно похихикивают, но мне не хотелось так просто отказываться от штатной системы, а хотелось добавить именно в неё новые возможности (даже не заменяя ядро).

Отступление


Далее я предполагаю, что читатель умеет пользоваться Linux, понимает, что такое ядро и модули ядра, а также знает, как с помощью adb перекидывать файлы (adb push/pull) и как открыть на компьютере терминал телефона (adb shell). Если нет — срочно в гугл! Если да — не забудьте включить отладку по USB.

Из чего собирать и чем


Это самый сложный шаг: нужно найти подходящий кросс-компилятор и исходники ядра. Старайтесь искать именно для своего телефона, так как иначе, скорее всего, ничего не заработает (а об этом станет известно только на последнем шаге). Я сделал несколько неудачных попыток, допустив ошибку именно на этом этапе.

Модель моего телефона Sony Xperia Z1 Compact, операционная система моего компьютера Ubuntu 14.04. Ниже на их примере я покажу, как можно действовать.

  • Команда cat /proc/version может подсказать, какая версия gcc использовалась для сборки ядра на телефоне (у меня: 4.7).

  • Скачиваем подходящий кросс-компилятор (toolchain). Я нашёл его здесь. Выполняю на компьютере команду:
    git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7
    и он у меня в папке arm-eabi-4.7 (для клонирования git-репозитория не забудьте установить git).

  • Номер сборки прошивки можно посмотреть в настройках телефона «О телефоне». У меня: 14.4.A.0.108.
    Найти нужные исходники ядра удалось в соответствующем архиве здесь и в репозитории здесь. Я взял из архива, потому что раньше отыскал.
    Если я хоть что-то понимаю в мире лицензий, то производитель обязан предоставлять исходные коды ядра, работающего на андроидофоне.


Настройка и сборка


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

  • Для начала, открываем консоль в папке с исходниками ядра и настраиваем среду окружения, чтобы ядро собиралось добытым кросс-компилятором:
    export ARCH=arm
    export CROSS_COMPILE=/путь/к/arm-eabi-4.7/bin/arm-eabi-
    На конце переменной среды CROSS_COMPILE должен находиться общий префикс большинства (или всех) исполняемых файлов в папке bin.

  • Затем нужно создать для вашей модели телефона дефолтную конфигурацию ядра (файл .config). Нужная для этого команда обычно написана в каком-нибудь README поблизости. В моём случае, в папке с исходниками ядра был файл README_Xperia.
    make rhine_amami_row_defconfig    # создание дефолтной конфигурации ядра для Sony Xperia Z1 Compact

  • А вот теперь нужно сделать шаг, который обычно не приводится в описаниях сборки ядра для Android.
    make menuconfig
    Откроется конфигуратор ядра.

    Жмём «/» и вводим в поиск «TARGET_TTL».



    Ага, теперь стало ясно, где находится нужная нам возможность ядра. Переходим к ней в конфигураторе и нажимаем кнопку «M». Это значит, что мы хотим скомпилировать эту возможность как модуль ядра.



    Выходим из конфигуратора, сохраняя изменения.

  • Собираем ядро и модули:
    make -j8
    make modules
    Если произошли какие-то ошибки, то это значит, что вы, скорее всего, нашли неподходящие исходники ядра или кросс-компилятор.

  • Нужный нам собранный модуль находится здесь: net/netfilter/xt_HL.ko


Использование модуля на телефоне


Перекидываем модуль xt_HL.ko на телефон и пытаемся подключить его к ядру командой insmod.
Если эта команда выдаёт ошибку, то подробности можно узнать в выводе команды dmesg (скорее всего, это будет конфликт версий ядра и модуля или что-то похожее — это значит, что были взяты неподходящие исходники ядра или кросс-компилятор).

Если команда insmod выполнится успешно, то значит модуль удалось подключить к ядру (проверить можно командой lsmod).
После этого попробуем запустить команду, которую безуспешно пытался использовать TTLEditor. Ошибку не выдаёт? Значит правило добавилось в список. Можно проверить командой iptables -t mangle -L:



Пробуем раздавать интернет любым устройствам и радуемся.

Настройка автозагрузки


Остался последний шаг: сделать так, чтобы иметь возможность раздавать интернет всегда, когда захочется.

Создадим файл setup_ttl_editing.sh со следующий содержимым:
#!/system/bin/sh

insmod /storage/sdcard0/xt_HL.ko
iptables -t mangle -A POSTROUTING -o rmnet+ -j TTL --ttl-set 64

Закидываем его на телефон, ставим программу Script Manager и в ней настраиваем, чтобы скрипт запускался при загрузке системы и от пользователя root.



Всё настроено, можно забыть о проблеме раздачи интернета с телефона!

Примечание. Программа TTLEditor нам не нужна. Всё необходимое уже написано в скрипте.

Заключение


Я не буду писать «йота, не будьте жадинами», потому что по сравнению со многими другими мобильными провайдерами они всё-таки достаточно щедрые. Я лучше скажу: йота, оставайтесь такими же как вы есть.

Скачать файл xt_HL.ko, который у меня получился для Xperia Z1 Compact, можно по этой ссылке.
Возможно, он подойдёт и для похожих моделей телефонов.

UPD от 13.03.2015. Спасибо пользователю CTE6EJIb за файл xt_HL.ko для Xperia V Android 4.3, версия прошивки 9.2.A.2.5.
UPD от 01.08.2015. Скомпилил для Xperia Z1 Compact под Android 5, версия прошивки 14.5.A.0.270. Скачать.
Иоанн Волков @TsarIoann
карма
20,0
рейтинг 0,0
Программист
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

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

  • –20
    Рутать телефон и менять ядро для раздачи интернета?
    ИМХО, перебор.
    • +3
      Судя по статье, менять ядро не нужно — всё остаётся штатным. Недостающая функциональность подгружается модулем — это не требует никаких действий с ядром на телефоне.
      • 0
        Всё верно. Ядро остаётся какое было. Только модуль добавляется отдельным файлом.
        • –15
          Ну хорошо, ядро остаётся родное, только модуль кросс-компилится.
          Интересно, а у многих ли на хабре рутованный девайс?
          Ещё и перед походом в официальный сервис убирать рут.
          И всё это ради беспалевной раздачи интернета? Вы серьёзно?
          • +7
            Я согласен с тем, что способ сложный, запарный, не-факт-что-получится, требует затрат времени и рута. Но я же не заставляю :) Есть старый способ, он тоже работает, просто не такой универсальный.

            Мне хотелось, чтобы я мог прийти в любое место и раздать интернет первому попавшемуся под руку ноутбуку. Я своей цели добился.
          • +11
            А как можно пользоваться устройством без root прав? )
            • –5
              Миллионы людей пользуются же ежесекундно по всему миру. Им рут не нужен. Что они, по-вашему, не могут сделать с телефоном?
              • +6
                Настроить под себя!
              • +2
                Как раз таки на Хабре сидят не миллионы лемингов, которые, как всем известно, не могут ошибаться (потому что ничего не делают). А отдельные сводолюбивые хомячки, которые ошибаются, тестят свои ошибки, дебажат и так делают что то новое.

                Так что здесь доля root прав на Хабре повышена.
              • +2
                Убрать совершенно всю рекламу, включая ту, что в приложениях не пожирая цпу проксей, например. Еще можно удалять всякий мусор от вендора, если прошивка родная, а еще можно перенастроить разгон процессора, много чего можно делать. Ах да, еще и звонки записывать позволяет, и в тор ходить всем приложениям, а не только тем, которые умеют с прокси работать. Список можно продолжать очень долго.
          • +1
            уж где-где, а на хабре концентрация юзеров с рутоваными девайсами одна из высочайших
            интересно, а как вы без adaway живете? рекламу смотрите? :D
    • +3
      Спорный момент. Как по мне, лучше 1 раз решить проблему кардинально и серьёзно, чем потом на каждом устройстве что-то подкручивать (что в итоге может занять больше времени, чем описанный автором вариант).
      • +1
        Ядро заменять не нужно, только модуль добавить.
        • +2
          да, я прекрасно всё понял. Я наоборот выступил в защиту вашего способа.
          • 0
            В таком случае, благодарю Вас :)
  • +41
    Напомнило:
    image
    image
  • 0
    Супер! Такой способ, как я понимаю, подойдет и для добавления драйверов произвольных устройств в Андроид без пересборки ядра?
    Купил как-то китайский адаптер ethernet to usb otg, якобы работающий с android устройствами. Китайцы в качестве андроид драйвера приложили исходники на Си:) Устройство на смартфоне не определяется (вполне возможно они имели в виду планшеты а не смартфоны).
    • 0
      «Произвольных» — не получится: многие драйвера требуют-таки правок в ядро. Но процент успеха велик, процентов 90, можно попробовать.
    • 0
      Бывает :)
      Да, этот способ должен подойти.
      Примечание. Некоторые технические детали: ядро мы всё же пересобираем, просто не используем то, что получилось. Только модули. Просто если вообще не собирать ядро, то модули или не соберутся, или будут кривые, скорее всего.

      Я рекомендую сразу не пихать китайские исходники в ядро, а поискать в menuconfig, нет ли там уже нужного пункта.
  • 0
    По поводу сборок чего-либо разными тулчейнами, считаю нужным предупредить:
    Хорошо, когда собираете ядро, там лишних хедеров не нужно, это вещь в себе. Компилятор совместимый — и хорошо. Но при компиляции чего-либо для userspace не ругайте Android NDK за несовместимости и глюки. NDK совершенно не предназначен для системного ПО, используйте встроенную билд систему, тулчейны и sysroot от AOSP. Да, это долго, но гораздо более совместимо.
  • –1
    Говорят, если раздавать интренет в WiFi с помощью ClockworkMod Tether, то и root не нужен, и TTL сам правится.
    • 0
      Я читал, что для этого нужно настраивать специальное ПО на компе.
      • 0
        Да, так и есть. Это написано в описании приложения на Play Market прямо по ссылке, которую Вы скинули.
        • 0
          Чувствую себя нарушителем «закона о блогерах», разместившим непроверенную информацию :(
    • +1
      Ну, для начала — эта штука не умеет раздавать WiFi, интернет гоняет только по USB. Во вторых — ей нужен клиент на ПК. В третьих TTL оно не правит, оно просто создает тоннель через ADB, вот TTL и остается таким, будто все отправляется с телефона. А root да, не нужен. Нужен только ADB.
  • –2
    Живой человек, который собирает ядра под андроид! У меня к вам вопрос. Имею Galaxy Note 2 s amoled дисплеем. И мне не совсем нравится то, как работает механизм управления яркостью дисплея. Дело в том, что для понижения яркости драйвер просто заставляет пиксели включаться и выключаться. Чем больше паузы — тем ниже яркость. Но это создает эффект мерцания, от которого у меня и некоторых других пользователей болят глаза/голова. На первых прошивках мерцания не наблюдалось при яркости 42.7% и при значениях больше 85%. Соответственно я пользовался лишь этими двумя настройками. Но потом с обновлениями все поменялось, и не мерцает лишь при яркости более 85%.

    Можно ли как-то заставить драйвер не мерцать дисплеем?

    Я качал исходники ядра и тщетно пытался отыскать нужный кусок кода (я не умею ни читать ни писать код). Что нужно делать, подскажите пожалуйста?
    • +2
      Для такой безысходной ситуации у меня есть ответ: Вам нужно приобрести комплект стёкол разной мутности (или тонированности). И вместо регуляции подсветки выставить её на 100 и класть поверх дисплея стекло с подходящей мутностью :)

      Ну а если серьёзно, то предположим, что Вы немножко научились читать код. Тогда я предлагаю действовать не в лоб — читать код ядра и всё понимать (с ядром такое обычно не прокатывает) — а использовать аналитический метод: скачать исходники ядра новой версии и исходники ядра старой версии. После этого либо найти нужные файлы и сравнить по содержимому, либо, если совсем туго, то сравнить всё массово. А дальше, изучать отличия. Успехов! :)
    • 0
      А вы уверены, что соответствующие драйвера имеются в исходниках? Обычно все, что касается конкретных девайсов, проприетарное и поставляется в бинарных модулях.
      • 0
        Обычно, это делается простым управлением PWM-генератором, который имеется на борту чипа и ядро про это знает. Другое дело, что возможно это управление вынесено в user space. Но чисто интуитивно, мне кажется, что найти проблему в ядре можно.

        Описываемае проблема похожа на следующий эффект: допустим нам нужно уменьшить яркость экрана на 50%, для этого PWM программируется так, чтобы половину времени выдавать 0, а вторую половину — 1. Но вот эта самая половина может быть распределена по разному. Можно так: 0,5 секунды — 0, 0,5 секунды — 1. Частота мецания будет — 1Гц. А можно сделать то же самое, но с частотой 1КГц. В первом случае будет очень заметно, во втором — нет.

        Почему я думаю, что проблема в ядре? Потому что такую тонкую регулировку скважности обычно не выносят в юзерспейс. Но это ИМХО, основанное на ковырянии ещё в ядре 2.4 под один промышленный АРМ-контроллер когда-то очень давно.
  • +1
    Я, как автор предыдущей статьи, хочу внести свои 5 копеек.
    Во-первых, плюсую за проделанную работу, вы очень молодец!
    Во-вторых, я сделал решение на коленке, для себя, на время отсутствия проводного интернета.
    В-третьих, йота жадничает мобильный интернет, от этого и был такой мой посыл и из-за этого родился мой пост. Я по большей части пользуюсь этим оператором, т.к. у них нет роуминга по стране и пакеты минут распространяются на звонки по территории РФ.

    P.S. Вы действительно хотите раздавать интернет с телефона на офис?
    • 0
      Спасибо, что оценили мои труды.

      Да, тогда я Вас понимаю, насчёт жадности йоты. Ведь там вроде такой же интернет, но для компа, стоит в 4 с лишним раза дороже…

      У меня в офисе вроде как и проводной интернет хороший, но сам факт наличия возможности раздавать им всем интернет греет мне душу :)
  • +2
    Не могу не отписаться. Это традиционный способ определить раздачу инета. Ещё есть способ по tcp seq id, если они сильно отличаются от пакета к пакету — то атата. Только это немного сложней определить =) Ну и количество ложных срабатываний может быть больше. Но аналитическим образом можно с 100% вероятностью определить. Так же есть метод определения по user-agent. Практически никогда не бывает одинаковых юзерагентов на разных тачках, только если специально не настроить, но это уже если есть DPI у оператора.

    Ещё рекомендую настроить iptables -I FORWARD 1 -m conntrack --ctstate INVALID -j DROP.В МТСе была проблема даже на штатных роутерах, дропалось PDP, если пролетало больше 10 невалидных пакетов. Что именно считается невалидным в рамках оборудования МТС я не знаю, но пакет прилетевший не с выданного ИП адреса в трубу 3G считался невалидным. У меня такие пакеты пролетали в результате несрабатывания NAT по каким-то неизвестным мне причинам. В итоге поправили на стороне оператора, хотя с моей стороны временное решение в виде правила выше тоже работало, но я решил пойти дальше, т.к. проблема проявлялась даже на официальных 3g-wifi роутерах.
    • 0
      Ну по юзерагенту это совсем уж убогий способ, на мой взгляд. Во-первых, только http (даже не https), а во-вторых — всякие приложения для вк, твиттера и другие — они же все работают в основном через http и у каждого свой юзерагент. Йота запарится прописывать их в разрешённые.

      За инфу, в целом, спасибо! :)
  • +1
    И кстати ещё один способ возможный — поднять openvpn — пролезет даже через йоту (которая вроде gre режет) и наплевать на все ограничения. Даже не IOS не нужен джейл для опена. Единственный нюанс — нужен сам openvpn сервер.
    • 0
      Если для личных нужд, то VPS стартуют от 5 долларов в месяц.
      • 0
        вообще-то, от 3 евро в год…
    • 0
      Йота же VPN режет, недавно об этом писали. Как openvpn при этом пролезет, можно поподробнее?
      • 0
        Йота gre режет, openvpn не использует gre. Openvpn можно даже через закрытый корпоративный прокси пустить, подняв сервак на 443 порту и всё будет работать. Я так никогда не сидел с ограниченным инетом на работе =) Щас тупо LTE-свисток, т.к. рабочий инет совсем грустный.
  • +1
    Спасибо!
    Ваш собранный модуль прекрасно работает и на 157й прошивке sony Z1 compact.
    • +1
      Пожалуйста! Я и сам когда-то на 157 перешёл. Досаждает только то, что после обновы опять заново рутовать надо :(
  • 0
    Всем, кто заинтересован: в конце статьи добавлен скомпилированный модуль для Xperia V.
  • 0
    Ещё одно обновление: в конце статьи добавил модуль под 5-ый Android для Xperia Z1 Compact.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.