Пример можете посмотреть здесь.
У Max существует два API:
- WSS (WebSocket) - для web-версии
- TLS - для приложений
По факту это один и тот же API, но разница между ними все же есть. Как пример, в web-версии вырезали аутентификацию по телефону.
Наиболее простой API с понятной структурой и самым легким способом анализа.
Анализ можно проводить прямо в браузере с помощью панели разработчика:
-
Зайти на сайт: https://web.max.ru
-
Открыть консоль разработчика:
Ctrl + Shift + J, либо- ПКМ -> Проверить
-
Перейти во вкладку Network.
-
(Опционально) В фильтрах сверху выбрать Socket.
-
Перезагрузить страницу.
-
Найти и открыть WebSocket-подключение:
- если выполнен пункт 4 - оно будет первым и единственным.
-
Перейти во вкладку Messages.
Пример:
{"ver":11,"cmd":0,"seq":0,"opcode":6,"payload":{здесь payload}}
| Поля | Описание |
|---|---|
| ver | Версия (протокола?). За все время анализа не менялась. |
| cmd | Тип команды (см. здесь). |
| seq | Номер пакета. Обычно начинается с 1 и увеличивается на 1 с каждым отправленным пакетом. Ответ на пакет (если он есть) приходит с таким же seq. |
| opcode | Тип пакета (см. здесь). |
| payload | Полезная нагрузка - содержание пакета. |
Сообщения кодируются в JSON.
Здесь начинается самое интересное. В отличие от web-версии, в приложении нет простого пути анализа, а структура пакетов другая.
Далее описание ориентировано на Windows-версию.
-
Скачать Windows-версию приложения:
-
Установить приложение.
- Я использовал виртуальную машину, но это не принципиально.
-
Подготовить инструмент для анализа трафика.
- В данном описании используется mitmproxy.
-
Скачать Windows-версию:
-
Установить приложение.
-
Запустить mitmweb (веб-интерфейс - более удобен).
Файл сертификата:
C:\Users\%User%\.mitmproxy\mitmproxy-ca-cert.cer
Параметры установки:
- Устанавливать для: Локального компьютера
- Хранилище: Доверенные корневые центры сертификации
В интерфейсе mitmproxy:
-
Перейти во вкладку Capture.
-
Включить Local Applications.
-
Выбрать
max.exe. -
Перейти во вкладку Flow List.
-
Очистить список:
- File -> Clear All
-
(Опционально) Перезапустить Max.
Готово.
В mitmproxy после выбора соединения в правом верхнем углу можно выбрать режим View.
Наиболее полезные режимы:
- Hex Dump
- Hex Stream
Для анализа Hex Stream удобно использовать сервис:
- https://hexed.it - отличный инструмент для работы с бинарными данными.
Заголовок - 10 байт.
| Байты | Описание |
|---|---|
| 1 | ver |
| 2 | cmd |
| 3..4 | seq |
| 5..6 | opcode |
| 7 | ??? |
| 8..10 | Длина payload в байтах |
| 11.. | Payload |
Обычно кодируется в формате MsgPack.
Important
Если значение 7-го байта ≠ 0, то в начале payload присутствуют 2 дополнительных неизвестных байта.
Note
Актуально и для WebSocket
| Значение | Описание |
|---|---|
| 0 | Запрос |
| 1 | Ответ |
| 2 | ??? (видел, но не уверен, какую роль играет) |
| 3 | Ошибка |
(w)- предположение на основе web-версии
| Opcode | Описание |
|---|---|
| 1 | Interactive? Наверное, что-то вроде пинга. |
| 5 | События - действия клиента (w) |
| 6 | Информация о клиенте |
| 11 | Отправка номера телефона (аутентификация) |
| 12 | Проверка кода из SMS |
| 16 | Задать профиль (w) |
| 19 | Вход по токену |
| 22 | Задать настройку (w) |
| 25 | Получить аватарки (w) |
| 26 | Секции по ID (w) |
| 27 | Эмодзи (w) |
| 28 | Эмодзи по ID (w) |
| 32 | Контакт по ID (w) |
| 35 | Последнее время онлайн контакта по ID (w) |
| 36 | Список заблокированных контактов (w) |
| 48 | Информация о чате по ID (w) |
| 49 | История чата по ID (w) |
| 50 | Действие с каналом (например, отметить прочитанным) (w) |
| 64 | Отправить сообщения (w) |
| 73 | Поиск по чату (w) |
| 75 | Подписка на чат (клиент просматривает чат) (w) |
| 76 | Создать групповой звонок (w) |
| 79 | Истории (w) |
| 83 | Получить видео по ID (w) |
| 89 | Информация о ссылке (w) |
| 96 | Сессии клиента (входы, устройства и т.п.) (w) |
| 130 | Событие, связанное с чатом (от сервера) (w) |
| 160 | Получить мини-приложение (w) |
| 177 | ??? (w) |
| 178 | Добавить реакцию на сообщение (w) |
| 180 | Реакции на сообщениях (w) |
| 272 | Папки (w) |
| 274 | Добавить папку (w) |
| 275 | Задать порядок папок (w) |
| 276 | Удалить папку (w) |
| 288 | Запрос QR-кода для входа (w) |
| 289 | Статус QR-кода по trackId (w) |
| 291 | Вход по trackId после сканирования QR-кода (w) |
| 292 | Запрос от сервера: показать баннер |
Пару матов про 7-й байт.
Желание сделать API у меня было давно, но я так его и не реализовал. Основная причина - 7-й байт заголовка.
Если значение 7-го байта не равно нулю, то в начале payload появляются 2 неизвестных байта, и payload перестает адекватно декодироваться как MsgPack. Я не имею ни малейшего понятия, что это за байт и в чем его смысл. Пробовал использовать нейросети для анализа пакетов - но они слишком тупые для таких задач. Единственный реальный способ разобраться - декомпиляция приложения, но я все же хочу еще увидеть солнце, так что этим заниматься не собираюсь.
На данный момент у меня есть лишь два предположения:
- Это некий вид сжатия.
- Это некое шифрование.
Скорее всего, оба предположения неверны, потому что в случае сжатия 7-й байт встречается даже в маленьких пакетах, где сжатие бессмысленно, а в больших пакетах его может не быть. А в случае шифрования пакет все еще частично читаем и частично декодируется как MsgPack.
Выглядит это так, будто payload просто побит.