Забытый протокол от AOL Вольф Данияр Спецвыпуск: Хакер, номер #058, стр. 058-078-2 Если взять в руки сетевой снифер и поснифить тот же плагин для Miranda (aim.dll), мы увидим содержимое рис. 1. Здесь FLAP SIGNON – пакет, который состоит из флэп-заголовка и груза в четыре байта со значением 00 00 00 01 (сделано именно так, чтобы клиент начал проходить авторизацию на сервисе AIM). Теперь нужно понять, как мы сформируем пакет TOC(AIM) и как передадим его на сервер. Для этого выделяют необходимое количество байт в памяти, указывают на него указатель, buf, и начинают заталкивать в него данные, которые отсылаются на сервер AIM. В основном это FLAP-заголовок и полезный груз. Затем мы выделим место в памяти для данных buffer, которые будут приходить с сервера. Туда уже поместили, и в зависимости от типа FLAP-заголовка код должен производить те или иные манипуляции. Объявим несколько несложных функций, которые сформируют ТОС(AIM)-пакет. С сервера пришел пакет FLAP SIGNON, теперь серверу нужно ответить тем же FLAP SIGNON, но наш FLAP SIGNON содержит значение AIM Screenname или ICQ uin (врезка "Фрагмент 4"). Пакет формируется с помощью функции encode_flapsigon, следом посылается пакет toc_signon, сформированный с помощью функции encode_toc_signon, в которую передаются указатель на буфер buf, AIM Screenname или ICQ uin и пароль. Если поснифить пакеты, получится нечто похожее на рис. 2. Пароль в функции encode_toc_signon криптуется с помощью функции roast_password методом XOR'рирования пароля и строки "Tic/Toc". В буфер buf записывают команду toc_signon; адрес и порт сервера, на котором TOC-сервис должен авторизовать нас; локал-клиента english; название клиента. Замаскируем его под Miranda, не забывая записывать в конец пакета нулевой символ. Если авторизация прошла гладко, то сервер ответит пакетом SIGN_ON:TOC1.0 (версия протокола). После этого в течение 30-ти секунд на сервер нужно послать команду toc_init_done (см. функцию encode_toc_init_done). Но мы пойдем другим путем :). Если просто отправить команду toc_init_done, произойдет обычное подключение к серверу и установится статус ivisible: отправлять и получать сообщения получится, но статус будет не online. Напишем четыре функции encode_toc_add_permit, encode_toc_add_deny, encode_toc_set_config, encode_toc_add_buddy. С помощью этих функций в буфере buf соберем пакет aimма, который запросит для нас contact list и добавит нас в свой же контакт, тем самым переведя в режим online. Функция encode_toc_add_permit создаст запрос на сервер пользователей, которые разрешены в нашем contact list. Функция encode_toc_add_deny делает все наоборот (ban). Функция encode_toc_set_config с помощью запроса toc_set_config вызовет с сервера AIM наш contact list, encode_toc_add_buddy добавляет себя в свой же contact list, чтобы попасть в статус online. И, как я уже писал, мы обязаны отправить пакет, сформированный функцией toc_init_done ("Фрагмент 5"). Поснифим, чтобы увидеть полную картину происходящего, как на рис. 3. Функциями encode_toc_add_permit и encode_toc_add_deny запрашиваются пустые access-листы, функцией toc_set_config - contact list. Чтобы получить статус online, вызываем функцию encode_toc_add_buddy. |