INATTACK.RU :: Архив документации для хакера Оглавление Далее>>ICQ - коммуникационная программа для передачи сообщений посредством сети интернет. В основе её работы положен метод сохранения всех сообщений, посылаемых пользователями, на сервере до тех пор, пока адресат не подключится к интернет. Название ICQ созвучно английскому "I seek you" - "Я тебя ищу". Эта программа была создана в 1999 году малоизвестной израильской фирмой Mirabilis. И на данный момент число ее пользователей исчисляется несколькими десятками миллионов. Популярность программе принесло удобство использования и бесплатность предоставляемых услуг. ICQ может:
ICQ часто называют аналогом пейджера в интернете. Для обеспечения мобильности пользователей ICQ присваивает им номера, независимые от их текущего положения в сети (IP-адреса) называемые UIN (Universal Internet Number) . Но при передаче данных (сообщений, файлов и т.д.) программе приходится получать текущий IP-адрес пользователя с другой стороны, т.к. без него прямая передача по TCP/IP невозможна. Для преобразования пользовательских номеров в IP-адреса используются специальные серверы в Internet. Эти серверы специально предназначены для обслуживания пользователей ICQ и поддерживаются Mirabilis. В момент получения доступа к Internet ICQ соединяется с одним из таких серверов и регистрируется на нем, передавая имя и пароль. Сервер запоминает текущий IP-адрес этого пользователя. Пока пользователь на линии, сервер может обрабатывать запросы других ICQ на преобразование номера пользователя в его текущий IP-адрес. Эти запросы и ответы передаются по протоколу UDP (подобно запросам и ответам DNS). Этот же сервер может служить и источником информации "доступен ли данный пользователь online". Получив IP-адрес другой стороны, ICQ может соединиться с клиентом ICQ на другой стороне и передавать данные напрямую. Короткие сообщения ICQ может передавать по UDP. Это более быстрый и легковесный протокол чем TCP, так как не ориентирован на соединение, а посылает данные отдельными пакетами. Но UDP ненадежный, поэтому используются подтверждения доставки. ICQ делает до 6 попыток отправить сообщение по UDP. И если ни на одну из них подтверждение не пришло, ICQ выводит вам сообщение, что не пожет передать сообщение напрямую, предлагая передать через сервер Mirabilis (он, в отличие от пользователей, реже бывает недоступен). Когда получатель сообщения очередной раз подключится для регистрации, это сообщение будет ему переправлено. Если возможно, ICQ пытается установить между переговаривающимися сторонами прямое TCP-соединение. В результате следующие сообщения могут идти по уже установленному TCP-соединению, что более надежно, чем UDP, и достаточно быстро. Пользователь может создать "список контактов" + список других пользователей ICQ. Когда какой-либо пользователь из этого списка находясь в интернете запускает клиента ICQ и регистрируется на сервере + то уведомление об этом могут получать все в чьих "списках контактов" находится обладатель данного UIN. Каждый пользователь может указать свой "статус" свидетельствующий о желании пользователя принимать какие-либо сообщения. В последних версиях статус может принимать значение "доступен" (Available/Connect), "отлучился" (Away), "только срочные сообщения" (Do not distrub) и другие. Пользователь может свободно менять свой статус, о чем информируется каждый зарегистрированный на сервере клиент, в чьем списке контактов находится сменивший статус пользователь. За время существования ICQ, используемый ею протокол претерпел множество изменений и имел различные версии, каждая следующая из которых отличалась от предыдущей. Эта версия устарела. На данный момент она не используется и не поддерживается. Версия 2 является самой древней версией, которая до сих пор используется Mirabilis-ом.(Например, клиентом Java версии ICQ). Рассмотрим работу протокола этой версии более подробно. Несмотря на то, что эта версия уже практически не используется, основные принципы работы и используемые структуры остались неизменны. Соединение с другим клиентом, находящимся в данный момент в Internet (on-line) осуществляется посредством протокола TCP с установкой прямого соединения между переговаривающимися сторонами. Все другие соединения осуществляются с использованием пакетов протокола UDP посылаемых через ICQ сервер. Получение каждого UDP пакета должно быть подтверждено сервером. В случае неполучения клиентом подтверждения от сервера в течении 10 секунд, клиент повторно посылает пакет. После таких 6 неудачных посылок клиент посылает на сервер сообщение B_MESSAGE_ASK, получив которое сервер должен немедленно ответить. Процедура повторяется 2 раза. Если ни на один из посланных пакетов не было получено подтверждение, ICQ клиент предполагает, что пользователь отключился от Internet (off-line). Перед тем как начать устанавливать какие-либо соединения, клиент должен зарегистрироваться на одном из ICQ- серверов(log-in). Во время процедуры регистрации клиент посылает серверу информацию о себе такую как IP адрес, TCP порт зарезервированный для ICQ, пароль пользователя и список других пользователей ICQ находящихся в "списке контактов" клиента. Клиент должен периодически посылать на сервер сообщение "KEEP_ALIVE" свидетельствующее о том, что клиент все еще подключен к Сети. По умолчанию клиент посылает UDP пакеты на сервер используя порт 4000. Функции "послать сообщение пользователю неподключенному к Internet (off-line) ", "получение информации о пользователе", "поиск пользователя", "изменение информации текущего пользователя" реализуются через пакеты протокола UDP, посылаемых на сервер. В поле "DATA" UDP пакета размещается информация о UIN отправителя, код, идентифицирующий запрошенную функцию и необязательные параметры. Когда пользователь посылает сообщение другому пользователю, который подключен (зарегистрирован на сервере), ICQ клиент пытается установить TCP соединение с этим пользователем, используя аналогичную (за небольшим исключением) структуру поля DATA TCP пакета. После посылки сообщения соединение не разрывается и может быть использовано для посылки следующих сообщений. Соединение закрывается, когда один из пользователей отсоединяется(log-off) или же теряет соединение с сервером. Коммуникации между сервером и клиентом Как уже было сказано ранее, для осуществления такого рода коммуникаций ICQ использует протокол UDP. Поле данных пакета UDP при посылке от клиента к серверу заполняется следующим образом: Длина Значение Название Описание 2 байта 02 00 VERSION Версия протокола ICQ 0 или больше параметров. Зависит от поля COMMAND Здесь и далее "байт " представляет собой последовательность из 8-и битов, старший бит ниходится слева, младший байт идет первым. Поле данных пакета UDP при посылке от сервера клиенту заполняется следующим образом: Длина Значение Описание 2 байта 02 00 VERSION Версия протокола ICQ 2 байта хх хх COMMAND Код выполненной функции 2 байта хх хх SEQ_NUM Порядковый номер Переменная хх хх 0 или больше параметров. Зависит от поля COMMAND Поле VERSION присутствует во всех пакетах и является идентификатором того что это пакет ICQ . Поле SEQ_NUM содержит порядковый номер пакета. Все пакеты должны иметь уникальный порядковый номер за исключением случая перепосылки пакета. Это поле используется для отслеживания потери или дублирования пакетов. Обыкновенно с каждым пакетом SEQ_NUM увеличивается на 1. Сервер и клиент ведут непересекающуюся нумерацию пакетов. Т.е. порядковый номер пакета от сервера никак не связан с порядковыми номерами пакетов от клиента. Сервер начинает отсчет с 00 00. Клиент же начинает отсчет с 01 00. Это поле имеет немного другую интерпретацию в случае команды ACK (см. ниже). Поле СOMMAND при посылке сообщения от клиента серверу может принимать следующие значения: Значение Наименование Описание 0A 00 ACK Подтверждение 0E 01 SEND_MESSAGE Послать сообщение через сервер (если, например адресат не
зарегистрировался на сервере) E8 03 LOGIN Зарегистрироваться на сервере. 06 04 CONTACT_LIST Передать серверу "список контактов" 1A 04 SEARCH_UIN Искать пользователя по UIN 24 04 SEARCH_USER Искать пользователя по имени или электронному адресу. 2E 04 KEEP_ALIVE Посылается для подтверждения того что пользователь не отключился от
Сети. 38 04 SEND_TEXT_CODE Послать специальное сообщение на сервер в виде текста. 60 04 INFO_REQ Запрос основной информации о пользователе. 6A 04 EXT_INFO_REQ Запрос расширенной информации о пользователе. 9C 04 STATUS_CHANGE Пользователь изменил свой статус. 28 05 LOGIN_2 Посылается во время регистрации на сервере. 0A 05 UPDATE_INFO Обновить основную информацию о пользователе. B0 04 UPDATE_EXT_INFO Обновить расширенную информацию о пользователе. 3C 05 ADD_TO_LIST Пользователь добавляется в "список контактов" 56 04 REQ_ADD_TO_LIST Запрос разрешения у пользователя о добавлении его в "список
контактов" BA 04 QUERY_SERVERS Запросить у сервера адреса других серверов. C4 04 QUERY_ADDONS Запросить у сервера информацию о программных расширениях. EC 04 NEW_USER_1 Запрос разрешения на добавление пользователя в список контактов
(?) FC 03 NEW_USER_REG Зарегистрировать нового пользователя. A6 04 NEW_USER_INFO Посылается основная информация о новом пользователе. 56 04 MSG_TO_NEW_USER Послать сообщение пользователю, отсутствующему в списке контактов.
Используется для отправки текста сопровождающего запрос на добавление в
список контактов. Поле СOMMAND при посылке сообщения от сервера клиенту может принимать следующие значения: Значение Наименование Описание 0A 00 ACK Подтверждение 5A 00 LOGIN_REPLY Ответ при регистрации на сервере 6E 00 USER_ONLINE Пользователь из списка контактов зарегистрировался на сервере или
сменил свой статус на "на линии". 78 00 USER_OFFLINE Пользователь из списка контактов отключился от сервера или сменил свой
статус на "отключен" 8C 00 USER_FOUND Ответ на запрос о поиске. Найдена запись о пользователе отвечающем
заданным параметрам. DC 00 RECEIVE_MESSAGE Послано сообщение через сервер. A0 00 END_OF_SEARCH Ответ на запрос о поиске. Больше пользователей удовлетворяющих заданным
параметрам не найдено. 18 01 INFO_REPLY Основная информация о пользователе. 22 01 EXT_INFO_REPLY Расширенная информация о пользователе. A4 01 STATUS_UPDATE Пользователь из списка контактов сменил свой статус. 1C 02 REPLY_X1 Используется во время регистрации на сервере. E0 01 UPDATE_REPLY Подтверждение обновления основной информации. C8 00 UPDATE_EXT_REPLY Подтверждение обновления расширенной информации. 46 00 NEW_USER_UIN Подтверждение о регистрации нового пользователя и новый UIN B4 00 NEW_USER _REPLY Подтверждение приема пакета с основной информацией о новом
пользователе. 82 00 QUERY_REPLY Ответ на запросы QUERY_SERVERS и QUERY_ADDONS Рассмотрим подробнее некоторые команды ACK (0A 00) Подтверждение. Параметры: Нет В отличие от остальных команд, поле SEQNUM содержит порядковый номер сообщения прием которого подтверждается. Прием этого пакета не должен быть подтвержден. SEND_MESSAGE (0E 01) Послать сообщение через сервер. Параметры Длина Значение Имя Описание 4 байта xx xx xx xx RECEIVER_UIN UIN адресата сообщение 2 байта (см. ниже) MESSAGE_TYPE Тип сообщения 2 байта xx xx LENGTH Длина сообщения включая завершающий строку NULL Переменная MESSAGE ASCIIZ строка сообщения Сообщение может быть следующих типов: 01 00 + нормальное текстовое сообщение 04 00 + сообщение является Интернет-адресом. В таком случае оно состоит из описания и самого URL разделенных символом 0xFE LOGIN (E8 03) Зарегистрироваться на сервере. Длина Значение Имя Описание 4 байта хх хх хх хх PORT Порт TCP который следует использовать при установлении
соединения. 2 байта хх хх LENGTH Длина поля PASSWORD включая завершающий NULL Переменная PASSWORD ASCIIZ строка, содержащая пароль 4 байта 78 00 00 00 X1 Зарезервировано 4 байта хх хх хх хх USER_IP IP адрес пользователя 1 байт 04 X2 Зарезервировано 4 байта хх хх хх хх STATUS Статус пользователя. Обыкновенно 00 00 00 00 4 байта 02 00 00 00 X3 Зарезервировано 2 байта хх хх LOGIN_SEQ_NUM Порядковый номер попытки зарегистрироваться. 4 байта 00 00 00 00 X4 Зарезервировано 4 байта 08 00 78 00 X5 Зарезервировано В случае успешной регистрации сервер возвращает сообщение LOGIN_REPLY. CONTACT_LIST (06 04) Информировать сервер о списке контактов пользователя. Параметры: Длина Значение Имя Описание 2 байта хх хх NUM_CONTACTS Количество записей в списке контактов 4 байта NUM_CONTACT раз xx xx xx xx UIN UIN пользователя из списка контактов. Сервер будет посылать извещение о изменении статуса каждого пользователя из списка контактов. SEARCH_UIN (1A 04) Искать пользователя по UIN Параметры: Длина Значение Имя Описание 2 байта хх хх SEARCH_SEQ_NUM Порядковый номер запроса поиска. 4 байта хх хх хх хх SEARCH_UIN UIN для поиска SEARCH_SEQ_NUM должно быть уникальным числом для различения различных запросов поиска. SEARCH_USER (24 04) Искать пользователя по имени или электронному адресу Параметры: Длина Значение Имя Описание 2 байта хх хх SEARCH_SEQ_NUM Порядковый номер запроса поиска. 2 байта хх хх LENGTH Длина "прозвища". Включая завершающий NULL Переменная NICK_NAME Прозвище. ASCIIZ строка 2 байта хх хх LENGTH Длина Имени. Включая завершающий NULL Переменная FIRST_NAME Имя. ASCIIZ строка 2 байта хх хх LENGTH Длина фамилии. Включая завершающий NULL Переменная LAST_NAME Фамилия. ASCIIZ строка 2 байта хх хх LENGTH Длина электронного адреса. Включая завершающий NULL Переменная E_MAIL Электронный адрес. ASCIIZ строка Поля NICK_NAME, FIRST_NAME, LAST_NAME, E_MAIL могут содержать пустую строку, однако по крайней мере одно из этих полей должно быть заполнено. KEEP_ALIVE (2E 04) Подтверждение того, что клиент все еще на линии. Параметры: Нет Эта команда должна посылаться клиентом серверу каждые 120 секунд. INFO_REQ (60 04) Запрос основной информации о пользователе. Параметры: Длина Значение Имя Описание 2 байта хх хх INFO_SEQ_NUM Порядковый номер запроса 4 байта хх хх хх хх QUERY_UIN UIN запрашиваемого пользователя На этот запрос сервер отвечает сообщением INFO_REPLY (см. ниже) используя тот же самый INFO_SEQ_NUM EXT_INFO_REQ (6A 04) Запрос расширенной информации о пользователе. Параметры: Длина Значение Имя Описание 2 байта хх хх INFO_SEQ_NUM Порядковый номер запроса 4 байта хх хх хх хх QUERY_UIN UIN запрашиваемого пользователя На этот запрос сервер отвечает сообщением EXT_INFO_REPLY (см. ниже) используя тот же самый INFO_SEQ_NUM CHANGE_PASSWORD (9C 04) Сменить пароль пользователя. Параметры: Длина Значение Имя Описание 2 байта хх хх PASSWORD_SEQ_NUM Порядковый номер запроса на смену пароля 2 байта хх хх LENGTH Длина нового пароля, включая завершающий NULL Переменная NEW_PASSWORD Новый пароль. ASCIIZ строка STATUS_CHANGE (D8 04) Пользователь сменил свой статус Параметры: Длина Значение Имя Описание 4 байта хх хх 00 00 (см. ниже) STATUS Новый статус пользователя Возможные значения поля STATUS: 00 00 00 00 На линии (on_line/connected) 01 00 00 00 Ушел (Away) 11 00 00 00 Не беспокоить (Do Not Disturb -DND) 00 01 00 00 Невидим (Invisible) ACK (0A 00) Подтверждение. Параметры: Нет В отличие от остальных команд, поле SEQNUM содержит порядковый номер сообщения прием которого подтверждается. Прием этого пакета не должен быть подтвержден. LOGIN_REPLY (5A 00) Ответ при регистрации на ICQ - сервере. Параметры: Длина Значение Имя Описание 4 байта хх хх хх хх USER_UIN UIN пользователя 4 байта хх хх хх хх USER_IP IP пользователя 2 байта хх хх LOGIN_SEQ_NUM
4 байта 01 00 01 00 X1 неизвестно 4 байта xx 00 16 00 X2 Неизвестно 4 байта 8C 00 00 00 X3 Неизвестно 4 байта 78 00 05 00 X4 Неизвестно 6 байт 0A 00 05 00 01 00 X5 неизвестно Поле LOGIN_SEQ_NUM содержит значение одноименного поля соответствующего пакета с запросом на регистрацию (LOGIN). USER_FOUND (8C 00) Найден пользователь удовлетворяющий заданным критериям поиска. Параметры: Длина Значение Имя Описание 2 байта хх хх SEARCH_SEQ_NUM Порядковый номер запроса поиска. 4 байта хх хх хх хх FOUND_UIN UIN найденного пользователя 2 байта хх хх LENGTH Длина "прозвища". Включая завершающий NULL Переменная NICK_NAME Прозвище. ASCIIZ строка 2 байта хх хх LENGTH Длина имени. Включая завершающий NULL Переменная FIRST_NAME Имя. ASCIIZ строка 2 байта хх хх LENGTH Длина фамилии. Включая завершающий NULL Переменная LAST_NAME Фамилия. ASCIIZ строка 2 байта хх хх LENGTH Длина электронного адреса. Включая завершающий NULL Переменная E_MAIL Электронный адрес. ASCIIZ строка 1 байт хх AUTHORIZE Необходимость авторизации. Для каждого пользователя подходящего заданным критериям поиска будет создан такой пакет. Но не более 40 штук. По окончании создания пакетов содержащих сообщения USER_FOUND сервер посылает сообщение END_OF_SEARCH . Поле AUTHORIZE содержит байт со значением 00 или 01, что означает необходимость разрешения данного пользователя, для добавление его в чей-либо в список контактов, или отсутствие такой необходимости соответственно. RECEIVE_MESSAGE (DC 00) Сообщение пользователю, посланное через сервер. Параметры: Длина Значение Имя Описание 4 байта хх хх хх хх REMOTE_UIN UIN отправителя 2 байта хх хх YEAR Год посылки сообщения 1 байт хх MONTH Месяц посылки сообщения 1 байт хх DAY День посылки сообщения 1 байт хх HOUR Час посылки сообщения 1 байт хх MINUTE Минута посылки сообщения 2 байта хх хх TYPE Тип сообщения (см. ниже) 2 байта хх хх LENGTH Длина текста сообщения. Включая завершающий NULL переменная MESSAGE Текст сообщения. ASCIIZ строка. Поле TYPE может принимать следующие значения: 01 00 - нормальное сообщение 04 00 - сообщение является Интернет-адресом.(URL) В таком случае оно состоит из описания и самого URL разделенных символом 0xFE 0C 00 - сообщение о том, что пользователь был добавлен в список контактов. При этом поле MESSAGE имеет следующую структуру: <nick name> - Прозвище добавившего. FE - Разделитель + символ с кодом 0хFE <first name> - Имя добавившего. FE - Разделитель. <last name> - Фамилия добавившего. FE - Разделитель. <e-mail> - Электронный адрес добавившего. FE - Разделитель <authorize> - Символ "1" или "0" в зависимости от необходимости автоизации для добавления пользователя в список контактов. "1" + если такая авторизация не требуется. END_OF_SEARCH (A0 00) - Окончание создание пакетов с сообщением USER_FOUND Параметры: Длина Значение Имя Описание 2 байта хх хх SEARCH_SEQ_NUM Порядковый номер запроса на поиск 1 байт хх MORE_FOUND Найдено ли большее количество пользователей? Если критериям поиска удовлетворяет более 40 пользователей, то будет сгенерированы пакеты USER_FOUND только для первых 40. И поле MORE_FOUND завершающего сообщения END_OF_SEARCH будет содержать значение 01. В противном случае это поле будет содержать 00. INFO_REPLY (18 01) Основная информация о пользователе Параметры: Длина Значение Имя Описание 2 байта хх хх INFO_SEQ_NUM Порядковый номер запроса. 4 байта хх хх хх хх REMOTE_UIN UIN пользователя 2 байта хх хх LENGTH Длина "прозвища". Включая завершающий NULL Переменная NICK_NAME Прозвище. ASCIIZ строка 2 байта хх хх LENGTH Длина имени. Включая завершающий NULL Переменная FIRST_NAME Имя. ASCIIZ строка 2 байта хх хх LENGTH Длина фамилии. Включая завершающий NULL Переменная LAST_NAME Фамилия. ASCIIZ строка 2 байта хх хх LENGTH Длина электронного адреса. Включая завершающий NULL Переменная E_MAIL Электронный адрес. ASCIIZ строка 1 байт хх AUTHORIZE Необходимость авторизации. Значения параметров полностью совпадают с одноименными параметрами сообщения USER_FOUND. EXT_INFO_REPLY (22 01) Расширенная информация о пользователе. Параметры: Длина Значение Имя Описание 2 байта хх хх INFO_SEQ_NUM Порядковый номер запроса 4 байта хх хх хх хх REMOTE_UIN UIN пользователя 2 байта хх хх LENGTH Длина названия города. Включая завершающий NULL Переменная CITY Название города. ASCIIZ строка 2 байта хх хх COUNTRY_CODE Код страны 1 байт хх COUNTRY_STATUS Был ли введен код страны 2 байта хх хх LENGTH Длина названия штата. Включая завершающий NULL Переменная STATE Название штата (актуально только для CША) 2 байта хх хх AGE Возраст 1 байт хх SEX Пол 2 байта хх хх LENGTH Длина телефона. Включая завершающий NULL Переменная PHONE Телефон. ASCIIZ строка. 2 байта хх хх LENGTH Длина адреса домашней странички. Включая завершающий NULL перемення HOME_PAGE Домашняя страничка. ASCIIZ строка. 2 байта хх хх LENGTH Длина "текста о себе" пользователя. Переменная ABOUT "Текст о себе" ASCIIZ строка. Параметр COUNTRY_CODE представляет из себя международный телефонный префикс. Для США это значение 01 00 (т.е. 1) для России 07 00. Если пользователь указывал код своей страны, то поле COUNTRY_STATUS содержит значение 0хFE в противном случае поле COUNTRY_CODE содержит значение FF FF и COUNTRY_STATUS содержит байт 0х9С. Поле SEX может принимать следующие значения:
В поле ABOUT пользователь может написать любой текст. Обыкновенно, это информация о себе. STATUS_UPDATE (A4 01) Пользователь из списка контактов сменил свой статус. Параметры: Длина Значение Имя Описание 4 байта хх хх хх хх REMOTE_UIN UIN пользователя чей статус изменился 4 байта хх хх хх хх STATUS Новый статус пользователя. Поле STATUS может принимать такие же значения, как и в команде STATUS_CHANGE (D8 04). Далее>> |