This page has been robot translated, sorry for typos if any. Original content here.

Основы работы Java чатов.

Информация касатеся только Java-чата фирмы Volano, чаты других производителей возможно работают по другому протоколу, хотя принцип обмена данными вероятно тот же. Приведенная информация добыта не из документации а методом отслеживания соеденении и TCP пакетов. Применялись такие инструменты как IP-Tools v2.07 и Network Spy v2.0

Фрагмент HTML кода вставляющий апплет:

<base href="http://www.zerkalo.com/vcclient/"> <br><applet codebase="." archive="COM/volano/VolanoChat.jar" code="COM.volano.VolanoChat.class" width="150" height="60"><br><param name="cabbase" value="COM/volano/VolanoChat.cab"> <br><param name="color" value="ffffff"> <br><param name="group" chat server> <br><param name="text" value="english.txt"> <br> Извините ваш браузер не поддерживает JAVA или она увас отключена.<br></applet>

Как видим в качестве параметра передается имя группы чатов MTR Chat Server. Кроме того, с сервера загружается файл ресурсов english.txt (посмотреть). На сервере также имеется франкоязычный аналог french.txt (посмотреть). Эти файлы содержат настройки и строковые константы апплета.

Просмотрев файл настроек я нашел еще несколько файлов (указанных в english.txt ), содержимое которых возможно покажется тоже интересным: BannerPlayer.txt (список баннеров, которые будут загружаться в апплет), LogoPlayer.txt (ссылка на эмблему, отображаемую на передней панели апплета), version.html, help.html, inde.htm , unable.html, document.html, host.html (руководства пользователя, версии чата, сообщение об ошибке и др.).

Ну самый интересный файл это конечно password.html. К сожалению просто так получить доступ к нему нельзя. Если мне удастся его прочитать, я выставлю здесь ссылку на него.

Исходя из анализа файла english.txt можно сделать вывод о том, что в чате существуют пользователи с админскими правами, и им доступны такие операции как удаление и блокировка пользователей, а также вероятно удаление сообщений. Это видно из следующего фрагмента файла english.txt :

text.menu.people.remove=Remove %0
text.menu.people.kick=Kick %0
text.menu.people.ban=Ban %0

Кроме того, видно что в чате существует регистрация и зарегестрированные ники защищенные паролем. 
У зарегестрированных пользователей существует профайл.

После запуска, апплет чата ведет общение с хостом на котором расположен сервер чата (для данного чата это 193.124.133.54). Общение ведется по TCP протоколу. Сокет открывается один раз при запуске апплета и закрывается при завершении его работы. Таким образом local и remote порты остаются постоянными на протяжении сеанса работы. Апплет открвает сокет на 8000 порту сервера.

Приведу дамп основного пакета запроса на вход в группу чатов (этот пакет отсылается аплетом на 8000 порт сервера):

