Сегодня хотелось бы остановиться всего лишь на одном из интересных наблюдений — а именно — на защищённости мобильного приложения. Не то чтобы Niantic являлся иконой для всех мировых разработчиков, но давайте исходить из того, что их уровень разработки довольно высок, и их ошибки и недочёты будут справедливы и для большинства других мобильных приложений. Постараюсь излагать так, чтобы было интересно и понятно всем разработчикам, а не только тем, кто играл или читал что-то про игрушку.
Акт первый. Боты для всех, и никто не уйдёт обиженным
Первые версии приложения были очень слабо защищены от реверс инжиниринга, и с огромной скоростью появились гики-разработчики, которые разбирали механику игры или добавляли туда дополнительные фичи или хаки. Когда мне стало интересно, сколько всего разработчиков вовлечены эту забаву, я открыл гитхаб и мне немного поплохело:
Да, глаза вас не обманули. 1644 репозитория. Наверное, стоит уточнить, что там:
- Боты — куда же без них;
- Чистые варианты реализации API на любых языках и платформах;
- Подборки данных и механик, вытянутые из приложения;
- Приложения для поиска покемонов вокруг;
- Приложения для автоматизации действий вроде массовой эволюции покемонов;
- Приложения для просмотра спрятанных свойств покемонов (IV);
- Приложения для просчёта оптимальных боёв;
- Просто версии игры с пониженными системными требованиями.
Следует отметить, что многие приложения обязаны своим появлением тому, что в игре очень плохо реализованы или объяснены многие моменты — вполне естественно, что находчивые разработчики решили на скорую руку сколотить себе несколько костылей.
Акт второй. Робкая попытка защиты
В какой-то момент приложение резко перестало показывать удалённость покемонов (ранее были показаны три степени удалённости). Как вы думаете, с чем это связано? Подумайте пару минут. Ваше самое худшее предположение окажется правдой — удалённость рассчитывалась в клиентском приложении, которому передавались координаты находящихся рядом покемонов — что изрядно увеличивало радиус обнаружения для резвящихся ботов. Не совсем понятно, по какой причине Niantic решил полностью убрать эту фичу вместо того, чтобы перенести рассчёт на сторону сервера… Ну да ладно, это мы вряд ли когда-нибудь узнаем. Возможно, они решили не добавлять дополнительной нагрузки на и без того трещащие от натуги сервера. В эту статью не входит вопрос о том, как дочерняя компания Google так облажалась с масштабированием игры с настолько малой связностью данных, но всё же…
Акт третий. Смешная попытка защиты
Чуть позже время обнаружения покемонов после появления игрока в локации увеличилось вдвое — насколько я помню, с 5 до 10 секунд. Похоже на какие-то панические меры защиты, которые, конечно, не могли принести внятных результатов — боты точно так же увеличили вдвое таймаут.
Акт четвёртый. Защита!
Наконец настал день, когда боты и сканеры разом перестали работать. Честные игроки вздохнули с облегчением — конкурировать с ботами, многие из которых набрали недоступный игроку 30+ уровень, было очень утомительно, да и просто грустно. Но что же… Облегчение длилось всего трое суток. Энтузиасты с реддита за это время разобрали нативную C++ библиотеку, входящую в состав приложения, подобрали необходимые данные и шифрование и вновь выкатили работающую версию API, которую в течении суток подхватили боты и сканеры.
Акт пятый. Нападение!
Справедливости ради стоит заметить, что пятый и четвёртый акт шли параллельно, но мне хотелось их логически разделить.
В этом акте Google начал банить без разбору любые приложения на Google Play, которые имели хоть какое-то отношение к покемонам. Банхаммер работал без отдыха и разбора. Как пример неправедно пострадавших приложений, можно привести
- Приложение для вычисления спрятанных характеристик покемонов. Забанено за «violating the device and network abuse». Что является откровенной ложью, поскольку принцип работы приложения — распознавание картинки из игры и анализ показателей. У приложения даже нет прав на то, чтобы отправлять данные в интернет…
- Простенький калькулятор для просчёта оптимального покемона для борьбы с выбранным. Забанено потому что “violates the impersonation policy”. Что вообще является любимой фразой от Google, поскольку понять и исправить ошибку невозможно (поверьте, я пытался сделать это с другим приложением).
Акт шестой и последний. Позор.
Сложно назвать этот акт иначе. После того, как популярные приложения были убраны с google play, разработчики дружно выложили их в open source на github. Вообще, инфраструктура мобильных приложений на гитхабе довольно интересна — 2016 год позволяет делать автоматическое обновление с гитхаба, отправлять куда угодно сообщения об ошибках и в целом довольно неплохо жить без Google Play. Более того, доверие к приложению становится не меньше, а больше, чем если бы оно было выложено на Google Play…
И что же произошло? Довольно ожидаемая, но от этого не менее печальная вещь. Niantic пошёл жаловаться на репозитории. В результате большинство авторов удалили свой код (надо сказать, не полностью, а просто затёрли его последним коммитом) с примерно таким сообщением:
I've received a notice to cease and desist from Niantic Labs, and I've decided to comply with their requests. I'd like to clarify that the main reason I chose to shut it down was because I’ve lost interest rather than legal concerns. Niantic’s actions towards 3rd party developers have been very off-putting and it has killed my personal motivation to work on this project. This was a fun weekend project for a game I enjoyed, and now I’ve lost interest in both. I won’t resume development, but there are active forks of this project you could use.
Не то чтобы авторы испугались обращений Niantic, но их политика просто огорчила разработчиков до глубины души. Код приложений остался на гитхабе, форки множатся, и злонамеренное использование по-прежнему процветает. Niantic не смогли ни предоставить собственного адекватного инструментария для работы с игрой, ни защитить игру от стороннего вмешательства. И просто пошли строчить жалобы. Ну что же… Не так чтобы это было неожиданно в свете аналогичной судьбы гораздо менее популярного Ingress, но жалко, что компания, которая претендует на революцию в игровой индустрии, не учится на своих ошибках, и даже не признаёт их. Хотя радует, что есть ребята вроде Blizzard, которые понимают, насколько полезно дать игрокам возможность влиять на общий игровой мир и дорабатывать его.
UPDATE. В комментариях говорят, что я не совсем прав, или даже совсем не прав. Но Blizzard таки даёт возможность влиять хотя бы на пользовательский интерфейс. Мотив закрытия альтернативных серверов и клиентов довольно понятен — это прямая потеря прибыли.
Выводы.
Что мы можем вынести из этой печальной истории?
- Код мобильного приложения невозможно защитить. В лучшем случае, вы окажетесь просто никому не нужны — тогда вам не о чём заботиться. В ином случае, при выкладывании приложения лучше считать, что вы выложили его исходники в open source — с этой позиции гораздо проще оценивать последствия и возможные меры противодействия взлому.
- Мобильные приложения без Google Play могут существовать, и, судя по всему, в будущем их будет всё больше.
- Вы можете приобрести огромное количество помощников, если выложите своё приложение в open source. Вы боитесь? Ну что же, тогда продолжайте тешить себя иллюзией защиты. И ваши потенциальные помощники окажутся по другую сторону баррикад.
Ссылки
Подробности с реддита про разбор нового API
Ещё?
Update. Сначала стормозил и не сделал опроса с вариантами того, о чём рассказать ещё, поэтому в комментариях появились соответствующие пункты. Теперь можно просто проголосовать.
Update 2. Добавлен перевод истории взлома.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Комментарии (58)
notrobot
17.08.2016 17:58Чуть позже время обнаружения покемонов после появления игрока в локации увеличилось вдвое — насколько я помню, с 5 до 10 секунд.
Таймаут увеличили, чтобы ловить покемонов в едущей машине было проблематично (успеваешь проехать локацию до появления покемона), но при этом пешей/велосипедной прогулке этот таймаут не мешает.jehy
17.08.2016 18:03+1Странная мера защиты, с учётом того, что приложение разрешает тебе ловить покемонов будучи пассажиром (вспоминаем соответствующее предупреждение). Кроме того, ловля покемонов на скорости вообще имеет довольно мало смысла — при езде по магистрали ты встретишь гораздо меньше покемонов, чем если бы просто гулял где-то по парку. Так что непонятно, зачем дополнительно обрезать хоть какое-то развлечение для скучающего пассажира.
123150
18.08.2016 00:37Причем работает это не всегда
Уже после последнего обновления спокойно ловил покемонов из поезда, идущего явно за 100 км/ч.
Понятно, что их там не очень много — пути идут вдали от более-менее значимых дорог — но все же
kalkov
17.08.2016 18:29+1Интересно, спасибо. Хотя я бы с радостью увидел здесь больше технических деталей.
Если вы это и имели ввиду с «полной историей взлома новой версии API покемонов», то пишите обязательно!
А еще, можно по-подробнее вот про это?
Вообще, инфраструктура мобильных приложений на гитхабе довольно интересна — 2016 год позволяет делать автоматическое обновление с гитхаба
jehy
17.08.2016 18:32Да, технические подробности я могу описать в полной истории.
Про автоматическое обновление — всё просто. Гитхаб позволяет выкладывать релизы и даёт апи, которое позволяет проверить, последний ли у вас релиз. Если не последний, то нужно просто скачать новую версию и перенаправить пользователя на установку. Всё это можно было реализовать и раньше где-нибудь у себя на сервере, но теперь это совсем просто, прозрачно для пользователя, и гарантирует установку обновления из доверенного источника (если вы первый раз установили приложение из репозитория, то вы таки доверяете разработчику).kalkov
17.08.2016 19:00Ясно, а то я подумал может существует какая-то возможность автообновления без переустановки.
Evengard
17.08.2016 21:00Вот мне кстати интересно, как переустанавливает без запросов сам Гугл Плей? Нельзя ли сделать самим также?
sumanai
17.08.2016 21:03У плея рутовые права вроде как.
kolipass
18.08.2016 07:59Права системного приложения, а не рутовые.
jehy
18.08.2016 09:57Всё так, используется доступное только для Google Play разрешение android.permission.INSTALL_PACKAGES. Тому же Yandex.Store приходится скачивать приложение на ваше устройство, после чего перенаправлять на его apk при помощи стандартного Intent Intent.ACTION_VIEW для установки. Однако, выигранный иск в ФАС может теперь многое изменить…
.
kalkov
17.08.2016 22:10А вопрос в целом хороший. Может кто знает, существуют ли альтернативные сторы которые умеют обновлять приложения без переустановок (в частности без действий пользователя)? Хотя бы на девайсах с рутом.
jehy
17.08.2016 22:13Существуют. Тот же яндексовый. У меня даже публикация есть на эту тему на хабре. Проблема в том, что вы задаете этот вопрос — это показывает, насколько эти сторы популярны…
DaMneD_SoUL
17.08.2016 18:53+6Хотя радует, что есть ребята вроде Blizzard, которые понимают, насколько полезно дать игрокам возможность влиять на общий игровой мир и дорабатывать его
Очень плохое сравнение с Blizzard, компания которая годами плевала на мнение игроков по поводу баланса в World of Warcraft, закрывала все возможное моды для своих игр, судилась с обладателями пиратских серверов со старыми версиями патчей. С выходом нового патча в Heartstone ещё одно подтверждение того, что они не интересуются что волнует сообщество, факты и статистики, ничего. Даже переименование всего в Dota 2 только благодаря искам от Blizzard. Нет, эти ребята не понимают.jehy
17.08.2016 18:59Из известных мне примеров — в wow есть аж Lua для кастомизации интерфейсов. И то что можно выкладывать на battle.net карты для StarCraft 2. И вроде что-то слышал про официальное использование пользовательских модов в wow. Хотя тут я не специалист, для меня Diablo закончилась на второй версии, как и Warcraft, а StarCraft на первой… Интересно, если кто-то расскажет развёрнуто.
DaMneD_SoUL
17.08.2016 19:30По каждой игре близард можно найти иск в котором они судились с сообществом. Сообщество с радостью создавало неимоверное количество патчей для игр, багфиксы, аддоны, приводило статистику, аргументы, чтобы они модифицировали свои игры для общего блага. Blizzard при этом всё игнорировало или запрещало при этом сама ничего не собирается делать. К сожалению нет всех ссылок на проекты, которые сообщество пыталось продвинуть в продукты этой компании их было очень много, но безуспешно. Пара ссылок как пример:
Blizzard банит игроков Diablo III за использование Wine
Судебные хроники. Blizzard Entertainment
Blizzard закрывает классические фанатские сервера World Of WarcraftSirEdvin
17.08.2016 23:39+1Думаю, автор поста имел ввиду, что разработчики Blizzard дают достаточно много свободы для игроков в плане различных модификаций, чем разработчики тех же Pokemon Go.
Оставив случаи с ботами, пиратскими серверами и читами, которые, так скажем, явно не являются "честным" использованием игры, то у игроков есть возможность изменить довольно многое в игре.
Тот же, интерфейс, например, касательно которого, как я понял, и были в основном претензии к pokemon go.
Wicirelllis
17.08.2016 20:13+1Пример игры, разработчики которой слушают комьюнити — Parg of Exile. Было много случаев изменения баланса, допила полезных фич и прочего. Реддит — много примеров, разработчики, кстати, его мониторят и часто отвечают.
Справедливости ради стоит заметить, что игра не настолько популярна и является почти инди. Возможно это влияет.
Saffron
17.08.2016 19:31Вам повезло, что нинатик — это не метелица. Метелица разработчиков ботов ставит на счётчик. Ибо недополученная прибыль священна.
nokimaro
18.08.2016 00:31Вообще niantic начав активную борьбу с ботами, тоже начали юридически давить на разработчиков ботов и добиваться реального закрытия репозиториев на github.
https://www.reddit.com/r/pokemongobotting/comments/4vf5g9/necrobot_is_dead_what_happened/
А вот ребята из Bossland GMBH которые разрабатывают самых популярных ботов для WoW и Diablo 3 и имеют многолетний опыт судебных тяжб с Blizzard своего бота для pokemon go удержали на плаву http://blog.bossland-gmbh.com/2016/blizzard-devastated-clutching-at-any-straw
playnet
17.08.2016 20:13> В результате большинство авторов удалили свой код (надо сказать, не полностью, а просто затёрли его последним коммитом) с примерно таким сообщением
Но делаем HEAD-1 и вот он, код… Из более удобных вариантов — в мастере оставляем заглушку, а новый код выкладываем в бранче. Не так понятно, но соблюдается формальность.
А вообще, нужен аналог GitHub но как минимум с проверкой каждого из обращений и смелостью судиться, а как максимум не в США, чтобы можно было забивать на DMCA. Вроде такие страны и в Европе есть.
TsarIoann
18.08.2016 02:20+3Честно говоря, все 4 истории, предложенные в «Ещё?», кажутся мне весьма интересными! Буду рад, если автор найдёт силы на несколько новых статей! :)
WoolF911
18.08.2016 03:36+1Было бы очень интересно услышать подробности на тему «Полная история взлома новой версии API покемонов сообществом реддита. Она увлекательна и поучительна!». Т.к. сам был в их Discord и наблюдал, как они старательно разбираются и решают эту проблему, но многого не понял.
petrovichtim
18.08.2016 07:07+1Вы можете приобрести огромное количество помощников, если выложите своё приложение в open source. Вы боитесь? Ну что же, тогда продолжайте тешить себя иллюзией защиты. И ваши потенциальные помощники окажутся по другую сторону баррикад.
Как быть инди разработчикам? Если весь доход приложения на рекламе, зачем выставлять его код на обозрение?kolipass
18.08.2016 08:04А вы не выкладывайте ресурсы
petrovichtim
18.08.2016 08:31В смысле? картинки что ли?
kolipass
18.08.2016 12:51Картинки, уровни, звуки…
Далеко за примерами ходить не надо:
DOOMpetrovichtim
18.08.2016 14:57У меня системное приложение, без картинок не соберется, да и картинки там только иконки. Так что не вижу смысла в открытости, хотя я всей душой болею за опен сорс
kolipass
19.08.2016 11:48Ну в дум тоже не поиграть без ресурсов.
Вы же в опен сорс не выкладываете приватные ключи от сторонних sdk(социалки, метрики, «крашлитики»...)?
Можно сделать, чтобы приложение собиралось и работало, но только только для debug, а для релиза нужны будут ключи.
dobergroup
18.08.2016 09:592. Почему Apache HttpComponents стали deprecated, где лгут разработчики Google, и почему вам стоит продолжать использовать HttpComponents (и как это делать).
3. Текущая реализация SSL в браузерах вводит в заблуждение пользователя, давая иллюзию безопасности.
Оба интересны, хотя про третий я догадываюсь, но с удовольствием прочитаю
profesor08
18.08.2016 09:59+1Статья интересная, и хочется к ней дополнений в таком же порядке.
1. Полная история взлома новой версии API покемонов сообществом реддита. Она увлекательна и поучительна!
4. Почему вам не стоит прямо сейчас бежать разрабатывать своё приложение с дополненной реальностью, памятниками и Петром Первым.
Saffron
18.08.2016 10:48Я вот несколько не понял из контекста статьи. Боты всего лишь упрощают поиски покемонов при реальном передвижении по городу? А что мешает подсовывать фейковые данные геолокации и «ходить» по городу, оставаясь на рабочем месте?
jehy
18.08.2016 11:16Ничего не мешает. Но во-первых, многие любят искать покемонов ногами, а во-вторых сложно поймать редких покемонов, просто слоняясь по городу, даже если ботом.
profesor08
18.08.2016 11:32+1Так и делают. Есть приложение джойстик, которое подсовывает фейковые GPS данные. Ты сидишь на месте, тыкаешь в джойстик и персонаж ходит по какому-то городу на другом континенте.
mark_blau
18.08.2016 13:364. Начинать разработку приложений дополненной, виртуальной и смешанной реальностей нужно было вчера.
А то можно не успеть на поезд.jehy
18.08.2016 13:38Да, вам как раз была бы адресована четвёртая статья. Многие ошибочно видят внезапный поезд, в который надо прыгать любой ценой.
mark_blau
18.08.2016 14:11Лично у меня складывается впечатление, что разработчики рассматривают эти смешные трёхмерные штучки как нишевый продукт.
И уверены, что поезд не внезапный, а стоит на месте больше пятнадцати лет и ещё стоять будет, куда торопиться.
asmrnv777
18.08.2016 14:53С Impersonation, на самом деле, все просто. Как правило, достаточно заменить "%brandname% %что-то там%" на "%что-то там% для %brandname%". Могут еще попросить удалить спорные скриншоты (если на них используется контент, принадлежащий третьим лицам).
У нас уже удаляли приложение по одной популярной игре (база знаний, новости и т.д.), после недолгой переписки и вышеописанных изменений в сторе восстановили. НО, по-видимому, наложили некий «АГС-фильтр», потому что приложение очень резко просело в позициях (было топ 1-10 по тематическим запросам, стало 30+). Постепенно, похоже, фильтр сняли, сейчас позиции восстанавливаются.
Что интересно, Apple такой ерундой не страдает. В App Store заставили переименоваться вышеуказанным способом, но до скринов докапываться не стали.jehy
18.08.2016 15:16У меня с Impersonation был крайне негативный опыт с приложением для обхода блокировки рутрекера. Когда я исправил даже то, что уже нельзя было исправить, мне просто сказали, что моё приложение ничего не делает… Ну и даже если оставить в сторону этот случай, второй с GoIV уже ни в какие ворота не лезет. Так что банили всех подряд под любой подходящей причиной.
asmrnv777
18.08.2016 15:19Да, у гугла, к сожалению, есть такие косяки. У модератора плохое настроение — он берет и удаляет приложение с десятками тысяч активных и довольных юзеров, которое ничего не нарушает по факту. И при этом не обращает внимания на кучу похожих приложений, которые зачастую что-то нарушают :)
Avitale
18.08.2016 14:57Не совсем понятно, по какой причине Niantic решил полностью убрать эту фичу вместо того, чтобы перенести рассчёт на сторону сервера…
Не совсем корректно: они не убирали радар полностью, они частично отключили функционал, т.к. собираются полностью его переработать, причем частично новый функционал уже тестируется на пользователях в Сан-Франциско, и если все пойдет хорошо, его введут повсеместно. Если коротко: новый радар будет работать как многочисленные поисковые карты с гитхаба, показывая, где именно поблизости покемон, и выстраивая до него маршрут. Возможно, они поняли, что не могут перенести расчет местонахождения с клиента на сервер, поэтому решили выкрутиться таким изящным образом, встроя карты непосредственно в приложение и лишив таким образом использование сторонних карт всякого смысла.jehy
18.08.2016 15:12Они полностью убрали «лапки» — так что всё корректно. А тестовый вариант нового радара никоим образом не лишает смысла использование сторонних карт так как с ним ты по прежнему охватываешь слишком малый радиус и не можешь заниматься целенаправленным поиском редких покемонов.
Avitale
18.08.2016 17:09не можешь заниматься целенаправленным поиском редких покемонов
А потом перемещаться туда с помощью фейк-gps и ловить, сидя дома в кресле? Я не считаю это правильным и честным по отношению к другим игрокам.jehy
18.08.2016 17:13-1Да нет, я вот с работы ногами бегал, когда радар в радиусе километра что-то интересное засекал… Хотя когда радар перестал работать, оказалось, что без него играть веселее — и я не стал его ставить вновь, когда его починили.
Но речь не об этом, а о том, что что новый радар Niantec никак не лишает смысла использование сторонних карт.
QWhisper
18.08.2016 18:31я думаю тут как и с ингресом, можно конечно ходить и тупо линковать порталы или по памяти, но намного удобнее открыть карту города и посмотреть, что где куда. Опять так позволяет создавать такую вещь как филдарты, когда игроки катаются по 300км чтоб нарисовать на такой карте что нибудь красивое :)
azsx
Очень интересно.
Toggor
Поддерживаю
lostpassword
+1
Axenow
Тоже очень интересно.