Эмуляторы и фермы телефонов в приложениях для заработка: как их ловить, не блокируя реальных пользователей
Один компьютер с десятью Android-эмуляторами может выглядеть как десять телефонов в десяти разных домах. Фермы телефонов идут дальше и ставят стойки с реальными устройствами. В этом руководстве разбираем, как работает и то и другое, какие аппаратные улики им не спрятать и как честно на них реагировать.
Коротко
Эмуляторы и фермы телефонов ловят, сверяя то, что сообщает железо, с тем, за что себя выдаёт устройство: модель телефона в паре с GPU, с которым она никогда не выпускается, стандартные профили эмуляторов, программные GPU и сброшенные устройства, которые появляются снова. Блокируйте явные профили эмуляторов при клике по офферу, единичное несовпадение отправляйте на проверку, а решение принимайте по всему связанному кластеру.
- Самый явный признак
- Невозможная пара модели и GPU, например Pixel 8, который сообщает о GPU Adreno.
- Что выдаёт эмулятор
- Стандартные модели эмуляторов, очень старые сборки Android со свежим Chrome, программные GPU, экран размером с десктопный у модели телефона.
- Фермы телефонов
- Повторно используют одно и то же железо, чистят хранилище, закупают дешёвые модели только для китайского рынка и выполняют одни и те же офферы в одном и том же порядке.
- Чего избегать
- Банов целых брендов и блокировки из-за одного несовпадения модели.
Почему эмуляторы и фермы охотятся на приложения для заработка
Мобильные офферы хорошо платят. Установи игру, дойди до 20-го уровня, получи несколько долларов. Рекламодатели платят столько, потому что рассчитывают на реального игрока с реальным телефоном. Ферма подделывает игрока и забирает выплату себе.
Основных схем две. Первая — эмулятор: программы вроде LDPlayer, Nox, MEmu, BlueStacks или Genymotion, которые запускают Android на ПК. Один мощный компьютер тянет сразу много эмуляторов. Вторая — ферма телефонов: полки с дешёвыми реальными телефонами, которые часто сбрасывают между аккаунтами, а иногда управляют ими скриптами.
Цель у обеих одна. Много аккаунтов, каждый выглядит как отдельный человек на отдельном устройстве, и каждый выполняет одни и те же дорогие офферы. Сеть отменяет конверсии через несколько недель, и часто к этому моменту вы уже выплатили деньги.
За что устройство себя выдаёт и что сообщает на самом деле
Любой браузер или webview сообщает, что он собой представляет. User agent и client hints дают название модели, например Pixel 8 или SM-S918U. Это заявление легко изменить: софт для ферм меняет названия моделей в один клик.
Железо подделать сложнее. Через WebGL устройство сообщает свой графический чип (GPU). Реальные телефоны выпускаются с известным GPU. В Pixel 8 стоит GPU Mali. Американские Samsung Galaxy серии S работают на чипе Snapdragon с GPU Adreno. Если заявленная модель и GPU не совпадают, значит, устройство выдаёт себя не за то, чем является.
| Заявленная модель | GPU, который сообщает устройство | Вердикт |
|---|---|---|
| Pixel 8 | Mali-G715 | Сходится: настоящий Pixel 8 выпускается с GPU этого семейства |
| Pixel 8 | Adreno 740 | Подделка: Pixel 8 никогда не выпускается с Adreno |
| Pixel 5 | Mali-G76 | Подделка: Pixel 5 выпускается с Adreno |
| SM-S918U (американский Galaxy) | Mali-G710 | Подделка: американские модели работают на Snapdragon и Adreno |
| iPhone | Adreno или Mali | Подделка: iPhone сообщает о GPU Apple |
| Android-телефон | GPU Apple | Подделка: часто под ним скрывается iPhone или Mac |
Стандартные профили эмуляторов
Эмулятору нужно выдавать себя за какую-то модель телефона. Большинство пользователей не меняют настройку по умолчанию, а стандартные профили хорошо известны. Несколько популярных эмуляторов представляются моделями Samsung для корейского рынка (суффикс N, например SM-G977N) или старыми моделями Asus и vivo. Образы для разработчиков сообщают имена вроде sdk_gphone или vbox86.
Ещё одна улика — сборка Android. Эмуляторы часто работают на старых версиях Android, например 5.1 или 7.1, с номером сборки, который встречается только в образе эмулятора. Добавьте к этому современную версию Chrome, и получится сочетание, которого у реальных телефонов почти не бывает.
- Корейская модель Samsung с американского или европейского IP. У путешественника такое возможно, у эмулятора — обычное дело.
- Очень старая сборка Android и свежий Chrome. Настолько старые реальные телефоны редко получают новые сборки Chrome.
- Программный GPU, например SwiftShader или llvmpipe. Телефон без настоящего графического чипа — это виртуальная машина.
- Экран размером с десктопный у модели телефона, или телефон, который сообщает, что у него есть мышь, но нет сенсорного экрана.
Модели только для китайского рынка за пределами Китая
Некоторые телефоны продаются только в материковом Китае. Например, модели OPPO и OnePlus с кодами вроде PJx, модели Xiaomi с окончанием на C, vivo — на A, а также Huawei и Honor с окончаниями -AN00 или -AL00. Такие модели дёшево закупать оптом, и на фермах телефонов они встречаются часто.
Модель только для китайского рынка, которая подключается из США, — ещё не доказательство фрода. Люди путешествуют и привозят телефоны из-за границы. Но когда много аккаунтов на вашем сайте сообщают такие модели с американских, британских или канадских IP, это сильный признак того, что трафик идёт с фермы, а IP — от прокси.
Сброс устройств и очистка хранилища
Фермы знают, что сайты сохраняют ID устройства. Поэтому перед каждым новым аккаунтом они стирают данные приложения, чистят браузер или сбрасывают телефон. Появляется новый ID, и сайт думает, что перед ним новое устройство.
Сброс удаляет сохранённый ID, но не железо. GPU, размер экрана, сборка Android и установленные шрифты каждый раз остаются прежними. Если хранилище устройства пустое, а железо совпадает с устройством, которое вы видели час назад, его почти наверняка сбросили.
- Пустое хранилище, знакомое железо. Отметьте такое устройство и свяжите его с прежним.
- Много аккаунтов на один аппаратный профиль за короткое время, и у каждого новый ID.
- Одинаковый порядок офферов у этих аккаунтов — признак одного скрипта или одного исполнителя.
Как действовать, не блокируя реальных пользователей
Сигналы устройства сильные, но не идеальные. Отпечаток браузера можно подделать, а дешёвые телефоны иногда сообщают странные значения. Справедливая политика использует эти сигналы, чтобы притормозить деньги, а не чтобы наказывать по одной улике.
- Блокируйте при клике по офферу только явные профили эмуляторов и программные GPU. Реальных игроков с реальными телефонами это не затронет.
- При единичном несовпадении модели — проверка, а не блокировка. Отправьте вывод в очередь вместе с доказательствами.
- Решайте по кластеру. Если у десяти аккаунтов один и тот же поддельный профиль, принимайте решение по всем десяти сразу.
- Ведите allowlist. Тестировщики, сотрудники и проверенные пользователи с необычным железом не должны попадать под флаг каждую неделю.
- Сначала измерьте. Запустите проверки без блокировки на несколько дней и посмотрите, сколько выводов они бы затронули.
Как CashoutGuard это автоматизирует
JavaScript-сборщик CashoutGuard считывает модель, GPU, экран и сборку. Ваш сервер вызывает /v1/evaluate при регистрации, клике по офферу, конверсии и выводе и получает оценку от 0 до 100 вместе с причинами.
device_spoofed— когда заявленная модель и GPU не могут принадлежать одному и тому же телефону.emulator_profile— для стандартных моделей эмуляторов и сборок Android, которые бывают только у эмуляторов.emulator_or_vmиautomation_detected— для виртуальных машин и браузеров под управлением скриптов.device_market_mismatch— для моделей только для китайского рынка за пределами Китая.storage_cleared_reappearedиdevice_shared_with_accounts— для сброшенных устройств и общего железа.
Раздел «Фрод-кольца» связывает аккаунты по устройству, адресу выплат, email и IP, поэтому ферма видна как один кластер. Новые сайты стартуют в теневом режиме, так что вы видите результаты до того, как что-либо будет заблокировано. Читайте документацию или сравните тарифы на странице цен.
Нативные Android-приложения: проверки, которые браузеру недоступны
Приложение для заработка под Android видит больше, чем веб-страница. Android SDK CashoutGuard работает внутри вашего приложения и проверяет сам телефон: свойства и файлы эмулятора, рутованную систему, фреймворки для хуков вроде Frida и Xposed, которые подменяют то, что читает приложение, отладчик, приложения для подмены геолокации и VPN, запущенный на устройстве, даже когда IP выглядит резидентным.
Кроме того, SDK присваивает каждому телефону ID, который переживает удаление и переустановку приложения. Он вычисляется из Android ID с солью из вашего ключа, поэтому для кого-либо ещё он бесполезен. Фермер, который сбрасывает приложение, чтобы завести новый аккаунт, снова определяется как то же самое устройство, и новый аккаунт связывается со старыми.
| Проверка | Код причины | Почему это важно для приложения заработка |
|---|---|---|
| Свойства, файлы и железо эмулятора | emulator_or_vm | Фермы эмуляторов круглосуточно гоняют платные установки и playtime-офферы |
| Рутованный телефон | device_rooted | Root позволяет приложению подделать ID устройства и геолокацию; сам по себе сигнал слабый, вместе с другими признаками — сильный |
| Frida, Xposed или Substrate в приложении | automation_detected | Хуки переписывают то, что видит ваше приложение, включая все остальные проверки |
| VPN, запущенный на телефоне | ip_vpn | Открывает офферы для более богатых стран, даже когда выходной IP выглядит резидентным |
| Тот же телефон после переустановки | device_shared_with_accounts | Один человек, много аккаунтов и по одной выплате за раз |
Интеграция — это один вызов перед каждой выплатой: приложение получает request_id при регистрации, клике по офферу и выводе, а ваш сервер запрашивает /v1/evaluate. Код на Kotlin — в руководстве по интеграциям.