РЕЖИМ ЦВЕТОЧЕК
                                
                                ЧАСТЬ 1
                       Авторизация на сервисе ICQ

                                   _
                                 _/ \_
                                / \ / \
                                >--o--<
                                \_/ \_/
                                  \I/C D A PROJECT

                        best regars from payhash

Эта статья не дает полное описание протокола ICQ Oskar v7/8 а лишь ознакомит
читателя с основными принципами работы протокола. Я постараюсь коротко описать
работу протокола и не буду многословен.
Какой информацией нам нужно владеть, чтобы рассматривать данный протокол?
Известно, что существует сервер login.icq.com с работающим сервисом ICQ на 
порту 5190 по протоколу TCP. Понятно, что начиная с 7 протокола, Oskar работает
в режиме TCP, а протоколы ниже 7 работают в режиме UDP
Давайте пошагово рассмотрим следующую схему работы протокола:

Шаг 1. 
ICQ клиент проходит авторизацию на сервисе ICQ. Должен заметить что авторизация 
на сервисе ICQ проходит через ряд сложных процедур.


   |----------|                           |---------------|
   |          |                           |               |
   | CLIENT   |          OSKAR 7/8        | login.icq.com | 
   |          | LP ----------------->5190 |               | 
   |ICQ2003a  |                           |  ICQ SERVICE  |
   |          |                           |               |
   |----------|                           |---------------|
 
Первое что происходит, это подключение с сервером login.icq.com на порт 5190.
После чего сервер login.icq.com посылает тестовый FLAP пакет. Вот как выглядит
дамп пакета:
2A 01 7E BF 00 04 00 00 00 01

Еще что нужно знать! На сервисе ICQ есть понятие канала (chanel) каналов всего 4(5)
Как вы думаете это не те каналы которые есть в IRC? ;)

chanel 1 - служит для начальных целей таких как установление связи(авторизация)
chanel 2 - служит для передачи основных пакетов, передачи данных в том числе и 
сообщений
chanel 3 - канал обработок ошибок
chanel 4 - канал разъединения
(chanel 5 - служебный канал, возможно им пользуются администраторы)

В зависимости от того какой канал в пакете ICQ указан он передаеться на обработку
соответствующих служб (функций)
Канал в пакете ICQ всегда указывается вторым байтом во FLAP пакете, ниже я покажу,
как выглядит пакет ICQ. 
   
 
Этот пакет говорит клиенту ICQ, что пора отправлять данные с UIN и паролем
Первое что делает клиент это отсылка на сервер login.icq.com ряд параметров,
 в которые входят UIN и пароль пользователя ICQ службы. А так же ряд параметров 
связанные с клиентской частью программы ICQ.
Вот дамп пакета login:

дамп #1

2A 01 11 53 00 83 00 00 00 01 00 01 00 06 3X 3X
3X 3X 3X 3X 00 02 00 08 XX XX XX XX XX XX XX XX
00 03 00 33 49 43 51 20 49 6E 63 2E 20 2D 20 50
72 6F 64 75 63 74 20 6F 66 20 49 43 51 20 28 54
4D 29 2E 32 30 30 33 61 2E 35 2E 34 37 2E 31 2E
33 38 30 30 2E 38 35 00 16 00 02 01 0A 00 17 00
02 00 05 00 18 00 02 00 2F 00 19 00 02 00 01 00
1A 00 02 0E D8 00 14 00 04 00 00 00 55 00 0F 00
02 65 6E 00 0E 00 02 75 73

Разбираем этот пакет более детально
Запомним что пакеты ICQ называются FALP (обязательно вторым байтом является 
канал ICQ сервера). FLAP в свою очередь содержит так называемые SNAC пакеты 
в которые входят различные TLV пакеты. Передачи и прием SNAC пакетов - заключает 
в себе протокол ICQ.


    |-----------------------------|
    | F L A P                     | 
    |                             |
    |                             |
    | |-------------------------| |
    | |  S N A C                | |        
    | |                         | |
    | |     |----------------|  | |                
    | |     |                |  | |                 
    | |     |     T L V      |  | |
    | |     |                |  | |
    | |     |----------------|  | |
    | |-------------------------| |
    |                             |
    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 
    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
     
    | |-------------------------| |
    | |  S N A C                | |        
    | |                         | |
    | |     |----------------|  | |                
    | |     |                |  | |                 
    | |     |     T L V      |  | |
    | |     |                |  | |
    | |     |----------------|  | |
    | |-------------------------| |
    |                             | 
    |-----------------------------| 


 


