Недавно в моём распоряжении оказалась партия умных часов с поддержкой геолокации, которые после тестирования были отправлены в резерв. Мне было поручено найти применение для этих девайсов, с чего и началась история их реверс-инжиниринга, о которой я поведаю в этой статье.
Начну я с рассмотрения их внешних особенностей и схемы, после чего подробно расскажу о том, как перепрограммировал эти часы, в том числе пропатчив их под иные задачи.
▍ Первичный осмотр
В своём штатном состоянии часы не имели никаких фишек и сопровождались всего одной страницей с инструкциями о том, как их заряжать и использовать. Каждый комплект состоял из часов и зарядки к ним. Не было никаких README, сайтов или порталов разработчиков. На поверхности часов присутствовал всего один ёмкостный датчик, включавший в себя дисплей, на котором пользователь, переключая экраны, мог видеть время, отслеживать сердечный ритм и получать некоторую отладочную информацию.
Экраны часов
Отладочный экран предоставлял полезные сведения для идентификации часов. Я заметил, что указанный на нём IP-адрес был одинаков для всех часов одной модели. Изначально я подумал, что это IP-адрес сервера, с которым часы взаимодействуют.
Зарядка от часов
Часы имели степень защиты IP67. Это означало, что они были водонепроницаемы, и я, располагая ограниченным набором инструментов, никак не мог получить доступ к их внутренностям без нанесения повреждений. В духе первооткрывательства я решил попытаться вскрыть часы с помощью плоскогубцев. Было нелегко, но спустя час старательного ковыряния мне удалось «снять» верхнюю крышку корпуса.
Вскрытие устройства
Внутренности
Внутри оказалась печатная плата с LiPo-батареей. Также в корпус были встроены две антенны, подключённые к коннекторам u.FL на плате.
▍ Реверс-инжиниринг платы
Часы управляются микросхемой nRF52832 с поддержкой Bluetooth и содержат ещё две основных: Wi-Fi модуль ESP8285 и сотовый чип от SIMCOM. Поначалу меня сбило с толку присутствие Wi-Fi микроконтроллера, поскольку ничто не говорило о наличии у часов поддержки Wi-Fi. Но позднее я выяснил, что он используется для триангуляции в городской черте.
Так как точность GPS в городских условиях достаточно низкая, приблизительное местоположение часов можно определить при наличии точки доступа Wi-Fi, используя данные сотовой сети и данные GPS. Судя по схеме, nRF52832 обменивался данными с чипом SIMCOM по UART и отправлял команды для взаимодействия с мобильной сетью. Зная это, я сосредоточился на поиске UART или контактов для программирования на микросхеме nRF52832, поскольку она была основной, и именно эти подключения обычно используются для взаимодействия с микроконтроллером.
На плате присутствовало довольно много контактов, принадлежащих UART и предназначенных для программирования. Одна из интересных дорожек пролегала от двух позолоченных контактов на правой стороне платы к SWDIO и SWCLK на микросхеме nRF52832, а также линии, которая, как я ожидал, использовалась для зарядки часов. SWDIO и SWCLK — это JTAG-контакты для программирования микросхемы. На нижней стороне лицевой крышки часов также присутствовали подпружиненные контакты, которые замыкались с площадками SWDIO и SWCLK, когда часы были закрыты.
Причём эти контакты также были подключены к медным выводам на лицевой стороне часов, предоставляя внешний доступ к возможности программирования. Наличие внешнего доступа к программированию было немного странным, поскольку обычно прошивка устройства заливалась на плату с завода и впоследствии обновлялась через Wi-Fi или Bluetooth. Как правило, в доступности вывода для программирования нужды нет. Тем не менее эта особенность оказалась крайне полезной позднее, поскольку, благодаря ей, для доступа к прошивке мне не требовалось вскрывать все остальные часы. Необходимость жёсткого вскрытия каждого устройства сделала бы бессмысленной мою задачу изменить их функциональность, так как обратно собрать часы после такого будет весьма непросто.
Более интересно же было то, что на зарядке подпружиненные контакты, подключённые к SWCLK и SWDIO, были подсоединены к контактам D+ и D- порта microUSB, которые обычно используются для передачи данных. Это означало, что для перепрограммирования часов мне не придётся собирать кастомную платформу — достаточно просто распустить кабель microUSB, чтобы подключать линию программирования к любым часам. Приятный нюанс.
Контакты
Вскрытие кабеля
После того как я подключил часы к своему отладчику JLink через зарядку, первым делом я заметил, что они производят отладочный вывод с помощью приложения JLink RTT Viewer. Отлично! И, хотя возможность наблюдать отладочный вывод была очень полезна, из-за отсутствия ввода, настроенного для RTT-модуля, не было возможности отправлять часам команды. Тем не менее полученный вывод подтвердил мои предположения о внутренней схеме подключения часов.
UART-взаимодействие микросхемы nRF52832 с модулем SIMCOM
После нескольких экспериментальных попыток отправить команды через JLink я решил взглянуть на прошивку. Подключив Jlink, я смог сделать её дамп с помощью команды
nrfjprog
, сопроводив её флагами --readcode
и --readram
.Дамп штатной прошивки
Прошивка оказалась не защищена от чтения или записи, поэтому я смог получить её дамп целиком. В этот момент у меня было два варианта для перенастройки функциональности часов:
- Перепрограммировать их полностью, залив новую прошивку.
- Пропатчить IP-адрес и порт, чтобы часы отправляли данные на сервер, которым управляю я.
Поскольку перепрограммирование часов предполагало весьма масштабный процесс, я решил пойти путём патча.
▍ Переходим в Ghidra
Чтобы определить соответствующие функции и переменные в Ghidra, мне нужно было сделать дамп RAM и флэш-памяти. Поскольку это голый код с устройства Cortex M0+, мне пришлось декомпилировать прошивку в формат ARM с прямым порядком байтов, после чего Ghidra смогла сгенерировать получитаемый псевдокод.
На этой стадии мне нужно было определить расположение IP-адреса, который, как я считал, был указан где-то в коде. Часы по каналу сотовой связи отправляют данные на сервер, адрес которого показывался на их отладочном экране. Если я смогу обновить IP-адрес, то смогу и перенаправить передаваемые часами данные на подконтрольный мне сервер.
Однако мои первые попытки найти строку с IP-адресом, который я видел на экране часов, не увенчались успехом.
Моей следующей попыткой был поиск ближайшей строки из отладочного вывода, который я наблюдал в RTT Viewer. Ей оказалась
AT+CIPOPEN=0
, представляющая последовательную команду, отправляемую с nRF52832 на модуль SIMCOM с инструкцией открыть соединение с IP-адресом, указанным в виде аргумента. Отыскав эту строку, использующую IP-адрес сервера, с которым связываются часы, далее я мог бы найти область памяти, где хранится этот адрес.Строка, обнаруженная в памяти
Более успешным оказался поиск строки формата. В найденном совпадении присутствовал паттерн строки, похожий на паттерн IP-адреса. Он вызывался в функции, подозрительно похожей на
sprintf
.Ссылка на строку, вызываемую в функции
sprintf
, вызывающую четыре других переменныхФункция
sptintf
ссылалась на массив, хранящийся в DAT_20000887
, который, судя по карте памяти микросхемы nRF52832 ниже, соответствует разделу данных в RAM.Карта памяти nRF52832
Перейдя в область размещения RAM, я выяснил, что в него пишут две функции. Интересна же только первая часть этой области, поскольку именно в ней находился IP-адрес. Вторая часть позволяет выполнять последующее обновление этого адреса по воздуху.
Перепрыгнув к первой функции, я обнаружил эти жёстко прописанные шестнадцатеричные переменные, записанные в массив в рамках основной функции. Эти переменные как раз соответствовали IP-адресу, который я видел на отладочном экране часов.
Область памяти, которую нужно пропатчить
Эти области памяти представляли шесть байт данных прошивки, которые мне нужно было пропатчить для изменения IP-адреса и порта.
Всего надо пропатчить 6 байт, 4 для IP и 2 для порта
Здесь возникла небольшая заминка: в качестве номера порта выступало значение 38899, сохранённое в виде двух байтов —
0x0c
и 0x68
. В скомпилированной программе использовалась инструкция movn
, которая применяла логическую операцию NOT
к жёстко прописанным значениям до их помещения в RAM. Чисто технически, можно было пропатчить эту инструкцию, удалив операцию NOT
. Но я пытался минимизировать количество изменяемых байтов, поэтому добавил дополнительную операцию при преобразовании номера порта в подходящие шестнадцатеричные значения.▍ Перепрограммирование часов
На основе этого понимания я смог написать простой скрипт для пропатчивания прошивки на любой IP-адрес и порт. Этот скрипт также обновлял контрольную сумму каждой изменяемой строки, чтобы прошивка соответствовала ожидаемому формату. После завершения патчинга я залил прошивку на часы с помощью утилиты Programmer от компании Nordic Semiconductor.
Скрипт патчинга прошивки
Заливка прошивки
И рад сообщить, что всё прошло прекрасно! Обновив прошивку для взаимодействия с сервером, я смог получать данные с телефона и обрабатывать их.
Пропатченная прошивка
На этом этап реверс-инжиниринга завершается. В ходе процесса я многому научился, поскольку имел мало опыта по перепрограммированию устройств на базе ARM. Тем не менее у меня было хорошее понимание того, как бы я разработал устройство, и какими возможностями оно обладало, что помогло значительно сузить диапазон поиска.
Интересной новостью стало то, как интерфейс программирования был подключён к USB-порту, чего в других аналогичных часах я не встречал. Отсутствие какой-либо защиты от чтения/записи прошивки также является нетипичным, поскольку другие IoT-устройства обычно получают такую защиту при выводе в продакшен с целью предотвратить возможное клонирование.
Как бы то ни было, процесс оказался очень интересным, и возможность найти новое применение электронике, которая в противном случае осталась бы надолго пылиться на складе или была бы выброшена, придала проекту дополнительный смысл.
Telegram-канал со скидками, розыгрышами призов и новостями IT ?
Комментарии (19)
NutsUnderline
12.07.2024 14:03всего один ёмкостный датчик, включавший в себя дисплей,
полагаю что здесь идет о дисплее с тачскрином емкостного типа. для дальнейшего использования его реверс куда как более нужен, чем адреса патчить.
А вообще обычный конструктив для часов, у меня такие сами расклеиваются из за вздувшейся батареи.
NutsUnderline
12.07.2024 14:03+1ESP8285
вот тут конечно как они осуществляют триангуляцию. вероятно только передают ssid на "секретный" сервер, и там обработка. зачем тогда две микрухи, esp32 хватило бы, t-watch в герметичном корпусе. . в любом случае это отдельный модуль почти как gps, со своей прошивкой, вероятно и через swd не перепрошить ее. gps конечно жручее и дороже, но есть же относительно недорогие часы именно с gps, те же t-watch
vesowoma
поиск по картинке привел на широко известный сайт и там в описании xexun professional home arrest gps ankle bracelet gps prisoners watch for prisoner
Не получится ли у автора оригинального исследования как с тем ноутбуком для заключенных?
riky
если это часы для заключенных, то их задача передавать их координаты на сервер.
если добавить к этому описание в каком виде данные передаются на сервер, то это позволит передавать фейк координаты, и часы станут бесполезны...
интересно на сколько тут батареи хватает, ребенку бы такие.
Maccimo
Facepalm.
Вам известно понятие «гиперопека» и то, какой урон последняя наносит психике ребёнка?
voldemar_d
Вы это пишете, основываясь на реальном опыте ношения умных часов ребёнком?
А когда ребёнок носит с собой смартфон, координаты которого можно отслеживать - это тоже гиперопека?
voldemar_d
Тот, кто минусует, может пояснить, почему?
Moog_Prodigy
Для начала убери этот телефон, кря, в специальный сейф, кря, и дай мне, кря, пропуск на секретный обьект, кря, где готовят дебилов, кря, коим нынче называется школа, кря.
-Вы извините, но ваш браслет тоже может передавать геокоординаты...
-А меня не колышет, кря, я допуска требую, кря!
-Вы конечно можете мне хамить как угодно, кря, но в школу вы не зайдете, кря!
Wesha
Папа, что это сейчас было?
Kanut
Мне вот просто интересно стало. А где, как и почему вы проводите границу между просто нормальной опекой и гиперопекой?
Newbilius
Интересно, чего вы ожидаете, задавая вопрос, на который невозможно ответить не то что одной фразой - одним абзацем или даже одной страницей)
Kanut
Я ожидаю что человек обоснует свою позицию.
voldemar_d
Есть куча смарт-часов для детей. В том числе тех, которые могу звонить и принимать звонки. Например, Elari (не реклама, просто другими не интересовался). Батарейки на 2-3 дня хватает, за свои деньги вполне нормально.
kenomimi
Скорее всего, не получится. Это явно ранние инженерные образцы - прошивки не залочены, порт программирования выведен на лицевую часть (причем без esd-защиты - явно не планировался в прод), в меню отладочная инфа...
Да и ноутбук тот отломили паяльником, полным разбором и другим ПК - шум создан на пустом месте испугавшимися бюрократами, в тюрьме сей трюк не повторить никак.
vvzvlad
С ноутом проблема в том, что пароль биоса после этого выложили в открытый доступ
kenomimi
Если у них на таком устройстве один на всех пароль биоса - штош, ССЗБ, и кого-то надо гнать со службы за халатность.
vvzvlad
Не вижу в этом халатности. Вероятность того, что пароль утечет и попадает кому-нибудь в этой тюрьме очень мала.
Wesha
Ну так вот и поздравляем администрацию, маловероятный случай случился!
NutsUnderline
а снять их можно?