Что мы сделали когда штатный функционал перестал покрывать наши потребности

Регистрация
23.12.2014
Сообщения
834
Реакции
302
Баллы
63
Вступление
Работаем на ZennoDroid Enterprise с первых дней публикации этого продукта. Крутится все нормально, нареканий практически нет, но с повышением “ставок” остро встал вопрос антидетекта. Не «забанят или нет», а по-конкретному, что видно будет с той стороны, если когда возникнет такая потребность.
Принимая реалии 2026 года (разработчики любого ПО или сервиса точно так как и мы используют нейронки) мы начали зае… нейронки прикидываясь разработчиками того или иного ПО или сервиса, ответы были конечно разные, но в 90% ответы (маркеры) совпадали.
Что выписали
Пришлось разобрать теорию и практику, получили две группы признаков для детекции.
Маркеры инструментов:
  1. Активная отладка.
  2. ADB.
  3. Следы известных фреймворков автоматизации - Appium, Espresso, Robot Framework.
  4. Открытый root.
  5. Повторяющиеся серийники и/или наборы компонентов на “разных” устройствах.
Проверяется на раз-два.
Пользовательские метрики:
  1. Нет пополняемых контактов, новых фото, активных мессенджеров.
  2. Акселерометр, гироскоп и GPS статичный или вообще закрыт доступ.
  3. Тапы и свайпы без реальных паттернов.
  4. “Странное” использование клавиатуры.
  5. Постоянный впн.
  6. Не обновляется своевременно.
Как по минимуму понять что собирает приложение прямо сейчас?
В идеальном мире разработчики приложений должны об этом честно написать в файле manifest, Яндекс браузер для примера (проверяли в Августе) мониторит 142 приложения 8-) следит за всеми установками и удалениями приложений, за активностью в мессенджерах, за самим фактом активного VPN, все кто сомневается могут самостоятельно разобрать любое apk и проверить содержимое этого файла и вскормить нейронкам для анализа содержимого и зависимостей, самое главное что эту аналитику на 99% все будут расширять тем или иным способом.
Что из этого следует
Часть пунктов вытекает из самой основы — из того, как устройство подключено и как до него доходят команды. Сверху мимикрировать можно долго, толку мало.
Первый шаг
Собрали очень подробное ТЗ, но вот все умные нейронки по кодинку наотрез отказались брать это в работу “маркеры трояна”, не помогло не подмена контекста не видоизменение самого ТЗ.
Выход нашли через 2 недели, раздробили ТЗ на 16 частей оставив все заложенные “подходы” и логику API - Разделяй и властвуй .
Лучше всего в кодинге показали себя именно решения от Open AI и Anthropic.
Времени конечно потрачено много, но за результат мягко говоря не стыдно))) По своей сути заложили достойный фундамент!!!
Плавно переезжаем на Zennoposter, но об этом попозже. Часть парка по-прежнему на ZennoDroid Enterprise (с уже внедренными решениями). Логику шаблонов переносим постепенно, попутно вычищаем пробелы и косяки — они всплывают только под нагрузкой. Отлаживаем все в боевом режиме.
Можно сказать закрыли все риски детекции и заметно расширили возможности. Материал получился очень объемный, так что разбили на 7 основных разделов.
Остальные разделы:
  1. Метод подключения.
  2. Хитрый vpn-proxy.
  3. Компьютерное зрение.
  4. Свайпы, тапы, клавиатуры.
  5. Небольшие приложения и Magisk модули.
  6. Управление фермы цепочкой Zennoposter > Helper > Мост > Агент.
 
Последнее редактирование:
  • Оценить
Реакции: volody00

Метод подключения и управления телефонами​

Отладка по USB + ADB — это классический метод управления телефоном и одновременно маркер из первого списка. Пока управление идёт через неё, первый пункт не закрыть никак.
Требования к замене:
  1. Для системы это не режим отладки.
  2. Работает без сети на телефоне.
  3. Держит много устройств с одной машины.
  4. Поднимается сам после перезагрузки телефона.
Что перебрали до AOA
Wi-Fi
. Самое очевидное - стабильность хромает + постоянно включенный Wi-Fi уже выглядит подозрительно.
Bluetooth. Выглядит как рабочий вариант, Но нужно заметно вложится в проф оборудование, пока не готовы к этому
RNDIS — USB как сетевой канал. Выглядело идеально: провод есть, сети на телефоне не требуется. На практике только потерянное время.
  • Ошибки приёма под 100%. Канал есть, данных нет.
  • Samsung форсит отладку — без неё интерфейс не поднимается.
  • На Android 9 никак.
  • Практически все MediaTek никак.