FALP: 2A 01 11 53 00 83 00 00 00 01
Позволяет различать сервису ICQ данные ICQ от других пакетов.
2A - (Command Start) позволяет различать сервису ICQ пакет ICQ от других 
пакетов (начало пакета ICQ).  
01 - это канал, как было сказано уже выше.
11 - это так называемый Sequence Number может быть случайным числом
00 83 - Data Field Length длинна блока данных, который следует после FLAP
пакета, очень важное поле.

И так обобщив все можно вывести таблицу:
    -------------------
    | Command Start   | 
    | byte: '\x2A'    | 
    ------------------- 
    | Channel ID      |
    | byte            |
    -------------------
    | Sequence Number |
    | word            |
    -------------------
    |Data Field Length|
    |word             |
    -------------------
    |Data             |
    |variable         |
    -------------------

FLAP-пакет имеет заголовок с фиксированной длиной и, следующий за ним блок 
данных (переменной длины). Длина заголовка равна 6-и байтам.
 
Далее идет стандарт TLV. 
TLV 01: 00 01 говорит сервису, что идут данные с UIN, перед самим uin идет 
размер uin 00 06 после чего сам uin 39 36 33 36 33 32
Далее идут не обязательные параметры.
Версия профиль клиента

TLV 03: 00 03 
49 43 51 20 49 6E 63 2E 20 2D 20 50 72 6F 64 75 63 74 20 6F 66 20 49 43 51 
20 28 54 4D 29 2E 32 30 30 33 61 2E 35 2E 34 37 2E 31 2E 33 38 30 30 2E 38 35

Например: 3ICQ Inc. - Product of ICQ (TM).2003a.5.47.1.3800.85

TLV 16: 00 16 
обычно это два байта 01 0A

TLV 17: 00 17
версия приоритетности major клиентов, например:
 4 для icq2000, 5 для icq2001, icq2003

TLV 18: 00 18
версия приоритетности minor.

TLV 19: 00 19
наименьшая версия клиента в нашем случае это два байта 00 01

TLV 1A: 00 1A
версия клиента при его сборке (build version) занимает два байта 0E D8


TLV 14: 00 14 dunno версия занимает 4 байта 00 00 00 55

TLV 0F: 00 0F язык с которым работает клиент занимает два символа обычно это "en"

TLV 0E: 00 0E страна, в которой находиться клиент тоже занимает два символа,
обычно это "us" 

На этом пакет login заканчивается. Важно запомнить! после TLV всегда стоит размер 
содержимого TLV. Давайте еще подробнее рассмотрим SNAC пакет, который как мы уже 
знаем содержится внутри FLAP пакета:

    | |-------------------------| |
    | |  S N A C                | |        
    | |                         | |
    | |     |----------------|  | |                
    | |     |                |  | |                 
    | |     |     T L V      |  | |
    | |     |                |  | |
    | |     |----------------|  | |
    | |-------------------------| |
    |                             | 
    |-----------------------------|       

Пакет SNAC как видно из дампа #1 содержит следующие поля данных:

1)Версию TLV
2)Размер содержимого TLV
3)и содержимое TLV

      |-------------------------| 
      | WORD TLV version        |         
      |                         |
      | WORD TLV length         | 
      |                         | 
      | VAR TLV data            |                 
      |                         |       
      |-------------------------|

Вот так должна быть устроена структура login:
TLV(1) STRING my uin
TLV(2) STRING encrypted password
TLV(3) STRING client profile, example "3ICQ Inc. - Product of ICQ (TM).2003a.5.47.1.3800.85"
TLV(16) WORD unk, usually 01 0A
TLV(17) WORD major version, 4 for icq2000, 5 for icq2001
TLV(18) WORD minor version
TLV(19) WORD lesser version
TLV(1A) WORD build version
TLV(14) DWORD dunno version
TLV(0F) STRING language, 2 chars, usually "en"
TLV(0E) STRING country, 2 chars, usually "us" 


Допустим, что клиенту все таки удалось правильно сформировать пакет login и отправить его
 на сервер login.icq.com, что же произойдет тогда?
Если все в порядке то login.icq.com должен ответить следующим FLAP пакетом, 
в него входят SNAC: UIN, IPserver:PORT, 
COOKIE (256 байт случайных данных).
Рассмотрим дамп этого пакета:

дамп #2

