Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #48, НОЯБРЬ 2004 г.

Извращения с тетей Асей

Роман Куберов 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-пакет.

Назад на стр. 048-050-1  Содержание  Вперед на стр. 048-050-3