Помощь - Поиск - Пользователи - Календарь
Полная версия: Шифрование клиента
UoKit.com Форумы > Ultima Online : Dev > Работа с клиентом UO
StaticZ
Насколько мне удалось понять протокол UO устроен следующим образом:

1) Приветствие - Клиент отправляет не зашифрованный пакет 0xEF (New Client Version). Проверенно на 7.0.х клиентах, для старых могу предположить что вместо него идет 0xBD (Client Version), но проверить нет возможности. Кто знает когда был введен пакет 0xEF и может ли кто подтвердить приветствие старых клиентов???

2) Полученные версии клиента служат основой для генерации ключей шифрования, что используются совместно с сидом (IP адресом клиента) для XOR шифрования всех последующих пакетов отправляемых клиентом. При этом пакеты от сервера не шифруются. При этом вроде как для клиентов до 1.25.36 есть эти ключи работают не много по другому.


3) После перенаправления клиента с логин-сервера на гейм-сервер пакетом 0x8C (Play Server Accept), начинает использоваться шифрование, в качестве сида которого используется, как я понял - последние 4 байта сего пакета (Auth ID)... Дальше начинается муть.... В зависимости от версии клиента используются алгоритмы шифрования:
а) < 2.0.0 - Blowfish (клиент->сервер)
б) 2.0.0x to 2.0.3 - Blowfish + Twofish (клиент->сервер)
в) > 2.0.4 - Twofish (клиент->сервер) ||| MD5 (сервер->клиент)

В тоже время в нетах всплыло что-то про сжатие Huffman, которое применяется то ли для старых клиентов то ли перед шифрованием....


Кто в теме, может просветить о деталях сего процесса. Так же хотелось бы уточнить, что именно шифруется - содержимое пакета без ID и размера в случае если у пакета не постоянный размер? Или шифруется весь поток блоками какого-то размера?

И еще меняется ли размер данных при использовании этих алгоритмов?
Juzzver
Не в теме, но быть может будет полезным провести анализ Client Encryption системы из коммунити. Все выше перечисленные пакеты и алгоритмы там используются. Почти все действия в коде сопровождаются комментариями.
StaticZ
Цитата(Juzzver @ 4.6.2014, 13:35) *

Не в теме, но быть может будет полезным провести анализ Client Encryption системы из коммунити. Все выше перечисленные пакеты и алгоритмы там используются. Почти все действия в коде сопровождаются комментариями.
Да знаю об этом, как и об коде енкрипт\декрипта в флюре, уо-екст, некротуле и других. Но внятно нигде ничего не сказано, особенно по различия между версиями. Если никто не поможет - буду конечно разбираться сам, просто возни очень много, я даже не уверен что перехватываю весь поток данных от клиента.... В некротуле чето сумбурно расписано, но у меня какой-то треш декриптит (кроме - XOR, он как часики пашет)...

ЗЫ Еще в догонку вопрос - как из таблицы пакетов в клиенте определить тип пакета (клиент-сервер, сервер-клиент, и то и другое)??
Frog
Цитата(StaticZ @ 4.6.2014, 14:11) *
ЗЫ Еще в догонку вопрос - как из таблицы пакетов в клиенте определить тип пакета (клиент-сервер, сервер-клиент, и то и другое)??

Если в ехешнике то не в курсе, а вообще вечером скину в личку таблицу из инжекта, там вроде все учтено что идет в какую сторону, или в обе.
По логин шифрованию – на старых клиентах первые 4 байта это сид, ниже 1.25.36 идет старое xor шифрование, для этого клиента индивидуальное, выше этой версии – стандартное, использующееся по сей день.
С клиента 6.0.5 (если не ошибаюсь) клиент отправляет 1, 4, 16 байт при старте, вместо 4 (сид), что в этих байтах находится можно посмотреть на форуме инжекта, Грин разбирался, отписывался что нарыл.
По гейм шифрованию – все так, хаффман используется после декрипта пакета от сервера, для более подробной инфы можно посмотреть сорцы инжекта старого, там там по текущему логин шифрованию все есть и по гейм без мд5.
Warstone
Статикз, провести анализ работы UOExt религия не позволяет, да?... Я это все проходил. Там это все есть. Он прозрачно расшифровывает и зашифровывает по необходимости в оба направления.
StaticZ
Цитата(Warstone @ 5.6.2014, 1:46) *