2A 04 C6 B5 01 21 00 01 00 06 3X 3X 3X 3X 3X 3X
00 05 00 0F 32 30 35 2E 31 38 38 2E 38 2E 31 38
3A 35 33 00 06 01 00 35 A3 D2 E6 D5 A2 75 F1 9F
2E C0 78 8C 78 D8 AA 10 B7 60 42 10 44 27 9A 58
E9 12 24 CD E9 4C F0 51 06 BD 86 2E A4 86 CF 1E
9B 21 AC FE 8F EE BF 16 B6 94 8D 50 58 35 5F CD
1E 8C C5 5B E1 ED 12 FD 93 48 31 1D C0 B2 A9 E7
E0 00 F5 D4 9E 5C 6E BF BC BF 34 93 4A BD 4E 94
55 97 4B 8F 9A A9 F0 14 1D 15 97 CB 1B 08 C3 D1
E2 1E CA 8F 5A 10 7F 91 B7 AA 1A 8F 56 22 B2 2C
AD 31 A2 73 4F A9 F9 8E 2A 5C A5 71 AD C1 4A 6E
8A 65 CD 86 2C 6B 32 05 DA DC 3D C0 09 37 5A 10
76 C2 55 C0 8D 7B 30 5C 53 C9 2F A2 B0 FA 26 45
82 8D 58 D8 BF 2C 26 BD F0 5B 13 B4 B1 D3 00 8D
90 A7 8F 18 91 AF C7 F7 3F 46 00 30 60 53 BF DE
8C 4E 4E D4 28 D8 0D 17 3A AB 85 B2 49 E4 19 3E
D4 73 6C 82 24 7C FB 16 94 50 88 4B 8E EE 08 62
99 1D E1 BE 23 F2 98 15 17 D5 B4 FD 47 AF 9E 65
CD EC 31 67 20 B9 D4

Видим что в этом FLAP содержится SNAC'S: TLV 00 01, TL 00 05, TL 00 06.
TLV 00 01 - UIN
TLV 00 05 - сервер и порт куда нужно будет делать переподключение
TLV 00 06 - COOKIE, данные, которые нужно будет послать на сервер 
и порт которые указанны в TLV 00 05, чтобы доказать серверу что мы действительно 
являемся теми за кого себя выдаем ;)

SNAC 
TLV 00 01 00 06 39 36 33 36 33 32 - UIN

TLV 00 05 F 32 30 35 2E 31 38 38 2E 38 2E 31 38 3A 35 33 - IP:PORT

TLV 00 06 01 00 35 A3 D2 E6 D5 A2 75 F1 9F  
2E C0 78 8C 78 D8 AA 10 B7 60 42 10 44 27 9A 58  
E9 12 24 CD E9 4C F0 51 06 BD 86 2E A4 86 CF 1E  
9B 21 AC FE 8F EE BF 16 B6 94 8D 50 58 35 5F CD  
1E 8C C5 5B E1 ED 12 FD 93 48 31 1D C0 B2 A9 E7  
E0 00 F5 D4 9E 5C 6E BF BC BF 34 93 4A BD 4E 94  
55 97 4B 8F 9A A9 F0 14 1D 15 97 CB 1B 08 C3 D1  
E2 1E CA 8F 5A 10 7F 91 B7 AA 1A 8F 56 22 B2 2C  
AD 31 A2 73 4F A9 F9 8E 2A 5C A5 71 AD C1 4A 6E  
8A 65 CD 86 2C 6B 32 05 DA DC 3D C0 09 37 5A 10  
76 C2 55 C0 8D 7B 30 5C 53 C9 2F A2 B0 FA 26 45  
82 8D 58 D8 BF 2C 26 BD F0 5B 13 B4 B1 D3 00 8D  
90 A7 8F 18 91 AF C7 F7 3F 46 00 30 60 53 BF DE  
8C 4E 4E D4 28 D8 0D 17 3A AB 85 B2 49 E4 19 3E  
D4 73 6C 82 24 7C FB 16 94 50 88 4B 8E EE 08 62  
99 1D E1 BE 23 F2 98 15 17 D5 B4 FD 47 AF 9E 65  
CD EC 31 67 20 B9 D4                           - это COOKIE (256 байт случайных данных)
который нужно будет послать на сервер после того как будет произведено переподключение 
на сервер и порт которые будут указаны в этом пакете.
Если вы пишете brute force для ICQ сервиса этого пакета вам будет достаточно что бы 
убедиться в том что uin и пароль правильные. Нпример в brut force icda этим занимается 
следующий код программы:

buffer[512]='\xEE';
rbuf=buffer;
do
{
rbuf++;
if(*rbuf == '\x06'){
if(*(rbuf+1) != '\x01'){rbuf++;}
                        }
if((*rbuf == '\x06') && ((*(rbuf+1) == '\x01'))){break;}
}while(*rbuf != '\xEE');