Три недели на то, чтобы убедиться, что вариант нерабочий.
ACM-serial плюс свой мост. Держали как резервный. До реализации не дошло — нашлось лучше.

Почему остановились на AOA

AOA
— штатный механизм Android для аксессуаров. Телефон подключается к серверу как к устройству, а не как отлаживаемый.
Что решило:
  1. Это не отладка. Ни по факту, ни по признакам.
  2. Сеть на телефоне не нужна вообще — всё идёт по проводу.
  3. Механизм документированный и старый, работает на всех вендорах в парке — Samsung, Xiaomi, остальные.
  4. Поднимается сам: воткнул провод — устройство появилось.
Сверху свой мост, который раздаёт устройства как обычные сетевые адреса. Дальше с ними работает уже ZennoPoster, ничего не зная про USB.
Чего не ожидали
Ограничения оказались не там, где мы их искали.
  1. Не все аппараты ведут себя одинаково. Свежие Android норовят отваливаться в обычный режим, приходится пересаживать заново управляет за подключением со стороны телефона Агент , со стороны моста отдельный компонент.
  2. Массовая перезагрузка парка — отдельное приключение для моста. Когда десяток телефонов поднимается разом, мост давится и садит их обратно по одному.
Конечно это не идеал, но это намного предпочтительнее adb.
Цена (какими усилиями)
Свой слой на телефоне, отдельный мост на на Линукс, автоподъем портов, мониторинг.
Теоретически сервер с Zennoposter может быть вне локальной сети.
Сейчас проверяем связь с агентом через интернет, работает с задержками. Стремимся к двойному управлению (основной и резервный)
 
Последнее редактирование:
  • Оценить
Реакции: S10n4eg

Хитрый VPN-Proxy​

Думаю никто не будет спорить, что прокси — одна из главных статей расходов и ощутимый пункт в детекции.
Проблема не простая. Ощутимая часть прокси-сервисов физически не отвечает из РФ. Не «медленно», а РКН режет по ip и странам, режет по протоколам, и каждый месяц список того, что не работает становится длиннее. Ставить на каждый телефон VPN-приложение — не вариант: активируется флаг ВПН, приложения видят VPN-интерфейс, часть софта это учитывает.
Задумка
Телефону вообще не нужно знать, какой формат прокси и какое Гео.
Схема в три звена:
  1. Телефон фермы. На нём ни VPN-профиля, ни прокси в настройках. Стоит magisk-модуль, который заворачивает почти весь трафик на уровне системы.
  2. Свой узел не в РФ. Единственное место, куда телефон стучится. До него доступ есть всегда — это одна точка, и её проще держать живой, чем сотню прокси.
  3. Уже с узла — в любой прокси любой страны. Хоть арендованный серверный, хоть свой телефон из любой своей фермы.
Смена ip для телефона — это смена настройки на узле по Api. Телефон ничего не замечает (подхватывает в течении 10 секунд).
Что получилось
  • Три месяца в бою на части парка. Добавляли телефоны по одному, каждый перед этим гоняли на утечки.
  • Утечки проверяем своим аналогом browserleaks: DNS, IPv6, WebRTC, реальный локальный адрес. Первые версии просвечивали.
  • Установка: поставил модуль, активировал телефон в веб панели, далее управление по Api через внешний сервер.
  • Панель: подключения, пулы прокси, кто на каком адресе сидит, кто отвалился и когда. Оповещения на почту и ТГ.
Любой телефон с этим модулем может стать источником внешнего ip адреса, но на практике не используем.
Грабли, о которых стоит знать заранее
  • Мобильные прокси меняют адрес раз в 5-15 минут и в этот момент срабатывает защита в мониторинге и это нужно иметь ввиду.
  • Статичные прокси более предпочтительнее, но выходит дороже.
  • Прокси закрывает IP, но без корректной подмены локации и датчиков движения.
  • С погашенным экраном Android душит сеть фоновым процессам, и туннель молча стоит. Вылечили, но искать причину пришлось долго.
  • Перезагрузки по расписанию рвут туннель на полторы минуты каждая. Можно доработать, но пока не до этого.
Планы
Дальше — та же связка, но для обычных пользователей: приложение на личный телефон с выбором страны переключателем. Там root недоступен и всё сложнее. Тестируем.
 

Компьютерное зрение​

