Helpix. Мобильные телефоны

Huawei Color (Honor) Band A1 - Честь и цвет. История одного хакинга

27.10.2017
"Хочешь что-то сделать хорошо - сделай это сам".
мудрость XVIII в.
"Браслет - не роскошь, а средство оповещения".
мудрость XXI в.

Всем привет! М-да, разные бывают ситуации. Покупаешь порой девайс, а он прямо кричит: "Ломай меня полностью!" © Нет, не в смысле несанкционированного доступа (хотя слово "хакинг" сейчас в основном ассоциируют именно с этим), а в смысле изучения недокументированных возможностей устройства с целью расширения его функциональности. И вот у меня последний раз подобная ситуация возникала аж в феврале 2016 года (см. рассказ), а до того - и вовсе в январе 2015 (см. рассказ). Но в обоих случаях фигурировали всё-таки мобилы и их исследования проводились из чистого энтузиазма, а вот в случае с сегодняшним гаджетом это стало суровой необходимостью...

Итак, речь идёт об одном из не слишком многочисленных смарт-браслетов компании Huawei. Для разных рынков модель брендирована либо как Honor Band A1, либо как Huawei Color Band A1, но номер имеет тот же - AW600. Казалось бы, модель донельзя банальна - ну, да, с ультрафиолетовым датчиком, но в остальном - типичный BLE-браслет базового уровня, которым со времён первого Mi Band никого не удивишь, о чём здесь можно рассказывать? Но если бы всё и вправду было так просто, то этого рассказа точно бы не существовало.

Вживую смотрится довольно симпатично. Вот, кстати, не поверите: меня в этом браслете совершенно не интересуют ни будильник, ни измеритель ультрафиолетового излучения, ни шагомер, ни даже трекер сна... Я его купил с единственной целью - вибросигнал при входящих уведомлениях. А критерием выбора стало исключительно отсутствие присущих Xiaomi Mi Band и Microsoft Band 2 конструктивных недостатков. То есть модуль не должен ни свободно отцепляться от ремешка (как в случае с Mi Band), ни быть с ним одним целым (как в случае с Microsoft Band 2), при этом он должен уметь вибрировать при уведомлениях и уж точно держать заряд дольше каких-нибудь смарт-часов. Собственно, всё.

Но когда такой браслет был наконец найден и весьма спонтанно приобретён 14 октября сего года в одном из магазинов Comfy за ~620 грн (~$23), то откуда же мне было знать, что главное западло поджидало меня не в самом девайсе, а в официальной программе-компаньоне от производителя - Color Band A1, которая... Которая, блин, умеет взаимодействовать со всеми датчиками, но не умеет работать с произвольными уведомлениями и отправляет сигналы на браслет только в случае поступления звонка или SMS! Положение усугубило полное отсутствие альтернатив для связи с браслетом - в Gadgetbridge, например, добавили несколько новых, но Huawei они как-то стороной обходят. Ну а всякие там Fundo, сами знаете, обмениваются информацией не по BLE, а по HSP.

Конечно, я мог бы перейти в режим махрового потребителя лёгкого поведения и на следующий же день отнести браслет обратно, а затем ещё чёрт знает сколько времени искать устраивающую меня по сочетанию "конструкция/автономность/дизайн/стоимость" альтернативу и дополнительно предпроверять ПО на предмет этих самых уведомлений. Но это не наш путь. Производитель бросает нам вызов, и я его принял. Раз умеющих произвольные уведомления альтернатив официальной софтине не существует, самое время такую альтернативу создать.

Начнём с некоторых технических подробностей, хотя слишком углубляться в сам протокол не буду. Если вкратце, то каждое BLE-совместимое устройство открывает для взаимодействия ряд так называемых сервисов, которые, в свою очередь, содержат так называемые характеристики - слоты доступа с определёнными правами. Ближайшая аналогия - хост и порт в сети. Вот сервис - это хост, а характеристика - это один из открытых на этом хосте портов. Характеристикам могут быть назначены восемь различных типов прав доступа, но чаще всего используются четыре: "чтение" (read), "запись" (write), "запись без ожидания ответа" (write without response) и "передача уведомлений об изменениях" (notify).

Оказалось, что для изучения свойств сервисов и характеристик любых BLE-устройств создана целая плеяда вспомогательного ПО. Лично я воспользовался софтиной BLE Scanner, которая лично мне показалась наиболее стабильной и в то же время продвинутой. Она позволяет соединяться с любыми видимыми устройствами в радиусе действия, записывать данные в те характеристики, для которых это разрешено, и читать и подписываться на данные из тех характеристик, для которых это разрешено. Также у BLE Scanner существует платный плагин Peripheral Mode, который позволяет симулировать поведение BLE-устройства, выдавая сам смартфон за оное. Но для разгадки будоражащей меня тайны этот плагин не понадобился.

Ну так вот, помимо стандартных (требуемых спецификацией) сервисов браслет открывает всего два своих. Второй при беглом изучении оказался чем-то вроде "UART по воздуху", и стало очевидно, что это - интерфейс перепрошивки. А вот первый, как вскоре выяснилось, оказался тем, чем надо. Он содержал всего две характеристики: одна была на чтение с возможностью подписки на изменения (read+notify), вторая - на запись без ожидания ответа. Ну тут уж, казалось бы, и до тюленя дойдёт, что из этого используется для отправки сигнала с командой "а ну-ка завибрируй". Осталось выяснить, какие именно данные для этого надо туда отправлять...

