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 сама по себе почти никогда не использовалась клиентом до того момента, как она была заменена на 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 пакета шифруются по следующему алгоритму: Где 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 --- -----------------------------------------------
---------------- Табл. 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 не высчитывается, а берется из пакета. Следует отметить, что шифруются только данные, посылаемые клиентом серверу, или другому клиенту. В начале 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 --- -----------------------------------------------
---------------- Табл. 2. Перед помещением величины CHECKCODE в пакет ее биты "перемешиваются" по следующей таблице: 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 |