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

Забытый протокол от AOL

Вольф Данияр

Спецвыпуск: Хакер, номер #058, стр. 058-078-4


*/

static char *writes(char *buf, const char *data, int len)

{

memcpy(buf, data, len);

return buf+len;

}

/*

Сложная функция по сборке флэп-пакета. Видим, что функция использует простые функции, которые описаны выше:

*/

static char *flap_begin(char *buf, char frame)

{

static int seq = 0;

buf = writeb(buf, 0x2A);

buf = writeb(buf, frame);

buf = writew(buf, ++seq);

return buf+2;

}

/*

Функция, с помощью которой код вычисляет длину данных, идущих после FLAP (полезный груз), и записывает значение в поле Data Length:

*/

static char *flap_end(char *buf, char *start)

{

start -= 2;

writew(start, buf-start-2);

return buf;

}

......................................................

/*

Объявляем функции для сборки AIM-пакетов. Я привык писать код в старых традициях (oldschool), поэтому предпочитаю сначала объявить функции, а их описание - после главной программы (main).

*/

static char *encode_flapsigon(char *buf, const char *screenname);

static unsigned char *roast_password(const char *pass);

static char *encode_toc_signon(char *buf, const char *screenname, const char *password);

static unsigned char *encode_toc_init_done(char *buf);

static unsigned char *encode_toc_send_im(char *buf, const char *remscreenname, char *mess);

static unsigned char *encode_toc_add_permit(char *buf);

static unsigned char *encode_toc_add_deny(char *buf);

static unsigned char *encode_toc_set_config(char *buf);

static unsigned char *encode_toc_add_buddy(char *buf, const char *screenname);

...

/*

Функция, которая будет вызываться при прерывании с клавиатуры, например, когда мы пожелаем отправить сообщение сами.

*/

void onintr(sig){

/*

UIN, на который отправим сообщение. Надо заметить, что UIN и screenname для AIM одно и то же.

*/

char remscreenname[16];

.....................................................

/*

Функция для формирования исходящего пакета с текстом, в функцию передаются два аргумента uin и текстовое сообщение. Затем пакет, сформированный тривиальным образом, отправляем на сервер TOC/AIM.

*/

encode_toc_send_im(buf, remscreenname, messa);

i=0;

i=ntohs(*((u_int16_t *)(buf+4)));

if(

send(sock, buf, i+6, 0) == -1

){perror("Send"); close(sock);}

fprintf(stdout,"%s <-- %s\n", remscreenname, messa);

/*

Дамп сформированного исходящего сообщения. Состоит из заголовка FLAP 6 байт, команды toc_send_im, UIN'а и самого текстового сообщения.

*/

...

}//Закрываем тело функции прерывания с клавиатуры.

int main(int argc, char *argv[])

{

......................................................

//Производим подключение к AIM-сервису

if((sock=socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("Socket");}

tochost.sin_family=AF_INET;

tochost.sin_port=htons(TOC_PORT);

tochost.sin_addr=*(struct in_addr *)he->h_addr;

bzero(&(tochost.sin_zero), 8);

fprintf(stdout, "Connecting TOС server \n");

if(

connect(sock, (struct sockaddr *)&tochost, sizeof(struct sockaddr))

== -1

){perror("Connect");}

/*

Посылаем первую команду на AIM-сервер, дабы рассказать ему о готовности к работе с ним:

*/

if(

send(sock, FLAPON, sizeof(FLAPON), 0) == -1

Назад на стр. 058-078-3  Содержание  Вперед на стр. 058-078-5