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

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

Вольф Данияр

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


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

/*

Принимаем ответ с сервера в виде пакета FLAP SIGNON:

*/

if(

recv(sock, buffer, 2048, 0) == -1){perror("RECV"); close(sock);}

/*

Составляем ответ для сервера в виде пакета TOC SIGNON, для этого динамически выделяем память. При этом используем указатель buf. После этого отправляем пакет на сервер, используя функцию send. Надо отметить, что аргументы i и j фигурируют для определения размера поля VALID DATA.

*/

buf=(char *)malloc(256*sizeof(char ));

encode_flapsigon(buf, screenname);

i=0;

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

if(

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

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

free(buf);

/*

Далее следует аутентификация на сервере - формируем пакет toc_signon с помощью функции encode_toc_signon. В параметрах передаем указатель на адрес буфера, наш ICQ uin/AIM screename и пароль к нему:

*/

buf=(char )malloc(256*sizeof(char ));

encode_toc_signon(buf, screenname, password);

i=0;

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

if(

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

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

...

На этом участке кода мы немного схитрим для повышения производительности кода. В противном случае придется несколько раз использовать функцию send. Если внимательно посмотреть на него, можно заметить, что в одну строку buf мы формируем сразу несколько пакетов TOC, каждый раз смещая указатель на буфер. Это делается для экономии времени подключения к серверу, избавления от повторяющихся участков кода и, конечно же, для эстетики ;). Поехали.

encode_toc_add_permit, encode_toc_add_deny, encode_toc_set_config, encode_toc_add_buddy, encode_toc_set_config, encode_toc_init_done.

Интересно, что функцию encode_toc_init_don мы вызываем в конце - так требует стандарт. Конечно, можно разделить все и по частям.

*/

//toc_add_permit - устанавливаем список разрешенных пользователей

encode_toc_add_permit(buf);

i=0;

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

/*

toc_add_deny - устанавливаем список запрещенных пользователей

*/

encode_toc_add_deny(buf+i+6);

j=0;

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

i=i+j;

//toc_set_config

//Устанавливаем contact list

encode_toc_set_config(buf+i+12);

j=0;

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

i=i+j;

/*

toc_add_buddy - добавляем себя в contact list и организуем статус online

*/

encode_toc_add_buddy((buf+i+18), screenname);

j=0;

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

i=i+j;

//toc_set_config

encode_toc_set_config(buf+i+24);

j=0;

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

i=i+j;

//toc_init_done - подтверждаем, что пройдена процедура авторизации

encode_toc_init_done(buf+i+30);

j=0;

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

i=i+j;

if(

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

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

free(buf);

puts("Now you connect on the TOC server");

puts("Press ctrl+c you menu");

buf=(char )malloc(256*sizeof(char ));

mess=(char )malloc(128*sizeof(char ));

signal (SIGINT, onintr);

Уходим в главный цикл нашей программы, переводя программу в режим приема сообщений до тех пор, пока аргумент messa не станет равным "quit", после чего программа выйдет из цикла и завершится:

while(memcmp(messa, "quit", 4))

{

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

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