Статикз, провести анализ работы UOExt религия не позволяет, да?... Я это все проходил. Там это все есть. Он прозрачно расшифровывает и зашифровывает по необходимости в оба направления.
Ну да, а еще можно провести анализ ассемблерного кода клиента... Вопрос времени, в принципе товарищ Frog уже ответил в ЛС на главный вопрос, что меня мучал. =) За что ему собственно респект.

Как сделаю сам - напишу подробнее, на будущее, если вдруг кто-то еще загорится.


ЗЫ. Кстати я так и не понял как ты из клиента вытащил допустимые направления пакетов, таблицу пакетов нашел (вернее подсмотрел как оно ищется в уо-екст), но там тупо айдишники и размер и какой-то странный поинтер одинаковый на всех пакетах....
RL_ka
список версий всех существующих клиентов, за исключением самых новых.
logincrypt

// TWOFISH
"7.0.28",
"7.0.27",
"7.0.26",
"7.0.25",
"7.0.24",
"7.0.23",
"7.0.22",
"7.0.21",
"7.0.19",
"7.0.18",
"7.0.17",
"7.0.16",
"7.0.15",
"7.0.14",
"7.0.13",
"7.0.12",
"7.0.11",
"7.0.10",
"7.0.9",
"7.0.8",
"7.0.7",
"7.0.6",
"7.0.5",
"7.0.4",
"7.0.3",
"7.0.2",
"7.0.1",
"7.0.0",
"6.0.14",
"6.0.13",
"6.0.12",
"6.0.11",
"6.0.10",
"6.0.9",
"6.0.8",
"6.0.7",
"6.0.6",
"6.0.5",
"6.0.4",
"6.0.3",
"6.0.2",
"6.0.1",
"6.0.0",
"5.0.9",
"5.0.8",
"5.0.7",
"5.0.6",
"5.0.5",
"5.0.4",
"5.0.3",
"5.0.2",
"5.0.1",
"5.0.0",
"4.0.11",
"4.0.10",
"4.0.9",
"4.0.8",
"4.0.7",
"4.0.6",
"4.0.5",
"4.0.4",
"4.0.3",
"4.0.2",
"4.0.1",
"4.0.0",
"3.0.8",
"3.0.7",
"3.0.6",
"3.0.5",
"3.0.4",
"3.0.3",
"3.0.2",
"3.0.1",
"3.0.0",
"2.0.9",
"2.0.8",
"2.0.7",
"2.0.6",
"2.0.5",
"2.0.4",
// BLOWFISH + TWOFISH
"2.0.3",
"2.0.2",
"2.0.1",
"2.0.0x",
// BLOWFISH
"2.0.0",
"1.26.4",
"1.26.3",
"1.26.2",
"1.26.1",
"1.26.0",
"1.25.37",
// BLOWFISH WITH SPECIAL LOGINCRYPT ONLY FOR THIS VERSION
"1.25.36",
// BLOWFISH WITH OLD LOGINCRYPT
"1.25.35",
"1.25.34",
"1.25.33",
"1.25.32",
"1.25.31",
"1.25.30",
"1.25.28",
"1.25.26",
"1.25.25",
"1.25.23", // no info about this version. doesn't exists?
"1.25.21",
"1.25.20",
"1.25.19",
"1.25.18",
"1.25.16",
"1.25.15",
"1.25.13",
"1.25.12",
"1.25.11",
"1.25.10",
"1.23.41",
"1.23.40",
"1.23.39",
"1.23.38",
"1.23.37",
"1.23.36",
"1.23.35",
"1.23.34",
"1.23.33",
"1.23.32",
"1.23.31",
"1.23.27",


Пакеты-изменения:
6.0.1.07 - пакет 08, пакет 25, пакет 3c
6.0.5 - изменение в первичном логине
6.0.14.2 - packet b9, f3, 24, 99, ba
Так же конечно были добавлены новые пакеты для новых клиентов, типа гампов в ЗЛибе и нового пакета отображения карт, но выше перечислены только те пакеты которые изменялись когда-либо.



Вроде бы остальное ты всё знаешь. Что тебе ещё рассказать?smile.gif

Получение ключей
Код
----- 
v0 = ((v0<<9|v1)<<10|v2)^((v2*v2)<<5);
Key_1 = (v0<<4)^(v1*v1)^(v1*0x0B000000)^(v2*0x380000)^0x2C13A5FD;    

-----
v0 = (((v0<<9|v2)<<10|v1)*8)^(v2*v2*0x0c00);
Key_2 = v0^(v1*v1)^(v1*0x6800000)^(v2*0x1c0000)^0x0A31D527F;


Пример:
06 . 00 . 07
v0 | v1 | v2