Предыстория реализации
Почти 2 года активно использовал Tesseract OCR и в ZP и в ZDE, но точность, создаваемая нагрузка, нестабильные результаты и ограниченность принудило искать иной подход.
Попробывали на основе 3 разный локальных нейронок, качество GOOD, но быстродействие и пропускная способность это пиcец.
Сколько это заняло
Первый подход делали с надеждой что получится доработать и дообучить Tesseract OCR. Три недели — и в топку.
Второй заход начали с корпуса. За неделю нащелкали 13 с лишним тысяч тестовых скриншотов с фермы: разные аппараты, разрешения, светлые и темные темы, разные состояния экрана, разные приложения и разные url. Без такого набора подбирать движок бессмысленно — на десяти картинках работает всё что угодно (недавно поднималась эта тема на форуме).
Далее два с половиной месяца доводки: параметры, иконки, скорость, пропускная способность, встраивание в парк.
Итого от первой попытки до рабочего состояния — около трёх с половиной месяцев.
Кириллица
Первое, обо что споткнулись. Готовые движки кириллицу либо не понимают, либо откровенно плохо на выходе.
Остановились на офлайн-движке с нормальной кириллицей, крутится на GPU, переваривает более 5000 скриншотов за сутки на одной видеокарте, а это работа 70-90 телефонов в режиме 24/7.
Гомоглифы
Второе, и оно тоньше. Кириллические а е к м о р с т у х визуально совпадают с латинскими. Распознаватель отдаёт их латиницей — и формально он не врёт, они так и нарисованы. Внедрили свой нормализатор.
Иконки
Крестики, бургеры, кебабы и прочие навигационные иконки текстом не найти. Их нет в тексте.
Оказалось, что геометрией искать дёшево — десятки миллисекунд, никакой нейросети не надо.
На уровне внутреннего api при отправке скриншота указываем с иконками распознать или без, этот подход заметно экономит ресурсы движка. Только в самых сложных случаях отправляем на обработку нейронкой (это дорого по нагрузке).
 
Последнее редактирование:

Свайпы, тапы, клавиатуры​

Начали с того, что было под рукой. Из коробки ZennoDroid Enterprise умеет записать свайп и точно его воспроизвести — это работает, и на старте закрывало задачу. Заодно дало общую картину: из чего вообще состоит жест и на что смотреть.
Парк рос, число сценариев росло вместе с ним, и постоянно записывать и добавлять свайпы стало нереально дорого по времени. Нужен был универсальный генератор свайпов, тапов, разные жесты под нужный сценарий именно сейчас и именно под реалии именно этого телефона.
Для обучения алгоритмов нужны были реальные записи свайпов, но нашей заготовки свайпов мягко говоря не хватало.
Написали приложение-сборщик. Не «утилиту с кнопкой запись», а набор мини-игр упакованных в единый APK под разные типы движения:

  1. Перетаскивание — тянешь шар в цель.
  2. Щелчок с отрывом — короткий бросок, важна скорость в момент отпускания.
  3. Точное медленное ведение — провести по узкому коридору не задев края.
  4. Длинный бросок через экран.
Каждая игра писала траекторию пальца: координаты, давление, площадь касания, время. Не «свайп сверху вниз», а как именно человек его делает, когда увлечен игрой и не думает о том, что его записывают.
Включились в записи свайпов и коллеги, часть пришлось через фриланс биржи организовывать. За три дня собрали 23 тысячи записей с 14 разных аппаратов — от Poco и Redmi до OnePlus и Samsung разных поколений. Разные размеры экранов, левши и правши, молодые и за 50.
Свайпы и тапы
Почти месяц доработок и на выходе получили умный генератор и исполнить свайпов и тапов на уровне драйверов.
Любой жест и свайп отрабатывает на уровне реального юзера.
Клавиатуры
Вставить в поле и напечатать текст — разные вещи с точки зрения поведения.
Набор идёт по клавиатуре (2 языка + цифры и символы). Отсюда две неприятности:

  1. Геометрия клавиш своя для каждого аппарата. Разрешения разные, разные клавиатуры, именно по этой причине после установки включается калибровка (включается OCR, на его основе прощупывает клавиатуру и записывает координаты и значения кнопок).
  2. Раскладка. Перед вводом надо убедиться, что клавиатура действительно в нужном языке (точка старта). Переключение — только тем же способом, каким это делает человек.
На выходе 4 основных сценария управления клавиатурами:
  1. Точный ввод с рандомными задержками.
  2. Ввод с ошибками и исправлением.
  3. Непрерывный ввод (свайпами).
  4. Гибрид.