if((*rbuf == '\x06') && ((*(rbuf+1) == '\x01'))){close(proxysock); return 5;}

Этот код программы проверяет наличие TLV 06 - cookie, с учетом того, что есть 
возможность появления цифры 06 если у нас появится шестизначный uin. 
Конечно вы можете сделать свой обработчик.
Вот так бы выглядела структура в вашей программе:

TLV(1) STRING my uin
if all goes right
TLV(5) STRING BOS-address:port
TLV(6) STRING cookie
else TLV(8) error-code
TLV(4) STRING url

Стоит отметить если пароль или uin были неправильными, то сервер ответит 
следующим FLAP пакетом (TLV 04)
2A 04 AE B0 00 56 00 01 00 09 32 34 30 37 39 30
31 35 32 00 04 00 3F 68 74 74 70 3A 2F 2F 77 77
77 2E 61 69 6D 2E 63 6F 6D 2F 65 72 72 6F 72 73
2F 4D 49 53 4D 41 54 43 48 5F 50 41 53 53 57 44
2E 68 74 6D 6C 3F 63 63 6F 64 65 3D 75 73 26 6C
61 6E 67 3D 65 6E 00 08 00 02 00 05


И так теперь рассмотрим дамп пакета который нужно будет слать после переподключения на сервер.
 
2A 01 28 E0 01 08 00 00 00 01 00 06 01 00 EC 9F
D0 FB 60 5F 7C 66 D4 24 4F 87 83 E7 98 41 15 DF
AB DA C5 AF D0 CD FD 52 45 57 99 EC 9F 6A 96 3D
C4 1A D7 E2 93 88 5F 9F 77 78 8F DD FB 19 E0 D5
01 DA 0B 48 19 33 F6 95 B9 9E AF 01 D3 D0 9D 46
D3 AD 4D 3C B3 0D 80 CC 2E 03 90 2C E2 77 B9 3A
C8 F1 F5 6F 84 3B 33 97 F4 04 16 9B 84 FA 2B 21
35 FC B7 97 60 E9 77 7A 81 3A 1F 50 6A E4 21 B6
B0 FC 07 17 09 3A 2E 9D 2E 86 BD 30 06 20 FA 5C
A9 F6 EE 55 63 26 A1 E5 CD C7 F6 91 FD 86 7D B9
3F DF 07 34 79 52 66 F8 F4 AE FB D5 BF 7B CB 2E
D2 FA CB 64 68 EE 19 F1 47 D5 70 40 E3 22 65 43
20 5E 1C 27 DA 81 5B 64 10 52 67 E9 8A 47 D5 89
92 6E C8 EF A9 0D FB 40 96 AD DD 41 2F 0E A2 96
B7 D0 12 CD D5 92 30 45 79 E6 DE 9A 70 5A 40 0B
9D C3 23 D8 AB 51 4D 83 92 BA A3 0E 3C 82 9C F3
EC 2B 7C 8A F1 F8 77 E3 C1 09 D4 8F 94 9A

Как видим в этом FLAP пакете содержится только SNAC с TLV 06 и больше ничего нету ;)
Как должен реагировать на этот пакет сервер?
Сервер должен ответить пакетом READY. Вот дамп пакета READY:
TLV 03
SNAC 1,03
2A 02 8F 2D 00 24 00 01 00 03 00 00 83 C8 13 D5
00 01 00 02 00 03 00 04 00 06 00 08 00 09 00 0A
00 0B 00 0C 00 13 00 15 00 22
Этот пакет говорит клиенту, что он готов работать с ним.

На этот SNAC 1,13 нам нужно ответить SNAC 1,17 (TLV 17)

2A 02 67 E1 00 32 00 01 00 17 00 00 00 00 00 17
00 01 00 04 00 13 00 04 00 02 00 01 00 03 00 01
00 15 00 01 00 04 00 01 00 06 00 01 00 09 00 01
00 0A 00 01 00 0B 00 01
Этот пакет говорит серверу - эй я ICQ клиент и не больше ;) (hey, i'm an icq client, not aim)
На этом авторизация на сервере заканчивается.
В следующей статье я покажу, как можно отправлять сообщения другим клиентам ICQ.
Удачи вам начинающие кодокопатели =)

                Специально для проекта ICDA: TE.MIRABILIZ.COM
                THE PAYHASH FROM [TERMINAL ENVASION]
                runsolar@mail.ru

AOLHACKERS.RU 2004