0000  20 53 52 43 00 00 44 45  53 54 00 00 08 00 45 00   .SRC..DEST....E.
0010  00 EB 11 11 40 00 80 06  E9 70 D4 09 E4 CE C1 7C   ....@....p.....|
0020  85 36 04 72 1F 40 00 2A  83 F5 AA E8 56 5A 50 18   .6.r.@.*....VZP.
0030  08 60 81 8C 00 00 00 11  43 4F 4D 2E 76 6F 6C 61   .`......COM.vola
0040  6E 6F 2E 41 63 63 65 73  73 00 00 00 01 00 0F 4D   no.Access......M
0050  54 52 20 43 68 61 74 20  53 65 72 76 65 72 00 05   TR.Chat.Server..
0060  32 2E 31 2E 30 00 20 68  74 74 70 3A 2F 2F 77 77   2.1.0..http://ww
0070  77 2E 7A 65 72 6B 61 6C  6F 2E 63 6F 6D 2F 76 63   w.zerkalo.com/vc
0080  63 6C 69 65 6E 74 2F 00  20 68 74 74 70 3A 2F 2F   client/..http://
0090  77 77 77 2E 7A 65 72 6B  61 6C 6F 2E 63 6F 6D 2F   www.zerkalo.com/
00A0  76 63 63 6C 69 65 6E 74  2F 00 0F 4D 69 63 72 6F   vcclient/..Micro
00B0  73 6F 66 74 20 43 6F 72  70 2E 00 19 68 74 74 70   soft.Corp...http
00C0  3A 2F 2F 77 77 77 2E 6D  69 63 72 6F 73 6F 66 74   ://www.microsoft
00D0  2E 63 6F 6D 2F 00 05 31  2E 31 2E 34 00 04 34 35   .com/..1.1.4..45
00E0  2E 33 00 0A 57 69 6E 64  6F 77 73 20 39 38 00 04   .3..Windows.98..
00F0  34 2E 31 30 00 03 78 38  36                        4.10..x86

Серым цветом отмечен заголовок пакета. Далее идет тело пакета. Тело состоит из текстовых строк в незашифрованном виде. Каждая строка начинается с указателя длины строки (отмечено розовым цветом). Белым цветом отмечены байты, назначение которых я не понял.

Как мы видим при инициализации соединения, апплет отсылает следующую информацию:

1. COM.volano.Access - вероятно это запрос на доступ пользователя к чату. Все запросы апплета начинаются на COM.volano. , а после точки следует команда которую вызывает апплет (в данном случае Access).

2. MTR.Chat.Server - Имя группы чатов к которым мы присоединяемся (эта строка указывалась в параметрах апплета, при вызове его из HTML странички - см. выше)

В ответ на этот запрос сервер присылает ответный пакет, основное содержание которого - перечень активных комнат чата:

0000  44 45 53 54 00 00 20 53  52 43 00 00 08 00 45 00   DEST...SRC....E.
0010  02 28 72 82 40 00 2E 06  D8 C2 C1 7C 85 36 D4 09   .(r.@......|.6..
0020  E4 CE 1F 40 04 72 AA E8  56 5A 00 2A 84 B8 50 18   ...@.r..VZ.*..P.
0030  40 E8 94 95 00 00 00 11  43 4F 4D 2E 76 6F 6C 61   @.......COM.vola
0040  6E 6F 2E 41 63 63 65 73  73 00 00 00 04 00 00 00   no.Access.......
0050  01 00 00 00 32 00 10 4D  41 49 4E 20 4D 54 52 20   ....2..MAIN.MTR.
0060  43 48 41 54 C3 90 5F 00  0F 45 4E 47 4C 49 53 48   CHAT.._..ENGLISH
0070  20 43 48 41 54 C3 90 5F  00 1E 42 55 53 49 4E 45   .CHAT.._..BUSINE
0080  53 53 2C 46 49 4E 41 4E  43 45 2C 53 54 4F 43 4B   SS,FINANCE,STOCK
0090  20 43 48 41 54 C3 90 5F  00 10 50 4F 4C 49 54 49   .CHAT.._..POLITI
00A0  43 53 20 43 48 41 54 C3  90 5F 00 10 52 4F 4D 41   CS.CHAT.._..ROMA
00B0  4E 54 49 43 20 43 48 41  54 C3 90 5F 00 0D 49 4E   NTIC.CHAT.._..IN
00C0  54 49 4D 20 43 48 41 54  C3 90 5F 00 15 45 52 4F   TIM.CHAT.._..ERO
00D0  54 49 43 20 44 52 45 41  4D 53 20 43 48 41 54 C3   TIC.DREAMS.CHAT.
00E0  90 5F 00 10 49 53 50 4F  56 45 44 41 4C 60 4E 49   ._..ISPOVEDAL`NI
00F0  41 C3 90 5F 00 10 4B 4F  4D 4E 41 54 41 20 50 49   A.._..KOMNATA.PI
0100  54 4F 4B C3 90 5F 00 0D  48 55 4D 4F 52 20 43 48   TOK.._..HUMOR.CH
0110  41 54 C3 90 5F 00 0D 4A  55 4C 49 41 20 43 48 41   AT.._..JULIA.CHA
0120  54 C3 90 5F 00 16 4E 45  55 50 52 41 56 4C 49 41   T.._..NEUPRAVLIA
0130  45 4D 49 49 20 43 48 41  54 C3 90 5F 00 1A 41 52   EMII.CHAT.._..AR
0140  54 20 41 4E 44 20 50 48  49 4C 4F 53 4F 50 48 59   T.AND.PHILOSOPHY
0150  20 43 48 41 54 C3 90 5F  00 0D 53 50 4F 52 54 20   .CHAT.._..SPORT.
0160  43 48 41 54 C3 90 5F 00  0D 4D 55 53 49 43 20 43   CHAT.._..MUSIC.C
0170  48 41 54 C3 90 5F 00 13  48 41 52 44 20 26 20 53   HAT.._..HARD.&.S
0180  4F 46 54 20 43 48 41 54  C3 90 5F                  OFT.CHAT.._

