![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Протокол обмена между клиентом и сервером
Gek1 © (2005-05-18 18:30:00)Имееться ClientSocket, работающий в неблокирующим режиме.
Протокол обмена устроен так, что пакеты уходящие от сервера сжимаются алгоритмом Хаффмана. Каждый пакет имеет разную длинну.
Как известно - по пути пакеты могут резаться и склеиватся. Но получается что расжатый Хаффманом кусок пакета даст совсем другие данные. Практически всегда эти первая часть данных будет не поврежденна, что даст мне понять что за пакет идет и я смогу дождатся пока прийдет его полная длинна.
Но иногда рассжатый кусочек пакета настолько искажается, что мой алгоритм дает збои.
Сам протокол обмена я поменять не могу. Он придуман не мною и очень давно. Сервер тоже написан не мною. Я написал всего лишь клиент для сервера.
Возникает вопрос:
Можно ли всетаки как-то узнать длинну целого пакета, который отправлял сервер?
Мастера, подскажите пожалуйста что можно сделать в данной ситуации?
P.S. если понадобится код - приведу.
Eraser (2005-05-20 15:18:00) [21]Gek1 (20.05.05 15:16) [81]
Пакет сервером сжался... ТСП протокол порезал его на 2 куска и отправил.
Да причём тут вообще TCP?
Добрый совет: купи и главное прочитай хорошую книгу по TCP/IP.
Gek1 (2005-05-20 15:18:00) [22]
> False_Delirium © (20.05.05 15:13) [80]
В инжекте теже проблемы, но он похоже согласился с тем, что иногда будут глюки.
Gek1 (2005-05-20 15:16:00) [23]Вот пример сжатого блока:
14:10:32 Unknown Name, Server -> Client (Compressed), len: 5
0000: 81 68 E4 FE 80
14:10:32 Unknown Name, Server -> Client (Compressed), len: 564
0000: 46 41 87 D1 AB CE 48 00 00 00 00 00 00 00 00 00 00 00 00 01
0001: A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 D0 00 00 00
0002: 00 00 00 00 00 00 00 00 00 00 00 00 D0 00 00 00 00 00 00 00
0003: 00 00 00 00 00 00 00 00 D0 00 00 00 00 00 00 00 00 00 00 00
0004: 00 00 00 00 D0 5B D0 11 BE 6F 00 00 00 00 00 00 00 5E F1 7F
0005: 1B 78 7E 78 E6 F3 0C 00 00 00 00 03 40 FA 32 0F 1F 11 A0 00
0006: 00 00 00 00 00 8F E8 ED 9A D9 C8 70 79 1C 3E 40 00 00 00 00
0007: 34 8A 72 1C 1C DD 20 F1 00 00 00 00 00 00 E1 F4 76 CC D5 E6
0008: D9 C8 70 73 74 E3 07 A0 00 00 00 06 80 68 8C F1 E3 8B 85 AB
0009: C5 E0 00 00 00 00 00 67 3C 46 AC 1D 80 00 00 00 00 00 03 40
000A: EA BD 0E 0F 17 68 31 A0 00 00 00 00 00 17 2F 2E D9 AD 48 F4
000B: CD E4 00 00 00 00 00 34 A1 19 D1 C3 07 8C 6C 1E 80 00 00 00
000C: 00 00 67 3C 46 AC 1D 80 00 00 00 00 00 03 40 EE EE 81 E5 AB
000D: C6 08 00 00 00 00 00 01 9C F1 1A B0 76 00 00 00 00 00 00 0D
000E: 65 CD 58 74 87 D2 D9 C8 7D 3C 80 00 00 00 00 19 CF 11 AB 07
000F: 60 00 00 00 00 00 00 D0 E0 95 F9 76 B1 F3 0C 00 00 00 00 00
0010: 00 CE 78 8D 58 3B 00 00 00 00 00 00 06 80 62 9C 87 07 37 48
0011: 3C 40 00 00 00 00 00 38 7D 1D B3 35 79 B6 71 AB A4 6A C3 32
0012: 07 88 7C 7C 80 00 00 1A AD 72 83 C7 90 00 00 00 00 00 00 04
0013: 67 48 3C 6D 47 F1 CD 0F A7 18 DF 20 00 00 00 01 A0 79 5E 87
0014: 07 8B B4 18 D0 00 00 00 00 00 0C E7 88 D5 83 B0 00 00 00 00
0015: 00 00 68 CE CE 4D 8D 8D E9 C7 CF 98 6E 03 B5 B9 CF 3C 40 00
0016: 00 00 33 9E 23 56 0E C0 00 00 00 00 00 01 A0 97 F5 C6 C6 B5
0017: 78 00 00 00 00 00 00 0C E7 88 D5 83 B0 00 00 00 00 00 00 68
0018: AB DD 36 16 81 E5 AB 04 00 00 00 00 00 03 39 E2 35 60 EC 00
0019: 00 00 00 00 00 1A AF C3 F0 8A F2 00 00 00 00 00 00 02 3F A3
001A: B6 6B 52 3D 33 79 00 00 00 00 00 0D 71 95 F9 76 B1 F3 0C 00
001B: 00 00 00 00 00 63 43 F1 C6 FF 1E 39 2D 63 71 E2 00 00 00 00
001C: 06 80 00 D0
И после распаковки и разборки - результат:
14:10:32 Unknown Name, Server -> Client: 0xA9, len: 1380
0000: A9 05 64 01 4D 69 72 61 6C 65 78 00 00 00 00 00 00 00 00 00
0001: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0002: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0003: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0004: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0005: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0006: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0007: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0008: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0009: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000A: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000B: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000C: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000D: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000E: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000F: 00 00 00 00 11 00 59 65 77 00 00 00 00 00 00 00 00 00 00 00
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 54 6F 77
0011: 6E 20 43 65 6E 74 65 72 00 00 00 00 00 00 00 00 00 00 00 00
0012: 00 00 00 00 00 00 00 00 01 4D 69 6E 6F 63 00 00 00 00 00 00
0013: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0014: 45 61 73 74 20 42 72 69 64 67 65 00 00 00 00 00 00 00 00 00
0015: 00 00 00 00 00 00 00 00 00 00 00 02 42 72 69 74 61 69 6E 00
0016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0017: 00 00 00 43 61 73 74 6C 65 20 42 72 69 74 61 6E 69 61 00 00
0018: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 4D 6F 6F 6E 67
0019: 6C 6F 77 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001A: 00 00 00 00 00 00 44 6F 63 6B 73 00 00 00 00 00 00 00 00 00
001B: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 54 72
001C: 69 6E 73 69 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001D: 00 00 00 00 00 00 00 00 00 57 65 73 74 20 47 61 74 65 00 00
001E: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
001F: 05 4D 61 67 69 6E 63 69 61 00 00 00 00 00 00 00 00 00 00 00
0020: 00 00 00 00 00 00 00 00 00 00 00 00 44 6F 63 6B 73 00 00 00
0021: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0022: 00 00 00 06 4A 68 65 6C 6F 6D 00 00 00 00 00 00 00 00 00 00
0023: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 44 6F 63 6B 73
0024: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0025: 00 00 00 00 00 00 07 53 6B 61 72 61 20 42 72 61 65 00 00 00
0026: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 44 6F
0027: 63 6B 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0028: 00 00 00 00 00 00 00 00 00 08 56 65 73 70 65 72 00 00 00 00
0029: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002A: 00 44 6F 63 6B 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002B: 00 00 00 00 00 00 00 00 00 00 00 00 09 42 72 69 74 61 69 6E
002C: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
002D: 00 00 00 00 43 61 73 74 6C 65 20 42 6C 61 63 6B 74 68 6F 72
002E: 6E 65 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 57 69 6E 64
002F: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0030: 00 00 00 00 00 00 00 4D 61 69 6E 20 45 6E 74 72 61 6E 63 65
0031: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0B 54
0032: 72 69 6E 73 69 63 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0033: 00 00 00 00 00 00 00 00 00 00 44 6F 63 6B 73 00 00 00 00 00
0034: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0035: 00 0C 42 75 63 63 61 6E 65 65 72 27 73 20 44 65 6E 00 00 00
0036: 00 00 00 00 00 00 00 00 00 00 00 00 00 44 6F 63 6B 73 00 00
0037: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0038: 00 00 00 00 0D 4F 63 63 6C 6F 00 00 00 00 00 00 00 00 00 00
0039: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 44 6F 63 6B
003A: 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
003B: 00 00 00 00 00 00 00 0E 4E 75 6A 68 65 6C 6D 00 00 00 00 00
003C: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 44
003D: 6F 63 6B 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
003E: 00 00 00 00 00 00 00 00 00 00 0F 43 6F 76 65 00 00 00 00 00
003F: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0040: 00 00 45 61 73 74 20 47 61 74 65 00 00 00 00 00 00 00 00 00
0041: 00 00 00 00 00 00 00 00 00 00 00 00 00 10 56 65 73 70 65 72
0042: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0043: 00 00 00 00 00 49 72 6F 6E 77 6F 6F 64 20 49 6E 6E 00 00 00
0044: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Как видно:
Пакет сервером сжался... ТСП протокол порезал его на 2 куска и отправил.
Я принял... проанализировал и получил готовый пакет.
(В данном случае готовый один пакет, но частенько могуть быть несколько готовых пакетов)
Поэтому в коде и фигурирует:
"Проверка N целых пакетов"
False_Delirium (2005-05-20 15:13:00) [24]http://uo.menatwork.com.ua/files/injection/uoinj.rar
Всё это должно делаться насколько я помню.
Gek1 (2005-05-20 15:09:00) [25]
> А есть ещё и несжатый блок? Кстати, как ты определяешь сжатый
> это блок или нет? )
После того как отработает LoginClient ... стартует GameClient и все данные от сервера сжимаються.
Eraser (2005-05-20 14:55:00) [26]Gek1 (20.05.05 14:54) [77]
Дамп самого сжатого блока
А есть ещё и несжатый блок? Кстати, как ты определяешь сжатый это блок или нет? )
Gek1 (2005-05-20 14:54:00) [27]
> Значит длина пакета строго регламентирована!
> Dump снифера многое бы прояснил... может быть.
Дамп самого сжатого блока или история длин блоков?
Eraser (2005-05-20 14:51:00) [28]Gek1 (20.05.05 14:48) [74]
Ну не передает сервер длинну сжатого блока.
Значит длина пакета строго регламентирована!
Dump снифера многое бы прояснил... может быть.
Digitman (2005-05-20 14:50:00) [29]
> Сам протокол очень сложен
как бы ни был он сложен, но до тех пор пока ты не знаешь те его соглашения, которые ты пытаешься использовать, - грош цена твоему коду, работать он как положено не будет, и затея твоя стоит ГОРАЗДО дороже того что ты предполагал на момент "зачатия"
Gek1 (2005-05-20 14:48:00) [30]
> НИ о каких пакетах НЕ может идти речи, пока "сжатые" данные
> НЕ "разжаты" !
> а чтобы их "разжать" , нужно знать хотя бы длину данных,
> содержащих "сжатые" данные, перед сжатием представлявшие
> собой N пакетов
Ну не передает сервер длинну сжатого блока.
Я расжимаю все эти фрагменты и там уже анализирую.
Если проанализировав я определил, что там неполные данные, то не трогаяю буффер и жду пока прийдет еще один фрагмент.
Далее клею это фрагмент в конец и расжимаю опять все это дело.
Потом опять анализирую и тд
Gek1 (2005-05-20 14:42:00) [31]
> Всё. Я ретируюсь.. ))
:-)
Сам протокол очень сложен. Я начал это дело еще прошлым летом. Только зимой у меня получилось чтото сделать первое. Долго собирал всю информацию о протоколе и всех особенностях.
Много часов провел за обычным клиентом с логером, анализируя что означает каждый пакет.
Eraser (2005-05-20 14:41:00) [32]Gek1 (20.05.05 14:39) [70]
Тогда со сниффером наперевес надо анализировать что там посылается...
Digitman (2005-05-20 14:41:00) [33]
> Gek1 (20.05.05 14:34) [68]
> Принятый "шматок" дописываю в конец буффера
не возражаю.
> если в прошлый раз пришел оборваный пакет
в ПРОШЛЫЙ раз пришел не "оборваный пакет", а очередной фрагмент неких данных, упакоавнных Хафман-компрессором !!
НИ о каких пакетах НЕ может идти речи, пока "сжатые" данные НЕ "разжаты" !
а чтобы их "разжать" , нужно знать хотя бы длину данных, содержащих "сжатые" данные, перед сжатием представлявшие собой N пакетов
Gek1 (2005-05-20 14:39:00) [34]
> А где-нибудь есть SDK или описание протокола данной сетевой
> игрушки.
Если бы было SDK - я бы ВАМ и себе голову не морочил. Давно уже все бы работало. Игрушка старая. Описание протокола закрыто и никому в руки не попадало.
Есть только кодеры, которые потихонечку анализировали и разгадывали как он устроен, но до конца он неизвестен.
> Без файлов данного архива Вы не сможете играть на сервере.
> Файлы из данного архива необходимо разархивировать в папку
> с игрой. В данном архиве следующие файлы: client.exe, abyss.dll."
>
> Скорее всего вся "логика" соединения в этих файлах... уже
> создана разработчиком сервера.
Это ты нашел сам клиент от разрабочиков, только забыл его версию глянуть, так как криптация в них различна.
abyss.dll - на абисе небыл, но многие вставляют dll-ки, которые борятся с любителями искать "багов" в программах.
Сам тоже не люблю любителей "багов", поэтому стараюсь, чтобы они пользоватся ими не могли.
Eraser (2005-05-20 14:36:00) [35]Gek1 (20.05.05 14:34) [68]
если в прошлый раз пришел оборваный пакет, то буфер не будет пустым и новый "шматок" допишется к старым "шматкам".
Всё. Я ретируюсь.. ))
Gek1 (2005-05-20 14:34:00) [36]
> "шматок" данных ты рпринял, а не "данные".
Да. шмоток ... кусочек ...
> какие "данные"-то ? только что принятый "шматок" или N "шматков",
> принятых ранее + текущий "шматок" ?
Принятый "шматок" дописываю в конец буффера.
если в прошлый раз пришел оборваный пакет, то буфер не будет пустым и новый "шматок" допишется к старым "шматкам".
если же буфер пустой, то будет первый "шматок" или не "шматок" - это вы проверим проверкой на наличие N целых пакетов.
Eraser (2005-05-20 14:32:00) [37]Gek1 (20.05.05 14:29) [65]
Вот щас нашёл в сети, где можно скачать клиент, такую надпись
"Без файлов данного архива Вы не сможете играть на сервере. Файлы из данного архива необходимо разархивировать в папку с игрой. В данном архиве следующие файлы: client.exe, abyss.dll."
Скорее всего вся "логика" соединения в этих файлах... уже создана разработчиком сервера.
Gek1 (2005-05-20 14:29:00) [38]
> Возможен еще вариант - каждый запакованный пакет имеет одинаковую
> длину, определенную разработчиком.
Необходимые пакеты собираються в цепочку .... сжимаються .. и отправляются клиенту.
Длинна сжатого потока данных будет всегда разна, потому как каждый раз цепочка стоиться из разных пакетов с информацией
Eraser (2005-05-20 14:29:00) [39]Gek1 (20.05.05 14:25) [64]
А где-нибудь есть SDK или описание протокола данной сетевой игрушки.
Gek1 (2005-05-20 14:25:00) [40]
> 1. Что за сервер? Приведи название программы.
Ultima Online
В основном используються POL сервера, поэтому я тестирую на POL095.
Хотя на Sphere глюки тоже были замечены.
> 2. каждый пакет может в свою очередь иметь дин. длинну
>
> в TCP впринципе очень сложно формировать каждый пакет по
> отдельности
Когда я говорил пакет, я имеел ввиду пакет с информацией, посланный самим сервером.
В случае с TCP - я писал TCP пакет.
Например:
0x1A Packet
Object Information (Variable # of bytes)
· BYTE cmd
· BYTE[2] blockSize
· BYTE[4] itemID
· BYTE[2] model #
· if (itemID & 0x80000000)
· BYTE[2] item count (or model # for corpses)
· if (model & 0x8000)
· BYTE Incr Counter (increment model by this #)
· BYTE[2] xLoc (only use lowest significant 15 bits)
· BYTE[2] yLoc
· if (xLoc & 0x8000)
· BYTE direction
· BYTE zLoc
· if (yLoc & 0x8000)
· BYTE[2] dye
· if (yLoc & 0x4000)
· BYTE flag byte (See top)
Вот это пакет 0x1A от сервера. Непутайте с TCP пакетами.
> Где-то ДОЛЖНА передаваться длина данных... или стоп-последовательность
> (что врядли).
В сжатой части длинна не обнаружена и стоп последовательность тоже.
Весь мой алгоритм опирается на данные, полученные после распаковки.