Извращения с тетей Асей Роман Куберов aka q_ber Спецвыпуск: Хакер, номер #048, стр. 048-050-2 SNAC(04,08) CLI_ICBM_SENDxWARNING SNAC FORMAT 00 04 word SNAC family (т.н. мажор) 00 08 word SNAC subtype (минор) … xx xx xx xx dword SNAC request-id, может быть случайным числом xx xx word "send as" flag: 1-anonymous, 0-non-anonymous xx byte screenname string length (длина уина) xx .. string screenname string (сам уин) Теперь в телеграфном стиле рассмотрим несколько вспомогательных функций, которые нам понадобятся для формирования OSCAR-пакета (в данном примере мы рассмотрим только процесс создания warn-пакета, по аналогии достаточно просто сформировать и другие OSCAR-пакеты). Список функций будет иметь вид «объяснение: функция». В Internet’е существует большое количество достаточно полных описаний протокола ICQ. Вот одно из них: www.icqinfo.ru/protocol_v8.shtml 1. Функция для помещения в буфер данных в один байт или 8 бит: #define writeb(buf, value)(*(buf) = (value), (buf++)) 2. Функция для помещения в буфер данных в два байта или 16 бит. Не забываем, что существует сетевой порядок следования байт, поэтому здесь мы применяем функцию htons для двухбайтовых значений: static char *writew(char *buf, u_int16_t value) { *((u_int16_t *) buf)++ = htons(value); return buf; } 3. Функция для помещения в буфер данных в 4 байта или 32 бит. Здесь происходит аналогичный процесс что и для функции выше, но мы применяем функцию htonl для 4х байтных значений: static char *writel(char *buf, u_int32_t value) { *((u_int32_t *)buff)++ = htonl(value); return buf; } 4. Функция для помещения в буфер значений произвольной длинны, например текст сообщений, UIN, ПАРОЛЬ и т.д: static char *writes(char *buf, const char *data, int len) { memcpy(buf, data, len); return buf+len; } FLAP-пакет имеет заголовок с фиксированной длиной, равной 6-ти байтам и следующий за ним блок данных (переменной длины). ‘\x2A’ - (Command Start) позволяет сервису отличать пакет ICQ от других пакетов (начало пакета ICQ). На схеме мы видим: Channel ID – идентификатор канала. Sequence number – может быть случайным числом. Data – собственно данные, которые мы передаем в пакете. На сервисе ICQ есть понятие канала (channel). Всего их 5 штук и в зависимости от того, какой канал в указан пакете ICQ, он передается на обработку соответствующим службам (функциям). Канал в пакете ICQ всегда указывается вторым байтом во FLAP-пакете. chanel 1 - служит для начальных целей, таких как установление связи (авторизация). chanel 2 - служит для передачи основных пакетов, передачи данных, в том числе и сообщений. chanel 3 - канал обработок ошибок chanel 4 - канал разъединения chanel 5 - служебный канал, возможно он используется администраторами Ниже приведена пара функций, которые мы будем использовать для открытия и закрытия FLAP’а. static char *flap_begin(char *buf, char chanel) { static int seq = 0; buf = writeb(buf, 0x2A); buf = writeb(buf, chanel); buf = writew(buf, ++seq); return buf+2; } static char *flap_end(char *buf, char *start) { start -=2; writew(start, buf-start-2); return buf; } Заметь, мы уже используем функции, которые предопределили выше и теперь настало время нашей главной функции, в которой и формируется warn-пакет. |