Названия комнат перечисляются в том же формате что и было описано выше: двухбайтовая длинна строки и сама строка. Однако в конце каждого названия комнаты идут три байта C3 90 5F назначение которых непонятно.

После того как пользователь "тыкнул" в одну из комнат чата (но еще не вошел в нее), апплет высылает на сервер следующий пакет:

0000  20 53 52 43 00 00 44 45  53 54 00 00 08 00 45 00   .SRC..DEST....E.
0010  00 4C 21 11 40 00 80 06  DA 0F D4 09 E4 CE C1 7C   .L..@..........|
0020  85 36 04 72 1F 40 00 2A  84 B8 AA E8 5B 2D 50 18   .6.r.@.*....[-P.
0030  07 A5 36 DB 00 00 00 0D  43 4F 4D 2E 76 6F 6C 61   ..6.....COM.vola
0040  6E 6F 2E 62 67 00 00 00  01 00 0F 45 4E 47 4C 49   no.bg......ENGLI
0050  53 48 20 43 48 41 54 C3  90 5F                     SH.CHAT.._

Где COM.volano.bg - вероятно команда дать список пользователей из комнаты ENGLISH.CHAT, или намек серверу на то что юзер собирается войти в комнату.

В ответ на этот запрос, сервер высылает апплету список пользователей, находящихся в данной комнате:

0000  44 45 53 54 00 00 20 53  52 43 00 00 08 00 45 00   DEST...SRC....E.
0010  00 BE 77 56 40 00 2E 06  D5 58 C1 7C 85 36 D4 09   ..wV@....X.|.6..
0020  E4 CE 1F 40 04 72 AA E8  5B 2D 00 2A 84 DC 50 18   ...@.r..[-.*..P.
0030  40 E8 1D 74 00 00 00 0D  43 4F 4D 2E 76 6F 6C 61   @..t....COM.vola
0040  6E 6F 2E 62 67 00 00 00  04 00 0F 45 4E 47 4C 49   no.bg......ENGLI
0050  53 48 20 43 48 41 54 C3  90 5F 00 00 00 01 00 00   SH.CHAT.._......
0060  00 01 00 00 00 00 00 02  00 06 45 64 77 61 72 64   ..........Edward
0070  00 16 43 6F 6F 6B 69 6E  67 20 6D 6F 72 65 20 61   ..Cooking.more.a
0080  70 70 6C 65 20 70 69 65  00 0D 36 34 2E 32 30 39   pple.pie..64.209
0090  2E 39 39 2E 31 33 39 00  05 66 61 6C 73 65 00 05   .99.139..false..
00A0  66 61 6C 73 65 00 05 47  6C 6F 63 6B 00 00 00 0E   false..Glock....
00B0  31 34 31 2E 31 35 35 2E  31 38 37 2E 32 31 00 05   141.155.187.21..
00C0  66 61 6C 73 65 00 05 66  61 6C 73 65               false..false

Как видим список содержит в себе массу интересной информации, в том числе IP адреса чатлан. Разберем все по порядку:

1. COM.volano.bg - имя команды которую высылал апплет. Вероятно сервер просто дублирует ту команду которая вызывалась для того чтобы клиент знал в ответ на какой именно запрос пришел данный пакет.

2.  00 00 00 04  - снова не понятно что такое. Скорее всего это пересылается какой-то счетчик (целое 4-байтовое число). Обратим внимание на то, что во всех пакетах присутствуют эти 4 байта, но значение последнего пропорционально количеству информации, присылаемой пользователю. Когда апплет высылал название комнаты куда хочет войти юзер, этот счетчик был равен 1, когда сервер присылает список двух чатлан, находящихся в комнате - счетчик равен 4, а когда сервер высылал список комнат (их около 40-ка) - счетчик был равен аж 32h.

3. ENGLISH.CHAT - название комнаты список пользователей которой мы получаем плюс непонятные байты C3 90 5F.

4. 00 01 00 00 00 01 00 00 00 00 00 02 - снова непонятно что, хотя последее число возможно означает количество юзеров в комнате.

5. Edward - ник юзера, Cooking more apple pie - так называемый профайл пользователя (вводится при входе пользователя в чат), 64.209.99.139 - IP адрес пользователя (пока непонятно зачем он нужен апплету, ведь информация все равно вся идет через сервер), далее следует два значения false назначение которых непонятно, может быть это какие-то настройки пользователя или его статус.

6. Glock и т.д. - ник пользователя и все такое же как и у первого, за исключением того что строка профайла пустая (профайл вводить необязательно).

Продолжение следует ...