v0 = 6
v1 = 0
v2 = 7

Key_1 = 2e9bc78d
Key_2 = a25bfe7f
Warstone
Цитата(StaticZ @ 5.6.2014, 2:35) *
Кстати я так и не понял как ты из клиента вытащил допустимые направления пакетов, таблицу пакетов нашел (вернее подсмотрел как оно ищется в уо-екст), но там тупо айдишники и размер и какой-то странный поинтер одинаковый на всех пакетах....
Эм... Я тупо подсмотрел у Вятта.
А вообще то что тут: https://code.google.com/p/uo-ext/source/bro...Description.pas - тупо определяет размер пакета и не проверяет откуда он пришел. А большая портянка - закомментирована.
Warstone
Ну и еще можно добавить что VerInfo клиента дает информацию о том, какая версия.

Если версии нету, то можно изнутрей достать. Забыл самый клевый сайт, где вся инфа по клиенту была...
StaticZ
Цитата(Warstone @ 14.6.2014, 23:33) *

Ну и еще можно добавить что VerInfo клиента дает информацию о том, какая версия.

Да версия мне и так наперед известна, а так да в клиенте есть функции что ее возвращают. Саму таблицу с пакетами как я уже и писал я отрыл не без помощи твоих сурсов, так что с размерами порядок. Но вот везде любовь к указанию направления пакетов, это меня и привело к мысли что это тоже как то выдернуть можно.
StaticZ
Цитата(RL_ka @ 14.6.2014, 13:18) *

Пакеты-изменения:
6.0.1.07 - пакет 08, пакет 25, пакет 3c
6.0.5 - изменение в первичном логине
6.0.14.2 - packet b9, f3, 24, 99, ba
Так же конечно были добавлены новые пакеты для новых клиентов, типа гампов в ЗЛибе и нового пакета отображения карт, но выше перечислены только те пакеты которые изменялись когда-либо.
Вроде бы остальное ты всё знаешь. Что тебе ещё рассказать?smile.gif

Спасибо, но с логином какраз я сразу разобрался там все легко просто, даже в дизасме... А вот тволиш с хафманом пока у меня выдают какой-то мусор..... Толи я не все данные перехватывают(я граблю поток еще до его отправки в сокет), толи чёгото не то делаю... Толи не во вевремя переходу на него.. или может он чувствителен к размеру кодируемого блока... Короче непоняток у меня пока много. Походу придется эксперементировать самому )))
Warstone
А ты какую версию перехватываешь?.. И не проще-ли найти ML ранку (RunUO RE 1.4) она есть в доступе. Там Вятт делал поддержку шифрованного протокола.
Nickname
Цитата(Warstone @ 19.6.2014, 0:31) *

И не проще-ли найти ML ранку (RunUO RE 1.4) она есть в доступе. Там Вятт делал поддержку шифрованного протокола.

Вот поддержка шифрования, без понятия кто автор, тестировал на 2.3 - работало.
Нажмите для просмотра прикрепленного файла
StaticZ
Цитата(Warstone @ 19.6.2014, 1:31) *

А ты какую версию перехватываешь?.. И не проще-ли найти ML ранку (RunUO RE 1.4) она есть в доступе. Там Вятт делал поддержку шифрованного протокола.

Причем тут ранка когда мне нужно обрабатывать пакеты именно на стороне клиента )

Цитата(Nickname @ 19.6.2014, 1:40) *

Вот поддержка шифрования, без понятия кто автор, тестировал на 2.3 - работало.
Нажмите для просмотра прикрепленного файла
Спасибо конечно, но во первых я пишу на С\С++, во вторых мой вопрос больше был посвящен тому как и что шифровать, реализаций алгоритма шифрований в том или ином виде я и сам знаю штук 10, пока остановился на "некротулз" - но при конекте к серверу пока получаю какой-то мусор, вот сообствено и пытаюсь понять что происходит не так)
Warstone
Цитата
Причем тут ранка когда мне нужно обрабатывать пакеты именно на стороне клиента )
Ты не можешь сделать зеркальный алгоритм? Печально.
StaticZ
Цитата(Warstone @ 21.6.2014, 19:26) *
Ты не можешь сделать зеркальный алгоритм? Печально.
Да сказал же - вопрос времени, заново открывать америку глупо, если кто-то ее уже открыл )) Тем более проблема скорее всего не в алгоритмах шифрования а либо в их применении либо в получении потока данных.

