Обзор протоколов ICQ (1999г.). Часть вторая.
INATTACK.RU :: Архив документации для хакера

Оглавление
<<Начало
  • Заключение


      Коммуникации между двумя клиентами



      Когда пользователь пытается послать сообщение другому пользователю, клиентская программа сначала проверяет, установлено ли TCP соединение с удаленным пользователем. В случае наличия такого соединения, оно будет использовано для передачи сообщения. В противном случае с сервера запрашивается IP адрес и порт второго пользователя и предпринимается попытка установить TCP соединение. Обыкновенно порт берется в диапазоне 1200-1300 (десятичное). После установления соединения посылается сообщение CHANNEL_INIT. После этого каждый раз для посылки текстового сообщения создается пакет с сообщением CHANNEL_MESSAGE. Получение каждого пакета должно быть подтверждено сообщением CHANNEL_ACK.

      Взаимодействие с использованием протокола TCP также как и с использованием протокола UDP базируется на посылке независимых пакетов.



      CHANNEL_INIT Инициировать TCP соединение между двумя

      пользователями

      Параметры:

      Длина

      Значение

      Имя

      Описание

      2 байта

      1А 00

      LENGTH

      Суммарная длина следующих полей

      1 байт

      FF

      INIT_IDENT

      Идентификатор того, что это пакет CHANNEL_INIT

      2 байта

      02 00

      VERSION

      Идентификатор версии протокола

      6 байт

      00 00 00 00

      X1

      Зарезервировано

      4 байта

      хх хх хх хх

      MY_UIN

      UIN отправителя пакета.

      4 байта

      хх хх хх хх

      MY_IP

      IP отправителя пакета

      4 байта

      хх хх хх хх

      MY_IP_REAL

      Актуальный IP отправителя пакета

      1 байт

      04

      X2

      Зарезервировано

      4 байта

      хх хх хх хх

      MY_PORT

      TCP порт для ответных сообщений.

      MY_REAL_IP отличается от MY_IP тем что первое является "локальным" IP адресом, а второй "реальным" Эти два значения будут различаться только в том случае если клиент находится за файрволом.



      CHANNEL_MESSAGE послать текстовое сообщение непосредственно

      пользователю

      Параметры:

      Длина

      Значение

      Имя

      Описание

      2 байта

      xx xx

      LENGTH

      Суммарная длина следующих полей

      4 байта

      xx xx xx xx

      UIN

      UIN отправителя

      2 байта

      02 00

      VERSION

      Идентификатор версии протокола

      2 байта

      ЕЕ 07

      MSG_COMMAND

      Идентификатор того что этот пакет CHANNEL_MESSAGE

      2 байта

      00 00

      X1

      Зарезервировано

      4 байта

      xx xx xx xx

      UIN_2

      Дублирует поле UIN

      2 байта

      xx xx

      TYPE

      Тип сообщения

      2 байта

      xx xx

      LENGTH

      Длина текста сообщения. Включая завершающий NULL

      Переменная
       

      MESSAGE

      Текст сообщения. ASCIIZ строка.

      4 байта

      xx xx xx xx

      MY_IP_REAL

      Актуальный IP отправителя пакета

      4 байта

      xx xx xx xx

      MY_IP

      IP отправителя пакета

      4 байта

      xx xx xx xx

      PORT

      TCP порт для ответных сообщений.

      3 байта

      04 00 00

      X2

      Зарезервировано.

      2 байта

      xx xx

      CMD_TYPE

      Идентификатор того является ли этот текст просто сообщением или ответом.

      4 байта

      xx FF FF FF

      X3

      Зарезервировано.

      Поле TYPE принимает такие же значения как и в команде RECEIVE_MESSAGE

      Возможные значения поля CMD_TYPE:

      10 00 - это просто сообщение.

      00 00 - это сообщение является автоматически созданным ответом.

      "Автоматические ответы" создаются по получению каждого простого сообщения. Обыкновенно они содержат пустые сообщения. Их функция аналогична сообщениям ACK, используемым при взаимодействии с сервером.



      Версии 3 и 4

      Версия 3 сама по себе почти никогда не использовалась клиентом до того момента, как она была заменена на V4. Тем не менее, сервер все еще отвечает V3-пакетами V4-клиентам.


      Рассмотрим некоторые изменения в версии 4.

      В этой версии немного изменился формат данных в UDP пакете:


      Длина

      Значение

      Название

      Описание

      2 байта

      04 00

      VERSION

      Версия протокола ICQ

      4 байта

      хх хх 00 00

      RANDOM_ NUMBER

      Случайная величина.

      2 байта

      хх хх

      COMMAND

      Код запрашиваемой функции

      2 байта

      хх хх

      SEQ_NUM1

      Порядковый номер

      2 байта

      хх хх

      SEQ_NUM2

      Порядковый номер

      4 байта

      хх хх хх хх

      UIN

      UIN отправителя

      4 байта

      хх хх хх хх

      CHECKCODE

      Контрольная сумма.

      Переменная
       
       

      0 или больше параметров. Зависит от поля COMMAND



      Появились новые варианты статуса состояния пользователя, которые можно использовать в командах LOGIN, STATUS_CHANGE, STATUS_UPDATE:


      Значение

      Название

      Описание

      00 00 00 00

      STATUS_ONLINE

      Пользователь на линии

      01 00 00 00

      STATUS_AWAY

      Пользователь отлучился

      13 00 00 00

      STATUS_DND

      Не беспокоить

      00 01 00 00

      STATUS_INVISIBLE

      Пользователь в режиме "невидимости"

      10 00 00 00

      STATUS_OCCUPIED

      Занят

      04 00 00 00

      STATUS_NA

      Не доступен

      20 00 00 00

      STATUS_CHAT

      Не против чата



      Кроме того, все данные UDP пакета шифруются по следующему алгоритму:

    • Вычисляется контрольная сумма по следующему алгоритму:

      1. Формируется число N1= 0x B8 B4 B2 B6


          Где

          B8 + 8-oй байт данных (младший байт поля SEQ_NUM1)

          B6 + 6-oй байт данных (младший байт кода запрашиваемой функции)

          B4 + 4-oй байт данных (младший байт второго слова

          RANDOM_NUMBER)

          B2 + 2-oй байт данных (младший байт первого слова поля

          RANDOM_NUMBER)

          b) PL = длина данных пакета.

          R1 = Случайное число между 00 и PL + 4. Но не попадающее в диапазон [16,19] (смещения байтов контрольной суммы в пакете)

          R2 = Случайное число от 00 до 255 (0xFF).


          с) Формируется число N2

          X4=R1

          X3 = NOT (байт по смещению X4)

          X2 = R2

          X1 = NOT (байт по смещению X2 в таблице 1)

          N2 = 0x X4 X3 X2 X1


          В качестве таблицы используемой в формировании числа N2 разработчики взяли текст из документации к программе:


          POS   DATA                                               ASCII

          --- -----------------------------------------------   ----------------
          00 - 0A 5B 31 5D 20 59 6F 75 20 63 61 6E 20 6D 6F 64   .[1] You can mod
          10 - 69 66 79 20 74 68 65 20 73 6F 75 6E 64 73 20 49   ify the sounds I
          20 - 43 51 20 6D 61 6B 65 73 2E 20 4A 75 73 74 20 73   CQ makes. Just s
          30 - 65 6C 65 63 74 20 22 53 6F 75 6E 64 73 22 20 66   elect "Sounds" f
          40 - 72 6F 6D 20 74 68 65 20 22 70 72 65 66 65 72 65   rom the "prefere
          50 - 6E 63 65 73 2F 6D 69 73 63 22 20 69 6E 20 49 43   nces/misc" in IC
          60 - 51 20 6F 72 20 66 72 6F 6D 20 74 68 65 20 22 53   Q or from the "S
          70 - 6F 75 6E 64 73 22 20 69 6E 20 74 68 65 20 63 6F   ounds" in the co
          80 - 6E 74 72 6F 6C 20 70 61 6E 65 6C 2E 20 43 72 65   ntrol panel. Cre
          90 - 64 69 74 3A 20 45 72 61 6E 0A 5B 32 5D 20 43 61   dit: Eran.[2] Ca
          A0 - 6E 27 74 20 72 65 6D 65 6D 62 65 72 20 77 68 61   n't remember wha
          B0 - 74 20 77 61 73 20 73 61 69 64 3F 20 20 44 6F 75   t was said? Dou
          C0 - 62 6C 65 2D 63 6C 69 63 6B 20 6F 6E 20 61 20 75   ble-click on a u
          D0 - 73 65 72 20 74 6F 20 67 65 74 20 61 20 64 69 61   ser to get a dia
          E0 - 6C 6F 67 20 6F 66 20 61 6C 6C 20 6D 65 73 73 61   log of all messa
          F0 - 67 65 73 20 73 65 6E 74 20 69 6E 63 6F 6D 69 6E   ges sent incomin
          -- -----------------------------------------------   ----------------

          Табл. 1


          Из N1 и N2 CHECKCODE вычисляется как N1 XOR N2.




          2) Затем вычисляются значения:

          PL = длина данных пакета.

          CODE1 = (DWORD) (PL * 0x66756B65)

          CODE2 = (DWORD) (CODE1 + CHECKCODE)

          N = (PL + 3) DIV 4

          POS = 0


          После этого в цикле:


          while POS < N do

          begin

          T = POS MOD 0x0100

          CODE3 = CODE2 + TABLE[T] (Байт T из таблицы Табл. 1)

          DATA = DWORD по смещению POS в данных пакета

          DATA = DATA XOR CODE3

          DWORD по смещению POS в данных пакета = DATA

          POS = POS + 4

          end


          3) первые 2 байта полученных данных заменяются на 04 00


          Процедура расшифровки полностью аналогична (благодаря обратимости операции XOR) за исключением того, что значение CHECKCODE не высчитывается, а берется из пакета.

          Следует отметить, что шифруются только данные, посылаемые клиентом серверу, или другому клиенту.


          Версия 5

          В начале 1998 года появилась следующая версия протокола. На данный момент она является последней модификацией протокола ICQ.

          Об этой версии протокола известно не так много.


          В этой версии также немного изменился формат данных в UDP пакете:


          Длина

          Значение

          Название

          Описание

          2 байта

          05 00

          VERSION

          Версия протокола ICQ

          4 байта

          00 00 00 00

          ZERO

          Зарезервировано

          4 байта

          хх хх хх хх

          UIN

          UIN отправителя

          4 байта

          хх хх хх хх

          SESSION_ID

          Случайная величина

          2 байта

          хх хх хх хх

          COMMAND

          Код запрашиваемой функции

          2 байта

          хх хх

          SEQ_NUM1

          Порядковый номер

          2 байта

          хх хх

          SEQ_NUM2

          Порядковый номер

          4 байта

          хх хх хх хх

          CHECKCODE

          Контрольная сумма.

          Переменная
           
           

          0 или больше параметров. Зависит от поля COMMAND




          Так же известно, что подверглись изменению алгоритмы генерации CHECKCODE и шифрования данных.


          Для генерирования CHECKCODE аналогично 4-ой версии протокола формируются 2 числа: N1 и N2 и затем производится операция XOR.

          Как и в 4-ой версии протокола, число N1 cоставляется из 8-ого, 4-ого, 2-ого и 6-ого байта данных пакета.


          PL = длина данных пакета.

          R1 = Случайное число между 00 и (PL - 18) - 1

          R2 = Случайное число от 00 до 255 (0xFF).


          X4 = R1

          X3 = NOT (BYTE по смещению X4 в данных пакета)

          X2 = R2

          X1 = NOT (BYTE по смещению X2 в таблице Табл. 2)

          Число N2 составляется из полученных таким образом байт.

          N2 = 0x X4 X3 X2 X1


          Следующая таблица, похоже, тоже является преобразованной частью какого-то текста. Однако выяснить это пока не удалось.


          POS   DATA                                           ASCII

          --- -----------------------------------------------   ----------------
          00 - 59 60 37 6B 65 62 46 48 53 61 4C 59 60 57 5B 3D   Y`7kebFHSaLY`W[=
          10 - 5E 34 6D 36 50 3F 6F 67 53 61 4C 59 40 47 63 39   ^4m6P?ogSaLY@Gc9
          20 - 50 5F 5F 3F 6F 47 43 69 48 33 31 64 35 5A 4A 42   P__?oGCiH31d5ZJB
          30 - 56 40 67 53 41 07 6C 49 58 3B 4D 46 68 43 69 48   V@gSA.lIX;MFhCiH
          40 - 33 31 44 65 62 46 48 53 41 07 6C 69 48 33 51 54   31DebFHSA.liH3QT
          50 - 5D 4E 6C 49 38 4B 55 4A 62 46 48 33 51 34 6D 36   ]NlI8KUJbFH3Q4m6
          60 - 50 5F 5F 5F 3F 6F 47 63 59 40 67 33 31 64 35 5A   P___?oGcY@g31d5Z
          70 - 6A 52 6E 3C 51 34 6D 36 50 5F 5F 3F 4F 37 4B 35   jRn<Q4m6P__?O7K5
          80 - 5A 4A 62 66 58 3B 4D 66 58 5B 5D 4E 6C 49 58 3B   ZJbfX;MfX[]NlIX;
          90 - 4D 66 58 3B 4D 46 48 53 61 4C 59 40 67 33 31 64   MfX;MFHSaLY@g31d
          A0 - 55 6A 32 3E 44 45 52 6E 3C 31 64 55 6A 52 4E 6C   Uj2>DERn<1dUjRNl
          B0 - 69 48 53 61 4C 39 30 6F 47 63 59 60 57 5B 3D 3E   iHSaL90oGcY`W[=>
          C0 - 64 35 3A 3A 5A 6A 52 4E 6C 69 48 53 61 6C 49 58   d5::ZjRNliHSalIX
          D0 - 3B 4D 46 68 63 39 50 5F 5F 3F 6F 67 53 41 25 41   ;MFhc9P__?ogSA%A
          E0 - 3C 51 54 3D 5E 54 5D 4E 4C 39 50 5F 5F 5F 3F 6F   <QT=^T]NL9P___?o
          F0 - 47 43 69 48 33 51 54 5D 6E 3C 31 64 35 5A 00 00   GCiH3QT]n<1d5Z..
          --- -----------------------------------------------   ----------------

          Табл. 2.


          Перед помещением величины CHECKCODE в пакет ее биты "перемешиваются" по следующей таблице:

          bit 31 -> bit 21
          bit 30 -> bit 20
          bit 29 -> bit 19
          bit 28 -> bit 18
          bit 27 -> bit 17
          bit 26 -> bit 11
          bit 25 -> bit 26
          bit 24 -> bit 25
          bit 23 -> bit 24
          bit 22 -> bit 23
          bit 21 -> bit 22
          bit 20 -> bit 05
          bit 19 -> bit 04
          bit 18 -> bit 03
          bit 17 -> bit 02
          bit 16 -> bit 01
          bit 15 -> bit 31
          bit 14 -> bit 30
          bit 13 -> bit 29
          bit 12 -> bit 28
          bit 11 -> bit 27
          bit 10 -> bit 00
          bit 09 -> bit 10
          bit 08 -> bit 09
          bit 07 -> bit 08
          bit 06 -> bit 07
          bit 05 -> bit 06
          bit 04 -> bit 16
          bit 03 -> bit 15
          bit 02 -> bit 14
          bit 01 -> bit 13
          bit 00 -> bit 12


          Табл. 3.


          При декодировании данных значение CHECKCODE должно быть восстановлено по этой же таблице в обратнюу сторону.

          Т.е. bit 31 <- bit 21; bit 30 <- bit 20 и т.д.


          2) Дале по алгоритму, аналогичному используемому в 4-ой версии протокола для шифрования и расшифровывания данных используется следующий алгоритм:


          PL = Длина данных

          CODE1 = (DWORD) (PL * 0x68656C6C) (flush the overflow)

          CODE2 = (DWORD) (CODE1 + CHECKCODE) (flush the overflow)

          N = (PL + 0x03)

          POS = 0x0A


          3) цикле делаем следующие преобразования:

          while POS < N do

          begin

          T = POS MOD 0x0100

          CODE3 = CODE2 + TABLE[T] (Байт в таблице по смещению T)

          DATA = DWORD по смещению POS в данных пакета

          DATA = DATA XOR CODE3

          DWORD по смещению POS в данных пакета = DATA

          POS = POS + 4

          End




          Заключение

          Несомненно, ICQ является заслуживающей внимание услугой предоставляемой Сетью. На данный момент организуются службы, позволяющие посылать сообщения пользователям ICQ с помощью обыкновенного телефона + используя ресурсы пейджинговых компаний. Это, как и бесплатность самой ICQ, делают последнюю еще более превлекательным для пользователей сети Интернет. Существует так же возможность создавать собственные локальные ICQ-сервера, которые позволяют общаться пользователям Интранет не завися от серверов Mirabilis.



          <<Начало

          Автор: Азаров Роман
          ICQ UIN: 24144078

          INATTACK.RU :: Архив документации для хакера