Предварительный просмотр Pokémon Go Plus (через реверс-инжиниринг)

  1. Устройство с низким энергопотреблением Bluetooth
  2. Архитектура
  3. Обратные паттерны
  4. И что?

Во время проверки приложения Pokémon Go Я случайно нашел информацию о предстоящем Покемон Go Plus устройство. По сути, это Pokémon IoT: подключенный браслет с кнопкой (например, для бросания в покебол), светодиод RGB и возможность вибрации (например, для уведомления о ближайшем покемоне).

Устройство еще не выпущено, и программное обеспечение все еще находится в стадии разработки: как вы можете видеть ниже, версия 0.29.x соответствует «BETA4».

Реализация в версии 0.31.0 значительно изменилась, и большая часть кода была перемещена в ее собственную библиотеку libpgpplugin.so. И нет, это не плагин PGP / GPG. PGP, вероятно, означает Покемон Go Plus;)

Устройство с низким энергопотреблением Bluetooth

На первый взгляд, мы сразу видим, что устройство будет общаться через Bluetooth с низким энергопотреблением (как и многие устройства IoT, такие как Fitbit Flex, зубная щетка Beam и т. Д.).

В настоящее время запланировано 4 услуги BLE:

  • Сервис обновления прошивки . Этот еще не используется или не реализован.
  • Служба управления устройством . Существует одна характеристика для чтения текущей версии прошивки, одна для уведомления о нажатии кнопки и одна для управления светодиодом и вибрацией. Одинаковые характеристики пилотов как светодиодные, так и вибрационные; посмотрим как точнее ниже.
  • Служба так называемого «сертификата» , хотя на самом деле это служба аутентификации. Этот сервис еще не полностью реализован, но из того, что я разобрал, похоже, что аутентификация будет включать одноразовый номер для шифрования с помощью AES-CTR. Это должно быть подтверждено в будущих версиях.
  • Обслуживание батареи . Это стандартная служба BLE, и, используя стандартные значения, мы сможем запросить уровень заряда батареи устройства.

Архитектура

По сути, в версии 0.31.0 клиентская служба получает намерения com.nianticlabs.pokemongoplus.service.ToClient. «Дополнительное» действие намерения (например, «batteryLevel», «meetId», «pokestop») вызывает соответствующий метод из класса ClientBridge. Например, соответственно sendBatteryLevel (), sendEncounterId () и sendPokestopId (). Затем эти методы вызывают собственные функции, реализованные в libpgpplugin.so.

Итак, большинство интересных вещей должно происходить в нативной библиотеке. Ниже мы видим заглушку JNI, которая соответствует общедоступному родному void sendEncounterId (long arg1).

Код извлекает собственный дескриптор с типом «J», где J обозначает «длинный» в JNI. К сожалению, насколько я понимаю, связь с устройством еще не реализована.

К сожалению, насколько я понимаю, связь с устройством еще не реализована

Следовательно, нам нужно взглянуть на более ранние версии (v0.29.x), чтобы получить больше подсказок о том, как может работать устройство Pokémon Go Plus.

Обратные паттерны

Действительно, версии 0.29.x показывают несколько тестовых сообщений для отправки на устройство Pokémon Go Plus. Например, есть байты для отправки, чтобы устройство мигало красным, или что нужно сделать на устройстве, когда захвачен покемон.

Формат для этих шаблонов кодируется следующим образом.

Есть заголовок с:

  • Байт 1 содержит задержку в миллисекундах, деленную на 50.
  • байты 2 и 3 равны 0 и, вероятно, зарезервированы.
  • байт 4 содержит приоритет сообщения (биты с 5 по 7), а затем биты с 0 по 5, количество последовательностей из 3 байтов, которые следуют

Тогда 3-байтовый шаблон имеет:

  • байт 1, задержка в миллисекундах, деленная на 50.
  • байт 2: биты 7-4 соответствуют зеленому цвету светодиода, биты 0-3 - красному цвету.
  • байт 3: бит 7 указывает, включена ли «интерполяция», биты 4–6 указывают уровень вибрации. Наконец, биты 0-3 предназначены для синего цвета светодиода.

Наконец, биты 0-3 предназначены для синего цвета светодиода

Давайте подтвердим это с помощью шаблона getBlinkRed ():

  • Заголовок «0 0 0 13». Это означает отсутствие какой-либо конкретной задержки и приоритета, и что следуют 13 3-байтовых комбинаций
  • Первый шаблон - «1, 15, 112». Это означает короткую задержку (1). 15 - двоичное значение 00001111, поэтому у нас нет зеленого, но полностью красного. 112 - 0x70 = 01110000b, что означает отсутствие синего цвета, никакой интерполяции, но включена вибрация. В общем, светодиод мигает красным и вибрирует.
  • Второй шаблон - «1, 0, 0». Это снова означает небольшую задержку, но без зеленого, синего или красного цвета и без вибрации. На практике это отключает светодиод и вибрацию.

Другие модели повторяют процесс мигания красного света и вибрации, а затем прекращаются. Это имеет ожидаемый эффект от того, что устройство "мигает" красным.

Посмотрим теперь, что делает getCaptureSucceeded. На этот раз я пойду немного быстрее, но вы можете следить по частям.

Заголовок указывает, что у нас есть 24 3-байтовых шаблона. На самом деле они состоят из 4 шаблонов, повторяемых 6 раз.

  • Шаблон 1: «3, 8, 240». Короткая задержка (3), нет зеленого, немного красного, нет синего, интерполяция и вибрация.
  • Схема 2: «3, 240, 240». Короткая задержка (3), полностью зеленый, без красного, без синего, интерполяция и вибрация.
  • Шаблон 3: «2, 0, 255». Более короткая задержка (2), полный синий, без красного, без зеленого, интерполяция и вибрация.
  • Шаблон 4: «1, 0, 143». Еще более короткая задержка (1), нет зеленого, красного, синего, интерполяция, но остановка вибрации.

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

Есть несколько других шаблонов для «декодирования» (getDowserProximity1 (), getPokemonCaught (), getReachedPokestop (), getSpawnedPokemon () ...) и, возможно, забавных, таких как getMorseGame1 (). Вы можете использовать мой скрипт Python для их декодирования ,

Естественно, все это изменение нужно будет подтвердить с помощью настоящего устройства Pokémon Go Plus после его выпуска. Между тем, мы никогда не знаем, как спецификации могут измениться.

И что?

Прежде всего, хорошие новости, я не нашел вредоносного кода ни в классах Dalvik, ни в проверенной мной нативной библиотеке.

Во-вторых, когда вся эта информация доступна, хакеры могут создать собственное устройство Pokémon Go Plus. На самом деле уже есть инициативы для этого с Ардуино.

Также возможно подготовиться к альтернативному использованию этих устройств. Например, если, как и ожидалось, устройство генерирует случайный одноразовый номер, его можно использовать в качестве аппаратного генератора случайных чисел, как я это делал с Fitbit Flex. Или код вашего собственного шаблона.

Наконец, в зависимости от того, насколько хорош механизм сопряжения, злоумышленник или ревнивый конкурент могут отправить фиктивные шаблоны, чтобы разрядить батарею вашего устройства (повторяющиеся вибрации), или отправить ложные сигналы тревоги, сообщающие, что ты рядом с покемоном , Обратите внимание, что это уже произошло без Pokémon Go Plus, поэтому будьте осторожны, когда вы идете!

Спасибо Рафаэлю Ле Брасу за советы по игре Pokémon Go.

- Крипто Девушка

Нажмите здесь, чтобы прочитать мой анализ угроз приложения Pokémon Go.

И что?