Честно говоря с тех пор как создал эту тему даже не садился за это - завяз в других задачах. Как разберусь засяду - это посути следующий майлстоун у меня )
StaticZ
Итак проблема решена, главным виновником оказались 4 байта, что клиент впихивал перед пакетом 0х91 и из-за чего у парсера пакетов сносило крышу, ну и по совместительству они же и были сидом, а не ип... Ну а для порядка хотелось бы прояснить ситуацию на будущее. И так:
  • C->S: 0xEF (no encrypt) - своеобразное приветствие клиента, отсылаемый им Seed (IP address) и есть seed Xor шифрования для логин сервера.
  • C->S: 0x80 (xor) - данные авторизации
  • S->C: 0xA8 (no encrypt) - список серверов (в случае правильного логина конечно)
  • С->S: 0xA0 (xor) - выбор сервера
  • S->C: 0x8C (no encrypt) - разрешение на вход и данные сервера (в реальности логин сервер и игровой сервер разные машины для обеспечения большей производительности и пропускной способности, на эмуляторах конечно такие эпичные задачи не ставятся).
  • С->S: 4 bytes (no encrypt) - это не пакет, а просто seed для Twofish алгоритма.
  • С->S: 0х91 (twofish) - авторизация на игровом сервере
  • S->C: 0xB9, 0xA9 (md5+huffman) - список поддерживаемых сервером фич и список персонажей лист..
  • С->S: 0х5D (twofish) - выбор персонажа и список поддерживаемых клиентом фич
  • S->C: 0xBD (md5+huffman) - запрос версии клиента
  • C->S: 0xBD (twofish) - ответ с версией клиента
  • S->C: 0x1B (md5+huffman) - разрешение на вход с данными об игроке
  • .......... Ну а дальше понеслась...
Все что от клиента шифруется twofish, а то что от сервера сначала жмется Хаффманом, а потом шифруется md5 (разновидность XOR), собственно если поток перехватываем на стороне клиента то действуем наоборот - сначала дешефруем, а потом распаковываем. Данные проверенны на клиенте 7.0.18.0, скорее всего верны и для более старых, но поскольку пакет 0xEF введен относительно не давно там он чемто заменяется наверно. Возиться с старыми клиентами мне было в лом.

Теперь еще осталось разобраться с таблицей пакетов, то что идет от клиента можно вытащить из самого клиента, но пакеты что может принимать клиент хотелось бы поточнее...
Warstone
И я опять тебя спрошу, а не проще-ли было спросить у меня или в код посмотреть?.. https://code.google.com/p/uo-ext/source/bro...tStream.pas#382

If PByte(FIncommingBuffer.Base)^ = $EF Then Begin // New 0xEF packet for seeding.

Приходит пакет 0xEF. Ввяттовский гайд не доступен к сожалению, но есть описания этого пакета. Пришло с 6.0.12 что-ли...

End Else Begin
FSeed := PCardinal(FIncommingBuffer.Base)^;

Если не 0xEF, то это старое и там лежит сид.

Давным давно все все сделали... Любишь делать ненужную работу?..
StaticZ
Цитата(Warstone @ 17.7.2014, 12:19) *
И я опять тебя спрошу, а не проще-ли было спросить у меня или в код посмотреть?..
А я разве не спрашивал? А эта тема что? В общем и в целом многие знают, как и я. Но внятное описание подобных вещей отсутствует, а когда начинаешь делать сам - сразу всплывает куча деталей, неточностей, вопросов и нюансов, а порой как и в моем случае бывает еще не уверенность не только в правильности алгоритма но и своей логике (как я писал - хаваю пакеты не через прокси, так что не было даже уверенности что перехватываю весь поток).


Цитата(Warstone @ 17.7.2014, 12:19) *
https://code.google.com/p/uo-ext/source/bro...tStream.pas#382Если не 0xEF, то это старое и там лежит сид.
Конечно спасибо, как говориться лучше поздно чем никогда, но я еще в первом посту писал что с шифрование логин сервера никаких проблем нет - его сделал моментально и все работало как часики.


Цитата(Warstone @ 17.7.2014, 12:19) *
Давным давно все все сделали... Любишь делать ненужную работу?..
А я разве претендую на лавры первооткрывателя? Это делали и сделали уже множество людей, на работы которых я и опирался. Чего и не скрываю и выражаю большую благодарность всем, кто старался помочь.
Warstone
Цитата
А я разве не спрашивал?
И первый мой коммент...
Цитата
Но внятное описание подобных вещей отсутствует
Да... Так как кому надо - знают. Кому интересно - спрашивают.
Цитата
как я писал - хаваю пакеты не через прокси