Сейчас в активной фазе работы по голосовому вводу.
 
Последнее редактирование:

Небольшие приложения и Magisk модули​

Фото в галерее​

Пункт из списка: нет новых фото. Телефон, на котором периодически не добавляются фото — это странный телефон.
Просто закинуть картинки в папку не выйдет. У фотографии есть EXIF: когда снято, где, чем. Пустой или неправильный EXIF хуже, чем отсутствие фото.
Сделали конвейер. Готовые снимки кладутся на устройство, приложение проставляет им GPS по таблице и публикует в галерею как обычные фото с камеры. Не «файлы в папке», а снимки, которые система и все приложения видят именно снимками.

Физика движения​

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

Умная подмена координат​

Это было наверное самая нервная реализация……
Так или иначе все из ПО худо-бедно но умеет подменять координаты, но вот полноценно имитировать сложные маршруты уже большой вопрос.
Самые капризные приложения оказались приложения от Яндекса, они просто раз в некоторое время мигают с реальной локацией. Умеют получать данные вышек сотовой связи при определенных условиях + относительно недавно стали запрашивать доступ к акселерометру и гироскопу.

Заложенный функционал:
  1. Генератор маршрута (веб сервис).
  2. Фиксированное местоположение.
  3. Сложные маршруты пешком (дороги, правила, сложное скоростное поведение, задержки на маршруте).
  4. Сложные маршруты на машине (дороги, правила, сложное скоростное поведение, задержки на маршруте).
  5. Взаимодействие с акселерометром и гироскопом.
  6. Работа в фоне и повтором и без.

Работу всего этого обеспечивает решение из Генератора маршрута и связка модуля magisk и приложения.

Wi-Fi сети​

Отдельный комплекс для управления Wi-Fi сетями, посмотреть список, добавить, подключиться, удалить, сохранить.
Мысль простая: набор сохраненных сетей — это тоже профиль устройства. Телефон, который за год не видел ни одной сети кроме одной, выглядит странным….

Щадящая зарядка​

Тут маркеры ни при чём, тут железо. Был пример приложения, но не покрывал весь парк, на его основе доработали и адаптировали под 9-16 версии андроида по всем нашим моделям телефонов. Модуль держит заряд в коридоре 60-90%, не давая ни зарядиться под завязку, ни разрядиться в ноль.

Разрешение экрана​

Ранее пользовались приложением по управлению разрешением экрана, но недавно оно стало платным и пришлось на основе его логики пересобрать свое приложение.

Громкость и яркость экрана​

Magisk модуль который самостоятельно с рандомной периодичностью меняет громкость на телефоне и яркость экрана.

Перезагрузки по расписанию​

Модуль перезагружает по часам. Есть режим по интервалу, но мы на нём обожглись: старый конфиг без явного указания режима уходил в интервальный, и телефон перезагружался не тогда, когда ожидаем (если сбывалось время).
Что общего
Всё это — Magisk-модули и небольшие свои приложения. Часть из них и была тем первым шагом, с которого начинали. Не из любви к процессу, а потому что готового под такие задачи решений нет.
Ну фото, ну датчики, ну яркость, ну громкость, ну управление вайфай сетями, ну физика движения........ НО собранные вместе они и составляют основную разницу между «устройство» и «телефон, которым пользуется человек».
 
Последнее редактирование:
Управление фермы цепочкой Zennoposter > Helper > Мост > Агент.

Zennoposter

На Zennoposter подгружается внешний код из файлика, что в свою очередь сократило время сбора шаблонов под тот или иной функционал.
Основное управление телефонами происходит C# кубиками.
Для примера всего один C# кубик отвечает за открытия Яндекс браузера вот с таким содержимым кода
C#:

C#:
Развернуть Свернуть Копировать
var ag = new ClodAgent(project.Variables["broker"].Value);
string dev = project.Variables["id"].Value;   // серийник телефона из переменной проекта
if(!ag.LaunchWait(dev, "com.yandex.browser", 12000))
    throw new System.Exception("Яндекс Браузер (com.yandex.browser) не открылся за 12000 мс");