И вот тут-то случилось самое печальное. По наивняку скормив приложение Color Band A1 декомпилятору JADX-GUI в надежде получить какую-то осмысленную информацию по протоколу обмена прикладного уровня, я выяснил, что это приложение было запаковано китайским же обфускатором Qihoo360, который уже якобы взломали, но распаковка перелопаченных им программ всё ещё оставалась делом муторным. Отложив это дело на самый-самый крайний случай (если вдруг совсем ничего не поможет), я решил проанализировать глазами, а какие же данные прилетают с той стороны - вдруг что-то значащее появится. Снова запустив BLE Scanner и поставив мониторинг изменений на той характеристике, которая read+notify, я испытал небольшой разрыв шаблона - ожидались, если честно, простыни данных, но по факту это были сменяющиеся короткие строки из 2-3 символов, наподобие "D;V" и "DV".

Условия, по которому одно сменялось на другое, я так и не просёк, зато получил весьма отдалённое, но хоть какое-никакое представление о том, что надо писать во write-характеристику. Поскольку я уже получил уверенность в том, что запороть ничего не выйдет (так как интерфейс доступа к памяти - другой сервис), я просто начал наугад вводить как разные короткие строки заглавными латинскими буквами, так и небольшие шестнадцатеричные последовательности. И представьте же себе моё удивление, когда на вводе одной последовательности (что-то вроде 4576C1) браслет завибрировал! "Минуточку..." - подумал я. Оказалось, что браслет вибрировал и просто при вводе 0x45, что соответствовало латинской заглавной букве E. Что интересно - во время вибрации в read-характеристике читалось "DE". Паттерн вибрации - как у будильника, но каким-то загадочным образом удалось его поменять на такой, как при входящем звонке. Путём перебора других букв оказалось, что буква A (0x41) приводит к моментальному отсоединению браслета, ну а ряд остальных либо выдают на read-характеристику какую-то неведомую инфу, либо таки меняют паттерн вибрации, что нам и нужно. Ниже приведены некоторые найденные мной команды для различных видов сигналов, поддерживаемых браслетом:

  • 0x01 - останов текущей вибрации и светодиодной индикации;
  • 0x02 - то же, что и 0x45, но ещё и со светодиодной индикацией, т.е. либо вибрация при срабатывании будильника (4 нарастающие серии импульсов, которые в начале сопровождают 4 мигания светодиода), либо вибрация при входящем звонке (8 серий по 3 импульса, 4 мигания светодиода в начале). Первое переключается на второе путём отправки команды 0x91 и пересоединения, как переключить обратно - вопрос;
  • 0x04 - вибрация при приходе SMS (2 серии из 4 импульсов, 1 мигание светодиода);
  • 0x3F (знак вопроса) - запрос "найти браслет" (вибрирует довольно сильно три раза и мигает диодом в такт);
  • 0xD2 - просто включение светодиода на неопределённый срок (отменяется любой вышеуказанной командой, кроме, собственно, 0x45).

И хотя это явно далеко не всё, полученных сведений оказалось достаточно для того, чтобы реализовать недостающую функцию самостоятельно. Конечно, я ни разу не Android-программист, и на то, на что оному понадобилось бы в районе часа, у меня ушло полдня, но прототип, тем не менее, был написан и испытан (см. гитхаб).

Как ни странно, несмотря на примитивнейший интерфейс (вбиваем MAC-адрес браслета или сканируем, жмём Connect и выходим из программы... ну, ещё, если попросит, разрешаем ей доступ к уведомлениям и к геолокации, если сканируем на Андроиде версии 6 и выше), этот прототип работает гораздо стабильнее "родной" хуавеевской софтины, насчёт невыгрузки которой из фона нужно дополнительно париться. Здесь же, наоборот, попариться придётся как раз с полным завершением процесса, так как основная кухня реализована в классе NotificationListenerService, который как раз и заточен под постоянное отслеживание уведомлений.

В этом приложении, названном ColorBuzz, в качестве основного сигнала об уведомлении был выбран самый сильный и отчётливый (0x3F), в качестве оповещения о том, что браслет соединён, - самый слабый (0x04). Ещё я намеренно открыл для внешнего доступа интент xyz.a831337.colorbuzz.buzz, чтобы оный можно было вызывать из других средств автоматизации (например, Tasker). Просто вбиваем этот интент и в качестве цели указываем BroadcastReceiver.

Разумеется, на данный момент это всего лишь прототип, удовлетворяющий единственную хотелку. Возможно, со временем доведу его до ума и сделаю более "дружелюбную" софтину, которую не стыдно будет и в Маркет выложить в качестве неофициальной альтернативы. И на Helpix по такому случаю отдельный обзор отправить.

Самому же устройству изначально хотел влепить шестёрку, но поскольку его главный с моей точки зрения минус оказался программно поправимым - поднимаю оценку до девяти. Почему не до десяти? Хотелось бы класс водозащиты посерьёзнее... Но посоветую ли остальным? Сложный вопрос. Обывателю, наверное, лучше взять что-нибудь из ряда Mi Band и подобных, если их конструкция вас не доводит до белого каления в плане риска выпадения модуля из ремешка. Тем же, кому либо плевать на произвольные уведомления, либо не страшно ради таковых держать две программы параллельно, можно смело брать AW600. Всем счастливо и до новых встреч!

P.S. При написании отзыва ни один сотрудник Huawei не пострадал.

Luxferre

Поделиться:
Конкурс! Расскажи о гаджете (смартфон, планшете и т.д.) и выиграй Doogee S60!
Конкурс! Расскажи о мобильной софтинке или игрушке и выиграй Vertex Impress Grip!
ya
Рейтинг@Mail.ru