Это норм. Там все делают. Я через прокси делал, чтобы всякие инжекты со всем остальным не переполошились.

Короче - спрашивайте если что... Нефига знаниям, добытым одним человеком - оставаться прерогативой этого одного человека.
BoBrO
не могли бы вы скинуть пример пакета "0х5D"!?
спасибо.
StaticZ
Цитата(BoBrO @ 22.7.2014, 11:20) *

не могли бы вы скинуть пример пакета "0х5D"!?
спасибо.
Сейчас не могу, в начале августа вернусь домой - если будет еще нужно напишите - кину, а так вообще в гайде вята посмотрите, там весь протокол хорошо описан.
Warstone
Гайд Вятта накрылся. А я его не сохранил ((
Frog
Цитата(BoBrO @ 22.7.2014, 11:20) *

не могли бы вы скинуть пример пакета "0х5D"!?
спасибо.
http://docs.polserver.com/packets/index.php?Packet=0x5D
Тут описано что в нем находится, может быть пригодится.
AdmiR
Цитата(Warstone @ 29.7.2014, 23:47) *

Гайд Вятта накрылся. А я его не сохранил ((

А где он был? или уже заработал?
Mirage
Вот так и теряется в вечности нужное sad.gif
yazZ3va
Цитата(StaticZ @ 17.7.2014, 3:12) *

Итак проблема решена, главным виновником оказались 4 байта, что клиент впихивал перед пакетом 0х91 и из-за чего у парсера пакетов сносило крышу, ну и по совместительству они же и были сидом, а не ип... Ну а для порядка хотелось бы прояснить ситуацию на будущее. И так:
  • C->S: 0xEF (no encrypt) - своеобразное приветствие клиента, отсылаемый им Seed (IP address) и есть seed Xor шифрования для логин сервера.
  • C->S: 0x80 (xor) - данные авторизации
  • S->C: 0xA8 (no encrypt) - список серверов (в случае правильного логина конечно)
  • С->S: 0xA0 (xor) - выбор сервера
  • S->C: 0x8C (no encrypt) - разрешение на вход и данные сервера (в реальности логин сервер и игровой сервер разные машины для обеспечения большей производительности и пропускной способности, на эмуляторах конечно такие эпичные задачи не ставятся).
  • С->S: 4 bytes (no encrypt) - это не пакет, а просто seed для Twofish алгоритма.
  • С->S: 0х91 (twofish) - авторизация на игровом сервере
  • S->C: 0xB9, 0xA9 (md5+huffman) - список поддерживаемых сервером фич и список персонажей лист..
  • С->S: 0х5D (twofish) - выбор персонажа и список поддерживаемых клиентом фич
  • S->C: 0xBD (md5+huffman) - запрос версии клиента
  • C->S: 0xBD (twofish) - ответ с версией клиента
  • S->C: 0x1B (md5+huffman) - разрешение на вход с данными об игроке
  • .......... Ну а дальше понеслась...
Все что от клиента шифруется twofish, а то что от сервера сначала жмется Хаффманом, а потом шифруется md5 (разновидность XOR), собственно если поток перехватываем на стороне клиента то действуем наоборот - сначала дешефруем, а потом распаковываем. Данные проверенны на клиенте 7.0.18.0, скорее всего верны и для более старых, но поскольку пакет 0xEF введен относительно не давно там он чемто заменяется наверно. Возиться с старыми клиентами мне было в лом.

Теперь еще осталось разобраться с таблицей пакетов, то что идет от клиента можно вытащить из самого клиента, но пакеты что может принимать клиент хотелось бы поточнее...

Доброго времени суток
Может кто подсказать алгоритм нахождение этого seed?
С->S: 4 bytes (no encrypt) - это не пакет, а просто seed для Twofish алгоритма.
Warstone
Пакет гайд Вятта http://ruosi.org/packetguide/index.xml

> Может кто подсказать алгоритм нахождение этого seed?
В зависимости от версии клиента:
- 0xEF пакет не шифруется и содержит зерно. Прилетает первым.
- Первые 4 байта в потоке

Если интересно, то вот код (немного кривоватый) для работы с протоколом. Не поддерживает шифрованный 2.0.3 клиент, так как только в нем был и Blowfish и Twofish.

https://code.google.com/p/uo-ext/source/bro...tStream.pas#462
yazZ3va
Не знаю куда я смотрел, но первые 4 байта это gameplay encryption key из пакета 0x8C отосланного сервером до этого rolleyes.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.