Skip to content

nyakokitsu/MaxProtoExplanation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 

Repository files navigation

MaxProtoExplanation

Объяснение принципа работы мобильного протокола Max api.oneme.ru

Шаг 0. Введение

Вероятно все из вас, кто читает этот текст, ознакомлены с работой макса через вебсокет, поэтому мы будем обьяснять отталкиваясь от того что вы в курсе. Если нет - откройте web.max.ru и посмотрите запросы вебсокета.

Шаг 1. Обьяснение

Пожалуй начать стоит с того, что использовалось при анализе. инструментарий таков: iPhone X(palera1n) с отключенным пиннингом через SSL Kill Switch 2; proxy-сервер Charles; hex-редактор ImHex. Все инструменты бесплатные, пользуйтесь, ковыряйтесь.

Сняв пакеты через Charles мы получаем на руки следующую структуру:

[Заголовок]{Пейлоад}

[0b0100070011020000d8]{f3a785a5746f6b656ed988416e5f537836485139484469463436473161617078494932456c4577624237396679374c3339545f3753436b595574646b4d424f487a7a355450717a50446d4b62544371305a76633259315f786e67464641794d506d504f30394346626758676769526f686754394e52687a4e6c6555686838733666513937523450714e4c304f7347584d664d6caa636f64654c656e67746806b2726571756573744d61784475726174696f6ed20000ea60b01800f405436f756e744c6566740ab1616c74416374696f6e290050d20000ea60}

Рассмотрим составные заголовка и сопоставим со значениями вебсокетами

0b|0100|07|0011|020000d8

  1. ver - версия протокола, принимает значения 10/11.
  2. cmd - в теории должен означать тип запроса(от клиента/сервера - 0/1), но тут он очень очень шалит
  3. seq - секвенсор, означает какой по счету запрос.
  4. opcode - старый добрый опкод, ну кто его не знает
  5. payload_data - длина запакованного пейлоада и тип сжатия, значение уникальное для мобильного прото, понадобится нам позже.

Для кодировки payload используется довольно известный messagepack, который вкунтахты используют уже десятилетие, так что это не самая великая тайна.

Шаг 2: Пердолинг

Давайте попробуем распаковать самый простой пример.

0a00000700110000003083a570686f6e65ac2b3739393939393939393939a474797065aa53544152545f41555448a86c616e6775616765a27275

Поочередно распакуем заголовок и пейлоад с помощью библиотеки msgpack для python.

import msgpack

def unpack_packet(data: bytes):
    ver = int.from_bytes(data[0:1], "big")
    cmd = int.from_bytes(data[1:3], "big")
    seq = int.from_bytes(data[3:4], "big")
    opcode = int.from_bytes(data[4:6], "big")
    payload_length = int.from_bytes(data[6:10], "big")

    payload_bytes = data[10 : 10 + payload_length]
    payload = msgpack.unpackb(payload_bytes, raw=False)

    return {
        "ver": ver,
        "cmd": cmd,
        "seq": seq,
        "opcode": opcode,
        "payload": payload,
    }

Результат:

{"ver":10,"cmd":0,"seq":7,"opcode":17,
    "payload":{"phone":"+79999999999","type":"START_AUTH","language":"ru"}

Шаг 3: Мега пердолинг

Зная принцип распаковки маленьких пейлоадов, перейдем к большим. Для упаковки больших пейлоадов используется сжатие через lz4. Таким образом допишем нашу функцию до нужного вида.

import lz4.block
import msgpack

def unpack_packet(data: bytes):
    ver = int.from_bytes(data[0:1], 'big')
    cmd = int.from_bytes(data[1:3], 'big')
    seq = int.from_bytes(data[3:4], 'big')
    opcode = int.from_bytes(data[4:6], 'big')
    packed_len = int.from_bytes(data[6:10], 'big', signed=False)
    comp_flag = packed_len >> 24
    payload_length = packed_len & 0xFFFFFF
    payload_bytes = data[10:10 + payload_length]
    if comp_flag != 0:
        compressed_data = payload_bytes
        try:
            payload_bytes = lz4.block.decompress(compressed_data, uncompressed_size=255)
        except lz4.block.LZ4BlockError:
            return None
    payload = msgpack.unpackb(payload_bytes, raw=False)
    return {
        "ver": ver,
        "cmd": cmd,
        "seq": seq,
        "opcode": opcode,
        "payload": payload
    }

Заключение

Текст писал Дмитрий Уткин, авторы библиотек, ссылайтесь пожалуйста на материал. Спасибо.

About

Объяснение принципа работы мобильного протокола Max(api.oneme.ru)

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published