bool ok = ag.DismissUntil(dev, "Поиск или сайт", 14, 2000);
// «Поиск или сайт» не видно — вероятно открыта СТРАНИЦА (в строке URL). Тап «+» (новая вкладка) -> табло.
// Ретрай: детект «+» флакует по таймингу (тулбар дорисовывается), пробуем несколько раз.
for(int _i = 0; _i < 6 && !ok; _i++){
    var pnt = ag.Snapshot(dev, "ocr,newtab");
    if(pnt.Has("Поиск или сайт")){ ok = ag.DismissUntil(dev, "Поиск или сайт", 14, 2000); break; }
    var nt = pnt.FindLabel("newtab");
    if(nt != null){   // «+» видно -> новая вкладка -> табло
        ag.Tap(dev, nt.Cx, nt.Cy); System.Threading.Thread.Sleep(1500);
        ok = ag.DismissUntil(dev, "Поиск или сайт", 14, 2000); break;
    }
    // ни якоря, ни «+» — нижняя панель скрыта после скролла. Реверс-свайп возвращает её,
    // на следующей итерации найдём «+» и тапнем.
    ag.Cmd(dev, "SWIPECMD\nTYPE scroll\nFROM 540 600\nTO 540 1100\nHAND right\nDUR " + new System.Random().Next(650,1150) + "\nSCREEN 1080 2160\n"); System.Threading.Thread.Sleep(1200);
}
if(!ok)
    throw new System.Exception("Табло «Поиск или сайт» не достигнуто — открыть браузер не удалось");
project.SendInfoToLog("браузер открыт, «Поиск или сайт» доступно", false);
Для примера как выглядит аналогичный вариант этого функционала на ZDE
открыть яндекс браузер.png


Helper
Helper - это по своей сути и конструктор C# кубиков и некий переводчик этого кода в понятные инструкции для Агента установленного на смартфонах, он же и отвечает за обработку данных с компьютерного зрения и OCR на лету.
Любую функцию и просто кубик можно протестировать на любом телефоне с самого интерфейса.
На некоторых особенно сложных случаях можно старый код кубика с уже рабочего шаблона вставлять в интерфейс Helper и дальше его дорабатывать, проверять его в самом интерфейсе.

Helper-1.png

Helper-2.png

Helper-11.png
Helper-12.png
Helper-13.png


Функционал постоянно накидываем....

Мост
Мост - это небольшой мини пк на линуксе к которому подключены юсб хабы, он мониторит подключения AOA , далее инициализирует это подключение и создает канал управления по сети между Helper и Агентом на телефоне.
Конечно работает со своими странностями, но это намного стабильнее классического ADB.

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

Проделан очень большой объем фундаментальных работ, по своей сложности это на много объемнее всех наших реализаций (разные регеры, накрутки Тик-Ток, Ютуб, Яндекс, Гугл, Озон, Вайлберис, Авито) вместе взятых.
 
Последнее редактирование:
Как не информативно вышло, то что в ии выдается. Нет ссылок, нет названий модулей. Посредственно... В темах отписывал что будет прям чуть ли не гайд, но вся эта инфа давно прощупана и на поверхности. Нет про пиф, нет про сокрытие кастом прошивок, acca. Инфа видимо для новичка(
 
Практически все самопис/навайпкоденные закрывающие именно наши потребности, все ПО одним нажатием переименовывается, далее раскатка "нового" ПО с удалением "старого", все это изначально реализовано именно так.
 
А что относится к про сокрытию кастом прошивок и тд то эти вопросы поднимались на форуме много раз, пересказывать все это и выдавать за свое я точно не стану
 
А что относится к про сокрытию кастом прошивок и тд то эти вопросы поднимались на форуме много раз, пересказывать все это и выдавать за свое я точно не стану
Ну хотяб раскрыть тему сокрытия рут по типу zygisk next, neozygisk, rezygisk и подобных. Они очень сильно влияют и каждый по своему хорош в зависимости от приложения. Так же подмена TEE состояния, вот это под большинство прил очень влияет, трик стор или теесимулятор. Сугубо мое мнение, для новичка нормально, но отталкивался от громких слов в других ветках.
 
  • Оценить
Реакции: Мамикон
Ну хотяб раскрыть тему сокрытия рут по типу zygisk next, neozygisk, rezygisk и подобных. Они очень сильно влияют и каждый по своему хорош в зависимости от приложения. Так же подмена TEE состояния, вот это под большинство прил очень влияет, трик стор или теесимулятор. Сугубо мое мнение, для новичка нормально, но отталкивался от громких слов в других ветках.
в корме TEE стоит keybox (криптоключи записанные на материнской плате), все что есть в открытом доступе периодически блочит Гугл, как получить эти криптоключи уже не тема этого форума, кто умеет тот продает в одни руки за 300$, увы нам это никак не исправить.
 

Кто просматривает тему: (Всего: 9, Пользователи: 5, Гости: 4)