http://habrahabr.ru/post/243481/
Израильская компания Starcom Systems специализируется на различного рода GPS/GSM трекерах и удаленных системах контроля, базирующихся на них. В данном случае ко мне попало разработанное в этой компании устройство: электронный замок с функциями GPS-трекера
WatchLock, который Starcom выпускает совместно с компанией Mul-T-Lock.
Устройство совмещает в себе функции классического навесного замка с функциями GPS/GSM трекера и соответственно позволяет контролировать такие параметры как: открытие/закрытие замка, физическое воздействие на замок (при помощи акселерометра), текущие местоположение замка и т.д. Передача информации о событиях посредством сети GSM. Возможно использовать для связи два варианта, GPRS канал и(или) SMS сообщения (в данном случае связь через SMS меня не особо волнует, поэтому остановимся на GPRS). Передача данных ведется на сервер компании или на прокси-сервер, установленный у дилера на поддерживаемый дружественный сервис. Например, Wialon, либо опять таки на сервер компании. Частному пользователю, купившему устройство для личных нужд, не удастся его использовать без оплаты услуг сторонних компаний, что для не корпоративных пользователей может быть накладно или излишне (либо, как вариант, необходима высокая анонимность). Я один из тех, кому функционал больших мониторинговых серверов излишен, а возможность поиграться с новым устройством мотивационна. Итак, приступим!
Инструментарий
Программа-конфигуратор делалась явно разработчиками для разработчиков (что в нашем деле будет большим плюсом для проведения анализа), присутствует множество отладочных функций. Самая важная из них для нас это окно просмотра трафика между устройством и программой (трафик показывается как есть, без обработки).
Существует два способа подключить устройство к программе, запустить локальный сервер в программе и заставить замок (или имитатор) соединяться с ним:
1) По каналу GPRS, в этом случае изначально в настройках замка должны быть указаны верные настройки параметров (IP-адрес и порт), что не является возможным в нашем случае;
2) Связь через дата-кабель идущий в комплекте с замком.
Так как я был уверен, что настроек моего сервера там быть не может, подключил прибор физически. Дата-кабель представляет из себя обычный USB-SERIAL переходник с
TTL уровнями от компании FTDI (скорость обмена по умолчанию 115200 бод (8 бит, четности нет, 1 стоп бит), так же есть возможность установить скорость обмена в 57600 в настройках через конфигуратор). Так как родного кабеля для подключения устройства к компьютеру скорее всего не окажется, возможно использовать любой подходящий USB-TTL адаптер.
Распиновка информационного разъема
Устройство подключено и мы можем наблюдать обмен трафиком между устройством и программой. Сразу бросается в глаза примерная структура пакетов, неизменный заголовок и постоянно меняющиеся тело пакета при неизменной длине, что сразу говорит нам о том, что используется шифрование трафика (об этом же нам говорят и презентация и официальное руководство пользователя). Разбор заголовка оставим на потом, хотя уже заметно, что в нем содержится стартовый байт (0x24 — символ '$', все пакеты начинаются с него) и серийный номер устройства (9A 02 00 00 — 666). Как же найти алгоритм шифрования и ключ? Тут все логично: если программа-конфигуратор может принять и отобразить содержимое пакета, значит она же его и расшифровывает, таким образом алгоритм и ключ надо искать в самой программе-конфигураторе.
Программа написана на Delphi, а это значит, что в ассемблере будет очень много различного рода вызовов в
RTL и другой мусор, который осложнит анализ работы программы. Как найти алгоритм шифрования? Я решил пойти простым путем и поискать его в коде программы по известным константам популярных алгоритмов. Способ не всегда работает, но все же есть шанс. В результате перебора я обнаружил константу
0x9E3779B9, а значит — это блочный алгоритм шифрования
TEA! Далее было необходимо понять (уже анализируя код алгоритма), какой конкретно вариант реализации этого алгоритма используется. Оказалось, что используется
XXTEA, но алгоритм был слегка изменен для того, чтобы, подумав, что вы угадали реализацию и проверив на деле, что результат не сошелся — пошли искать дальше.
Теперь мы знаем, что используется алгоритм шифрования
XXTEA, ключ 128 бит, размер блока 64 бита, 32 раунда. Теперь мы узнали о структуре пакета чуть-чуть больше. Заголовок + тело пакета выравненное на 64 бита и один лишний байт, который, видимо, является контрольной суммой пакета. Тут опять необходимо воспользоваться дизассемблером и подробнее изучить манипуляции с последним байтом нашего пакета. Алгоритм подсчета контрольной суммы оказался XOR8. Максимальный размер заголовка 70 байт, максимальный размер тела пакета, включая контрольную сумму, тоже 70 байт. Таким образом получается, что пакет не может быть больше 140 байт. Такое значение выбрано не случайно, а, видимо, необходимо для гарантированной отправки одного пакета в одном SMS сообщении. Теперь мы имеем полное представление о структуре пакета и можно его визуализировать следующей картинкой. Я заведомо опускаю ассемблерные листинги, что делает рассказ немного похожим на
руководство по рисованию совы. но без должного и подробного описаниях этих листингов они не имеют смысла, да и тянут на отдельную статью. Как писал Стивен Хоукинг: «каждое уравнение, добавленное в книгу, уменьшает доход от её продаж вдвое».
Структура пакета понятна, алгоритм шифрования известен. Мы можем либо сделать программу-помощник и модифицируя известный пакет, смотреть как он отображается программой, понимая тем самым значения тех или иных полей пакета, либо анализировать в отладчике поведение программы при получении пакета. Так как пакет не разбирается сразу в одном месте программы, а только по необходимости, было решено сделать программу-помощник, которая может общаться как с устройством, так и с программой-конфигуратором.
На картинке уже одна из последних версий программы, где я разобрал почти все поля основных пакетов, но начиналось все с простой формы ввода данных и отображения результата. Подробную информацию о значениях полей пакетов и их структуре, а так же все исходные коды проектов можно найти в репозитории на Bitbucket:
Watchlock tools (проекты можно собрать в
Pelles C).
Для работы с прибором необходимо понимать, каким образом прибор выходит на связь и идентифицирует себя. Я выделил два основных типа пакета — (см.
wl_protocol.pdf из репозитория) PING и TRACKING. PING пакет отправляется устройством на сервер сразу после соединения, пакет минималистичен и содержит лишь ключевую информацию, такую, как серийный номер прибор, время часов прибора, тип аппаратной платформы устройства, версию микропрограммы, GPS координаты и настройки периода выхода на связь. TRACKING пакет идет обычно следом за PING пакетом и уже содержит более расширенную информацию, такую как причина выхода на связь, состояние датчиков, напряжение питания батареи и тд. В свою очередь во время установленной сессии мы можем отправлять запросы в прибор, таким образом, например, изменяя установленное время следующего выхода на связь, при необходимости запросить IMEI модема устройства, прочитать/записать базовые настройки прибора. Таким образом с подключенным устройством мы можем сделать почти всё, что необходимо, но в нашем случае столь обширных манипуляций с прибором делать не придется.
Проделав такой длинный путь, мы уже можем приступить к реализации своего сервера приема сообщений от устройства WatchLock. Сервер простой, только для проверки общей концепции и, конечно же, даже рядом не стоит с официальном или сторонним для специализированных целей. Сервер имеет веб-интерфейс для просмотра текущего состояния подключенных клиентов и позволяет декодировать определенный набор параметров от них.
В итоге мы получили свой сервер приема данных
с блэкджеком и общие понятия о реализации протокола обмена в GPS-трекерах на базе устройства WatchLock. Данная статья актуальна и для других приборов компании Starcom, таких как Helios (автомобильный треккер), Triton (треккер для грузов) и других. Как дальнейшее улучшение, можно предложить портировать программу-сервер под Linux и сделать связку с Google Spreadsheet для сохранения информации о точках. Как платформу для этого сервера можно использовать роутер, таким образом получив компактное решение для личных нужд.
Вся информация представлена исключительно для личного использования и, конечно же, не претендует на замену официальных или сторонних серверов приема и обработки данных.