PDA

Просмотр полной версии : Управление пакетами из консольного приложения


Linux
17.05.2016, 16:11
Вступление
Хочу устроить флеш-моб на сервере, так сказать синематик-шоу на тысяч 5 персонажей :D
Создавать персонажей, покупать у нпс нужные расходники, бафаться и идти на ивент по заданному маршруту в ручном режиме это очень напряжно для такого количества персонажей. Хочется потрудиться над сценарием для одного персонажа и прогнать его для всех.

План мероприятий
1) При помощи L2PH отловить нужные моей программе клиент/серверные пакеты.
2) Консольная программа (на Delphi) воспроизводит набор пакетов в заданной последовательности

Необходимые действия в игре
1) ЛогИн/ЛогОфф на сервер
*) Выбор сервера и коннект на сервер
2) Создание персонажа (ник, раса, класс, пол и т.д.)
3) Релог персонажа по имени
4) Движение (хотьба/бег) в точку с указанными координатами (X,Y,Z)
5) Использование телепорта (выбор нужного пункта в меню ГК)
6) Покупка определенного предмета у НПС
7) Получение бафа у определенного НПС
8) Получение сведений о количестве определенного предмета в инвентаре
9) Отправка личного сообщения другому персонажу, с указанием ссылки на предмет в инвентаре (шифтинг)

Исходные данные
- сервер High Five, платформа PTS
- версия L2PH имеющаяся в наличии - 3.5.34.176

Вопросы
1) Возможно ли в принципе реализовать такую задумку?
2) Позволит ли L2PH на пакетном уровне отловить все пакеты взаимодействий, что я описал в разделе "Необходимые действия в игре"?
2) Какие трудности могут встретиться на пути реализации?

NLObP
17.05.2016, 21:54
Необходимые действия в игре
1) ЛогИн/ЛогОфф на сервер
2) Создание персонажа (ник, раса, класс, пол и т.д.)
3) Релог персонажа по имени
эти подпункты пакетхак не сможет выполнить.

Linux
18.05.2016, 16:45
эти подпункты пакетхак не сможет выполнить.

Я из поиска нашел ваше упоминание о la2_client_emu, где говорилось что этот пример позволяет авторизоваться на Логин-Сервер L2. Собрал приложение на D7, и, за не имением документации на этот пример, вопрос: представленный лог о выполнении является ли корректным? Как понять работает ли он в целом?


WinSocket Library has been initialised
Connected to Remote Server

Server MSG, Length: 186 (0xBA)
-------------------------------------------------------

RSA Key changed
BlowFish key changed

Client MSG, Length: 42 (0x2A)
-------------------------------------------------------

Server MSG, Length: 42 (0x2A)
-------------------------------------------------------

Client MSG, Length: 178 (0xB2)
-------------------------------------------------------

Server MSG, Length: 66 (0x42)
-------------------------------------------------------

Login Ok

Client MSG, Length: 34 (0x22)
-------------------------------------------------------

RS was Disconnected
RS disconnected


смущает меня что сразу же происходит и дисконнект
может кто предоставить полный листинг рабочего коннекта данного примера? и если можно с указанием сервера Ла2, чтобы можно было проверить самолично

UPD1:
Кажется сам понял почему происходит дисконнект, этот пример только для взаимодействия с Логин-Сервером, а чтобы попасть в игровой мир нужно допилить программу для взаимодействия с Гейм-Сервером (добавить IP/PORT ГС, порядок обмена пакетами К-ГС). Вопрос: верно ли мое предположение насчет работы данного примера только с ЛС? т.к. в коде я видел процедуры по выбору игровых серверов и получении информации о них, а значит по идее программа должна заходить так далеко, или это только объявления таких процедур? пока еще так глубоко не успел копнуть исходники

UPD2:
По логике вещей я понимаю, что Логин-Сервер на мой клиентский запрос (логин+пасс) должен мне сформировать уникальный ID, который мне понадобиться для общения с Гейм-Сервером. Вопрос: что является таким ID (полученным пакетом) и как правильно его нужно будет интегрировать в последующие пакеты для общения с Гейм-Сервером?

kpa9pt
18.05.2016, 17:26
1) ЛогОфф на сервер
2) Создание персонажа (ник, раса, класс, пол и т.д.)
3) Релог персонажа по имени


Это возможно, есть опыт:)

supernewbie
20.05.2016, 09:48
Linux, можешь посмотреть исходники бота, как минимум он умеет логиниться:
http://coderx.ru/showthread.php?t=9575

Linux
25.05.2016, 19:17
Объясните в чем может быть такое различие при одинаковых входных данных и компиляции под

Delphi 7

WinSocket Library has been initialised
Connected to Remote Server

Server MSG, Length: 186 (0xBA)
-------------------------------------------------------

RSA Key changed
BlowFish key changed

Client MSG, Length: 42 (0x2A)
-------------------------------------------------------

Server MSG, Length: 42 (0x2A)
-------------------------------------------------------

Client MSG, Length: 178 (0xB2)
-------------------------------------------------------

Server MSG, Length: 66 (0x42)
-------------------------------------------------------

Login Ok

Client MSG, Length: 34 (0x22)
-------------------------------------------------------

RS was Disconnected
RS disconnected


и Delphi 2010

WinSocket Library has been initialised
Connected to Remote Server

Server MSG, Length: 186 (0xBA)
-------------------------------------------------------
0x0000| BA 00 00 CD 32 06 00 CF 3E 06 FF 4C DC 53 B4 89
0x0010| 8E B8 47 E4 2E 70 8D BE 32 02 3F 2A 5F 6E B2 E7
0x0020| 87 8A F1 5C 65 BE B5 CE F8 C2 A8 C7 08 64 46 45
0x0030| BD 8B 52 D3 26 D4 E4 A2 E5 3E 9F 74 3B AE 70 FD
0x0040| A3 B5 5D CA 86 2F 70 05 88 E2 61 38 93 98 EB AC
0x0050| D4 EB FD 3E C5 A0 CA 7B D7 1F 8B 97 4A 56 E9 EF
0x0060| EE 85 2F D2 B9 81 44 92 1A C6 E6 F4 4D F8 0C CB
0x0070| 29 F7 3D E3 33 23 36 E7 B9 1C 91 DB D6 C5 C0 03
0x0080| 05 2F E2 B0 0B 51 14 40 94 FB 96 70 A0 24 BB DB
0x0090| 47 B1 32 82 D1 D9 32 82 D1 D9 19 22 57 B2 4F 60
0x00A0| 3B 17 7E 61 B2 04 AC F9 A7 4B A0 7E 84 70 82 CF
0x00B0| 21 48 3D 25 2C C9 A8 3E 5B 02

RSA Key changed
BlowFish key changed

Client MSG, Length: 42 (0x2A)
-------------------------------------------------------
0x0000| 2A 00 07 CD 32 06 00 00 00 00 00 00 00 00 00 00
0x0010| 00 00 00 00 00 00 00 00 00 00 07 CD 32 06 00 00
0x0020| 00 00 00 00 00 00 00 00 00 00

RS was Disconnected



не могу понять, один и тот же код, а результат разный

NLObP
25.05.2016, 20:23
не могу понять, один и тот же код, а результат разный

Вроде работа со строками по разному организована.

Linux
26.05.2016, 13:53
Вроде работа со строками по разному организована.

единственное преобразование для D2010:

SockAddr.sin_addr.S_addr := inet_addr( PAnsiChar( AnsiString( LS_HOST ) ) );


и совсем неадекватный результат:



WinSocket Library has been initialised
Connected to Remote Server

Server MSG, Length: 186 (0xBA)
-------------------------------------------------------
0x0000| BA 00 00 4A 39 06 00 4A 39 06 29 74 C4 F5 41 6A
0x0010| 98 60 BC A6 FF 4D AB 89 01 C4 71 D7 1A 9D E0 F1
0x0020| 18 28 24 48 46 45 51 53 DE 54 EC 53 24 72 1D 29
0x0030| C1 A0 7D F9 5C 39 4B 93 FF 6D 4A F5 C3 25 84 3A
0x0040| 17 B4 4C FE 63 60 A2 96 9E 68 2E C9 53 6D 8A 5C
0x0050| 1C 29 12 83 CD F1 77 3C 59 EF 29 41 92 93 37 7B
0x0060| B5 0D 6C 02 BF 91 A7 39 FA 30 27 7B 52 46 41 AE
0x0070| BD 05 0D F6 66 12 2C 4B 7A CA 2F 4B 14 37 F9 2D
0x0080| B1 E6 67 35 D4 35 8B 72 CF 89 9D 80 10 00 91 0D
0x0090| F8 12 A9 36 68 43 A9 36 68 43 C7 53 7E 82 05 2D
0x00A0| 9C 95 16 5A 9B 50 3B 58 44 52 B2 B1 BD D3 87 38
0x00B0| 6F 87 01 5D 08 0A 66 36 64 66

RSA Key changed
BlowFish key changed

Client MSG, Length: 42 (0x2A)
-------------------------------------------------------
0x0000| 2A 00 07 4A 39 06 00 00 00 00 00 00 00 00 00 00
0x0010| 00 00 00 00 00 00 00 00 00 00 07 4A 39 06 00 00
0x0020| 00 00 00 00 00 00 00 00 00 00

RS was Disconnected


мне уже кажется, что с этими непонятками я просто хожу по замкнутому кругу, буксую на месте :(

UPD1
кто является автором примера la2_client_emu.rar?

UPD2
Добавлено через 17 часов 26 минут
Расширил логирование в la2_client_emu и судя по логу программа не может дойти до следующих методов: LS_ServerList() и LS_PlayOk().
После последнего успешного выполнения метода RequestServerList() в методе WMSOCK_RS_EVENT(Msg) происходит WSAECONNABORTED (#10053).
Подскажите в чем может быть проблема? Что может разрывать совет?

Текст лога:


------------------------------------------------------
[Login Server Host | Port]: xxx.xxx.xxx.xxx | 2106
[Game Server Host | Port]: xxx.xxx.xxx.xxx | 7777
[Accounts]
[1] login: ***** # password: *****
------------------------------------------------------

[Init]: BlowFish_Key = 6B60CB5B82CE90B1CC2B6C556C6C6C6C
[Init]: WinSocket Library has been initialised
[RS_Connect]: Connected to Login-Server

-------------------------------------------------------
Step [1]
-------------------------------------------------------

[WMSOCK_RS_EVENT]: WinSock.{FD_Read}

Server->Client, Length: 186 (0xBA)
-------------------------------------------------------
0x0000| BA 00 00 B2 65 06 00 21 C6 00 00 2F 3E D2 78 D2
0x0010| 05 4B C7 C3 58 5A 50 10 34 D8 A2 47 4B 62 F1 78
0x0020| B5 F1 EE 35 AC 2E C2 B5 7C 38 34 86 64 DA DE 92
0x0030| 47 43 AE A6 FF D9 83 40 54 54 B6 C3 74 07 9A F8
0x0040| 5B 52 48 05 EB E5 96 8D 72 ED 52 80 F6 A7 9C 65
0x0050| 92 E5 A6 D2 96 33 AC 4B B7 2A 34 31 CA 89 48 F6
0x0060| A4 7A 70 4A 79 C8 E9 E8 7A 08 2C 46 0D 76 30 97
0x0070| 79 E7 3C 22 25 B9 DA CA EE DE CA 76 A5 34 14 07
0x0080| C5 B9 0C CA 97 B1 2B 52 B2 8A A5 00 00 00 00 00
0x0090| 00 00 00 00 00 00 00 00 00 00 00 44 0E 96 F7 FB
0x00A0| 9F 7B 66 29 66 D5 F8 C2 9E 5C 5E E6 74 B0 BD 66
0x00B0| 9F F9 F4 E1 A5 5A 28 6E B6 0F

[LS_Parser]: buff[2]=0x00 | 0x00 -> LS_Init()

[LS_Init].........................................START

[LS_Init]: Len=186 | Len<8 -> EXIT

[LS_Init]: RSA Key changed
[LS_Init]: BlowFish Key changed

[AuthGameGuard]_____________Packet-Prepare_____________

Client->Server, Length: 42 (0x2A)
-------------------------------------------------------
0x0000| 2A 00 07 B2 65 06 00 00 00 00 00 00 00 00 00 00
0x0010| 00 00 00 00 00 00 00 00 00 00 07 B2 65 06 00 00
0x0020| 00 00 00 00 00 00 00 00 00 00

[AuthGameGuard]______________Packet-Send_______________

[LS_Init]...........................................END

-------------------------------------------------------
Step [2]
-------------------------------------------------------

[WMSOCK_RS_EVENT]: WinSock.{FD_Read}

Server->Client, Length: 42 (0x2A)
-------------------------------------------------------
0x0000| 2A 00 0B B2 65 06 00 00 00 00 00 00 00 00 00 00
0x0010| 00 00 00 00 00 00 00 1D B7 52 B1 0D E8 00 79 7B
0x0020| 7A 90 C3 D9 40 C4 73 39 CB 05

[LS_Parser]: buff[2]=0x0B | 0x0B -> LS_GGAuth()

[LS_GGAuth].......................................START

[LS_GGAuth]: Len=42 | Len>=7 -> Move(buff[3], GGAuthResponse, 4)

[RequestAuthLogin]___________Packet-Prepare____________

Client->Server, Length: 178 (0xB2)
-------------------------------------------------------
0x0000| B2 00 00 31 5C 15 07 84 F2 13 E8 4C 8E A3 A7 8D
0x0010| F6 18 49 6F B5 EE A3 82 2C E1 42 AC 2F 48 C4 D7
0x0020| 4D 70 F0 10 5F 88 6B 63 03 5B 2D D4 09 BE B3 AB
0x0030| AD A9 BA 03 33 9E 56 1C C9 C8 53 50 84 C9 BF 3A
0x0040| E1 0E FB 3E D4 F7 BD B8 D3 CE BB 32 1A 27 8D 67
0x0050| B1 66 BC 97 36 32 0F 0C 26 03 44 CC 56 51 68 0B
0x0060| 46 30 51 05 AD 9D 3F 58 FA 8F A7 3E BF 3C D4 5B
0x0070| 49 4F 35 AF 6C 57 81 52 DD FA B8 CB 2E D2 94 91
0x0080| 86 32 81 B2 65 06 00 00 00 00 00 00 00 00 00 00
0x0090| 00 00 00 00 00 00 00 08 00 00 00 00 00 00 00 00
0x00A0| 00 00 CA 31 3B DD 00 00 00 00 00 00 00 00 00 00
0x00B0| 00 00

[RequestAuthLogin]___________Packet-Send_______________

[LS_GGAuth].........................................END

-------------------------------------------------------
Step [3]
-------------------------------------------------------

[WMSOCK_RS_EVENT]: WinSock.{FD_Read}

Server->Client, Length: 66 (0x42)
-------------------------------------------------------
0x0000| 42 00 03 4C 39 29 00 05 61 67 64 5B C7 8B 41 00
0x0010| 00 00 00 EA 03 00 00 00 00 00 00 00 00 00 00 00
0x0020| 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0030| 00 00 00 CE A8 06 85 A9 54 31 A3 9F 60 F2 B0 18
0x0040| 76 73

[LS_Parser]: buff[2]=0x03 | 0x03 -> LS_LoginOk()

[LS_LoginOk]......................................START

[LS_LoginOk]: Len=66 [Len<12 -> EXIT]

[LS_LoginOk]: Login Successful!

[RequestServerList]__________Packet-Prepare____________

Client->Server, Length: 34 (0x22)
-------------------------------------------------------
0x0000| 22 00 05 4C 39 29 00 05 61 67 64 04 00 00 00 00
0x0010| 00 00 61 4D 58 4E 00 00 00 00 00 00 00 00 00 00
0x0020| 00 00

[RequestServerList]__________Packet-Send_______________

[LS_LoginOk]........................................END


[WMSOCK_RS_EVENT]: WSAECONNABORTED (#10053) - Software caused connection abort

[L2SocketClose]: RS disconnected

supernewbie
26.05.2016, 16:05
Linux, для корректного переноса проекта на поддерживающие юникод делфи нужно также заменить PChar на PAnsiChar, Char на AnsiChar и в целом проанализировать использование строк и символов в проекте

Linux
26.05.2016, 16:47
В методе LS_LoginOk есть запись двух ключей SessionKey1_1 и SessionKey1_2 в секцию пакета для RequestServerList().


Move(buff[3],SessionKey1_1,4);
Move(buff[7],SessionKey1_2,4);
RequestServerList();



Скорее всего эти ключи "битые", значения которых получены не подходящим к моему серверу алгоритмом. Подскажите как и чем можно отловить "корректные" ключи или какой алгоритм формирования этих ключей для HighFive хроник?



procedure TfrmMain.RequestServerList();
var
data: array[0..31] of byte;
begin
FillChar(data, Length(data), 0);
data[0] := 5;
Move(SessionKey1_1, data[1], 4);
Move(SessionKey1_2, data[5], 4);
data[9] := 4;
AddCheckSumm(data, 16);
PacketSend(data, 32);
DecodeBF := TRUE;
end;



Добавлено через 1 минуту
Linux, для корректного переноса проекта на поддерживающие юникод делфи нужно также заменить PChar на PAnsiChar, Char на AnsiChar и в целом проанализировать использование строк и символов в проекте

Я в принципе так и делал, но что-то все равно проект не стартует на D2010. Я решил пока забить и довести до ума код примера на D7

ScythLab
31.05.2016, 21:34
В методе LS_LoginOk есть запись двух ключей SessionKey1_1 и SessionKey1_2 в секцию пакета для RequestServerList().
SessionKey приходит от сервера и его же нужно отправлять серверу в следующем пакете без каких-либо изменений.
Главное чтобы BF-шифрование верно отрабатывало.

к верно посоветанному
нужно также заменить PChar на PAnsiChar, Char на AnsiCharмогу добавить: заменить "string" на "AnsiString" и "Chr" на "AnsiChar" (об этом многие забывают, что может приводить к ошибкам). Можно тупо прогнать полную замену без анализа (но с опцией "только целые слова"), должно заработать.

PS. По статьям: зайди к нам на сайт, там на главной странице ссылки есть.

Linux
01.06.2016, 13:04
PS. По статьям: зайди к нам на сайт, там на главной странице ссылки есть.

Хочется поблагодарить следующих людей: TechnoWiz@rd, за базовую информацию для понимания протокола Lineage, а также KyberPrizrak за доработку исходной статьи.

Т.е. лучше изучать по статье KyberPrizrak? Его статья более расширенная? На глаз пока сложно определить отличия

UPD1
Еще один момент смущает: статья KyberPrizrak исправляющая баги (со слов KyberPrizrak) статьи TechnoWiz@rd имеет последнее редактирование 06.07.2007, в то время как статья TechnoWiz@rd была отредактирована 23.11.2007

Какой же версии описания протокола стоит доверять больше?

Linux
03.06.2016, 12:55
Прогнал через WireShark подключение L2.exe и la2_client_emu,
Используемый фильтр: tcp && tcp.port==2106 || tcp.port==7777

Собранная статистика:

1) L2.exe (L2_LS_GS_orig.png)
Для наглядности я подсветил строки с пакетами у которых Len>0, а содержимое пакетов с данными (L2Orig_data.txt) представил в спойлере с указанием номера пакета:

"21", Len=186
0000 ba 00 15 40 5b eb 3f 57 06 fa 97 ff fe e1 5b b8
0010 ee 04 e5 db 05 cc aa 80 bb 07 a7 0b f4 43 d1 ff
0020 b4 b0 b3 14 e9 33 33 47 0a c5 59 d5 fc be a2 9d
0030 0d 5a 6a 04 18 03 6c b0 dd 7f 71 55 73 a4 d3 ad
0040 c3 0c 96 7e 10 4e 1a dd 28 d1 d0 a4 0c cb 67 10
0050 be 4a 3b 4a f1 7f f2 a5 f9 03 e8 a0 93 8b be f9
0060 e5 44 e4 80 ee 10 64 48 b2 82 c6 db 5d be 03 c8
0070 59 67 ce 8f bc 20 51 59 51 28 31 8c 0f fe ce 87
0080 c3 5a 01 b0 5a f3 80 40 5a 23 7b 17 c0 f7 da dd
0090 2f 6d 58 d0 a5 6b 3b 36 2e 03 73 f0 60 be 92 07
00a0 be 09 9d ba 57 99 44 51 b3 10 8d c4 10 2a 56 a7
00b0 fa 6d 3e fc 7e fa 1f dc 32 63

"23", Len=42
0000 2a 00 30 f4 66 40 25 d2 2b 90 0b f5 8b b7 90 76
0010 58 26 0b f5 8b b7 90 76 58 26 30 f4 66 40 25 d2
0020 2b 90 0b f5 8b b7 90 76 58 26

"24", Len=42
0000 2a 00 50 37 bc c3 90 4f e8 aa 0b f5 8b b7 90 76
0010 58 26 bf c8 c7 87 60 ec 9a 47 4c 7e a7 e9 0c 33
0020 db a5 94 bd fa ef f8 6e c3 c8

"28", Len=394
0000 8a 01 74 1a 1a cb 68 8c fa 07 93 11 b0 b3 74 0b
0010 65 bb ab f9 2c b1 89 51 ef c2 50 75 1c fd b2 66
0020 20 a9 8f b1 4e f6 0c 8f 3c 3b ec 2e 65 45 8c 25
0030 66 d0 7f b4 4c 92 a5 b1 8a c1 fc 9f 92 b9 13 f7
0040 6b 12 f1 18 96 a8 c1 3b 98 a8 21 49 43 ae 60 f1
0050 d5 02 47 66 91 01 b1 77 ba ed 1e 89 35 5e 96 44
0060 2d 51 a2 8e 19 9f d7 65 7e b5 0e 9b e3 58 ce f7
0070 f5 02 f1 16 a9 a4 dc 18 98 b5 95 c5 a9 e8 d6 f1
0080 18 43 bf 41 6d de 1c 01 b2 da 0b f5 8b b7 90 76
0090 58 26 6f 66 77 93 58 d9 f8 6b 51 81 d3 0d 5f 9e
00a0 b2 e9 83 f0 db 1b ac de d4 b1 90 53 38 db 8a f4
00b0 72 6f 83 ca c6 8d b7 70 eb 3e 0e 85 40 83 07 b2
00c0 6d f4 2d 4a 9a 43 15 4b 4b 7b b4 8e 0a 0d 4e cc
00d0 d9 18 c5 c9 56 97 32 dd 0e 43 67 86 2e 3e ac 0c
00e0 c0 f4 9a 73 22 a3 d0 c4 09 e5 e4 d2 70 35 b3 29
00f0 6b 61 55 09 3b b6 b4 66 82 a5 cc f6 68 28 17 f3
0100 e8 4f d6 ce 69 78 c7 ed a0 8d a4 3a ba 2c 8f 9a
0110 ce 83 a5 7c 7c 0e 23 43 91 f4 4e ca fd fc f5 9c
0120 7d 2c 6d 7e af 8f 16 b3 29 6e da dc cf 1b 5d a6
0130 b2 a3 c6 e0 2b e8 57 29 40 89 ef 08 7a 86 68 74
0140 2d 79 e6 d1 a6 23 41 91 34 32 d8 dd d8 00 02 dc
0150 18 76 2e ed d9 b6 c7 38 e2 ed a1 e3 37 c0 94 b5
0160 67 30 07 63 44 7f c8 25 c6 b6 d6 29 8c ba 88 39
0170 ed b4 93 c8 71 b4 87 22 f2 94 37 86 b4 ad 91 c9
0180 9b 55 0b f5 8b b7 90 76 58 26

"30", Len=66
0000 42 00 d8 63 03 c5 09 19 ad e6 d5 1e 1e c4 64 d4
0010 ce 87 db a0 33 95 7a c8 33 aa 0b f5 8b b7 90 76
0020 58 26 0b f5 8b b7 90 76 58 26 0b f5 8b b7 90 76
0030 58 26 3d 98 7d 32 e0 b0 84 89 c7 86 4f 5d 86 ad
0040 12 31

"32", Len=34
0000 22 00 5d 08 0f 14 c1 90 fb 65 66 9b f7 ed b2 52
0010 80 7f 0f 84 5b 79 90 6f 42 6d 0b f5 8b b7 90 76
0020 58 26

"33", Len=130
0000 82 00 2b cd 10 1a 0b 57 af 5d fe e4 c2 ee a5 03
0010 cc 83 93 43 e3 4f 74 a1 ed b9 53 59 b3 fa 35 00
0020 7b 24 aa 20 a2 41 68 90 aa 82 f2 53 68 36 d9 bc
0030 1e 1d e9 32 4e 21 76 f2 33 61 c9 14 52 df 4b 00
0040 1c 50 0a 27 4a 06 d4 89 40 88 f8 95 45 e3 7d cf
0050 83 93 cc 0f 57 ae 3e 3b 5f a7 cd 11 f0 29 36 65
0060 70 70 0a e6 0d b2 37 50 5d 44 57 4b b9 f7 8f 8d
0070 a5 79 88 47 78 fe 81 0e 9d be c2 ad 23 6e 36 48
0080 6c e1

"46", Len=34
0000 22 00 4e 1a 23 d3 0c 53 dc 96 3d e8 c4 b3 2d f2
0010 0c c8 01 f1 b9 e1 11 a1 ce 7f 0b f5 8b b7 90 76
0020 58 26

"48", Len=26
0000 1a 00 eb c7 a5 39 33 e3 6d 69 ba 72 8e 65 72
0010 47 62 4f 40 8b c8 8d 80 c2 0c

"62", Len=1
0000 0b

"64", Len=267
0000 0b 01 0e 11 01 00 00 09 07 54 56 03 09 0b 01 07 .........TV.....
0010 02 54 54 56 07 00 02 55 56 00 51 00 53 57 04 07 .TTV...UV.Q.SW..
0020 55 08 54 01 07 01 53 00 56 55 56 01 06 05 04 51 U.T...S.VUV....Q
0030 03 08 51 08 51 56 04 54 06 55 08 02 09 51 56 01 ..Q.QV.T.U...QV.
0040 53 06 55 04 53 00 56 56 53 01 09 02 09 01 51 54 S.U.S.VVS.....QT
0050 51 09 55 56 09 03 04 07 05 55 04 06 55 04 06 09 Q.UV.....U..U...
0060 04 51 01 08 08 06 05 52 06 04 01 07 54 03 06 52 .Q.....R....T..R
0070 55 06 55 55 51 01 02 04 54 03 55 54 01 57 51 55 U.UUQ...T.UT.WQU
0080 05 52 05 54 07 51 51 55 07 02 53 53 00 52 05 52 .R.T.QQU..SS.R.R
0090 07 01 54 00 03 05 05 08 06 05 05 06 03 00 0d 08 ..T.............
00a0 01 07 09 03 51 03 07 53 09 51 06 07 54 0a 50 56 ....Q..S.Q..T.PV
00b0 02 52 04 05 55 51 02 53 00 08 54 04 52 56 06 02 .R..UQ.S..T.RV..
00c0 09 00 08 03 53 56 01 05 00 55 06 08 56 04 0d 06 ....SV...U..V...
00d0 07 52 06 07 04 0a 06 01 04 54 04 00 05 02 04 54 .R.......T.....T
00e0 00 09 52 53 05 04 01 04 05 05 01 52 51 52 0d 06 ..RS.......RQR..
00f0 51 08 09 54 53 00 0d 01 02 03 54 53 01 05 03 08 Q..TS.....TS....
0100 56 54 07 02 54 0b 06 a6 23 f4 fe VT..T...#..

"66", Len=25
0000 19 00 2e 01 7c 8f fc 5b e1 53 8a 36 01 00 00 00
0010 01 00 00 00 00 00 00 00 00

"68", Len=63
0000 3f 00 57 a8 54 6e 8f e8 62 3f f7 bf 2c 4b ea e7
0010 d6 33 4f ad 51 6f 8e af 25 60 a8 bd 2e 2f 8e ae
0020 a6 18 64 52 89 d2 33 2c 9f 80 48 31 86 ab 75 18
0030 29 be c2 e2 a0 56 69 e4 ae 35 f6 d1 42 43 e2

"70", Len=371
0000 73 01 75 fb 07 5c bd e9 63 55 9d ba 64 65 a5 c9
0010 93 04 1d 92 20 7b fb a8 4f 79 d4 f3 60 61 40 37
0020 0a 9d b1 3e a3 f8 2d 7e 9f a9 0e 29 dc dd 1d 71
0030 32 a5 b4 3b a2 f9 6a 39 c0 f6 0c 2b b8 b9 54 01
0040 19 8e f2 7d 81 da 3b 68 e2 d4 1d 3a a9 a8 0a 66
0050 57 c0 90 1f e3 b8 58 0b 81 b7 a0 32 a3 a2 dd 9b
0060 57 3f 2b 5a 59 fd 7e 3d ef e0 9c f3 c0 81 f5 e1
0070 39 88 c5 46 37 2c cd 9e 14 22 a8 4e c2 d3 72 1e
0080 2f b8 dc 26 c0 67 5c a9 cd c4 4d 6a f9 f8 59 35
0090 04 93 ef 60 9c c7 26 75 ff c9 01 26 b5 b4 15 79
00a0 48 df a3 2c d0 8b 6a 39 b3 85 4d 6a f9 f8 59 35
00b0 04 93 ef 60 9c c7 26 75 ff c9 01 26 b5 b4 15 79
00c0 48 df a3 2c d0 8b 6a 39 b3 85 4d 6a f9 f8 59 35
00d0 04 93 ae 28 d4 8f 6e 3d b7 81 db f5 66 67 73 1e
00e0 2f b8 12 9c 60 3b da 89 03 35 fd da 49 48 e9 85
00f0 b4 23 5f d0 2c 77 96 c5 4f 79 b1 96 05 04 a5 c9
0100 f8 6f 13 9c 60 3b da 89 03 35 fd da 49 48 e9 85
0110 b4 23 5f d0 2c 77 96 c5 4f 79 b1 96 05 04 a5 c9
0120 f8 6f 13 9c 60 3b da 89 03 35 9f a8 63 5b 4e 6a
0130 fb 2c 85 72 67 1a ca 95 92 e4 2c 0b 98 99 14 78
0140 49 de a3 2c d0 8b 6a 39 b3 85 4d 6a f9 f8 59 35
0150 04 93 ef 60 9c c7 26 75 ff c9 01 26 b5 b4 15 79
0160 48 df a3 2c d0 8b 6a 39 b3 85 4d 6a f9 f8 59 15
0170 6a fd 81


2) L2Connect.exe (L2_LS_GS_L2Connect.png)
Для наглядности я подсветил строки с пакетами у которых Len>0, а содержимое пакетов с данными (L2Connect_data.txt) представил в спойлере с указанием номера пакета:


"16", Len=186
0000 ba 00 fd 53 28 66 43 fa d0 6d 06 4f 9c 9a b6 c8
0010 a9 88 22 68 67 3c c4 6c 4a 06 4d 66 ea 8d 4d f5
0020 a1 1a 11 fa cf 26 7c f3 8a b9 c8 69 44 f7 c7 3e
0030 73 88 ae ab 10 c1 c7 a6 ee cd a5 28 a3 8d 41 48
0040 84 a8 d8 ec 25 e4 e4 41 99 62 59 9f 95 4e d0 5a
0050 6f b9 08 fb 1a 73 ef 4c 98 dd e4 22 79 c2 30 05
0060 bd 1e 93 b0 e7 8d f1 71 94 2f 50 94 b1 68 2e 2b
0070 38 94 b6 94 25 c2 d8 e5 cf cb 32 28 fb 39 be 42
0080 81 b8 f6 80 e5 05 9e e2 a3 55 e0 27 4b a5 2d 7a
0090 d4 5f 89 ed 17 48 fa c0 49 a7 fd fa 1d 7d 53 fa
00a0 fb a7 cb 89 6d 59 21 9a 7a d7 5a 9a 24 ea 6f 28
00b0 4c 70 da e0 89 37 34 0f 4e e5

"18", Len=42
0000 2a 00 26 ea c7 07 7c ff a6 7e 9b af 52 91 45 9d
0010 1f dd 9b af 52 91 45 9d 1f dd 26 ea c7 07 7c ff
0020 a6 7e 9b af 52 91 45 9d 1f dd

"21", Len=42
0000 2a 00 29 ec 0c 9d 2f 99 f9 a9 9b af 52 91 45 9d
0010 1f dd bb 24 d0 48 72 26 df d5 05 0e bc 51 c6 24
0020 1c 89 1f 1c 31 66 e2 90 c9 b4

"23", Len=178
0000 b2 00 4f a6 c1 1d 2b 05 4b 15 73 b7 0e 49 4c 81
0010 03 03 45 4e 52 31 76 2a 2a b1 14 66 6c d7 06 c5
0020 2d ee 33 e7 f5 06 d8 6c 05 fe 33 66 e8 6c 86 2f
0030 12 b9 2f 49 05 f5 3e c8 94 69 74 8c ff 5e 5b f1
0040 5e bc 16 a4 06 21 52 cd 21 26 4b 10 3b 14 88 6c
0050 6c c9 61 4a fe 65 c0 89 7a 87 78 bd b1 0c ad d2
0060 a2 89 56 64 ca 38 52 5d 31 0f 88 1b c8 56 14 38
0070 e2 6c 51 69 7e 46 e5 c4 cc 7f 25 95 93 43 ea 42
0080 43 13 61 3d 12 5f a7 a9 78 7f 9b af 52 91 45 9d
0090 1f dd 0e 43 8b 93 5b 58 90 98 9b af 52 91 45 9d
00a0 1f dd 8f a6 51 0f ed 6b 10 35 9b af 52 91 45 9d
00b0 1f dd

"25", Len=66
0000 42 00 bf d3 e9 0d c8 b8 4e fd 15 e5 81 8a e9 dc
0010 29 2e cb 18 de 9d 19 3b 45 3e 9b af 52 91 45 9d
0020 1f dd 9b af 52 91 45 9d 1f dd 9b af 52 91 45 9d
0030 1f dd 56 8c d5 71 e7 f3 9b 68 10 73 a9 4f e4 bf
0040 81 6a

"27", Len=34
0000 22 00 f6 f3 30 42 83 5d 6c 3c ba ef 64 dc b9 48
0010 51 69 33 90 ca ad ae c4 fb 08 9b af 52 91 45 9d
0020 1f dd



По собранной статистике можно понять поведение двух разных подключений? Где в моем случае была допущена ошибка, из-за чего до Game-Server так и не доходила программа?

ScythLab
03.06.2016, 16:33
Т.е. лучше изучать по статье KyberPrizrak? Его статья более расширенная? На глаз пока сложно определить отличияэто очень давно было, но на сколько помню у KyberPrizrak более верный протокол описан (как и по последовательности пакетов, так и по их содержимому)


Какой же версии описания протокола стоит доверять больше?доверять можно только самостоятельно проснифанному трафику, т.к. часть очень важных пакетов (RequestAuthLogin, NetPing, s:8D) могут меняться от сервера к серверу

По собранной статистике можно понять поведение двух разных подключений? Где в моем случае была допущена ошибка, из-за чего до Game-Server так и не доходила программа?
у тебя пакет RequestAuthLogin значительно меньше, чем в оригинальном клиенте, расшифровывай пакет, смотри что внутри, возможно поймешь, что нужно передавать :)

Linux
03.06.2016, 18:23
у тебя пакет RequestAuthLogin значительно меньше, чем в оригинальном клиенте, расшифровывай пакет, смотри что внутри, возможно поймешь, что нужно передавать :)

1.1) А не подскажете чем расшифровывать или по какому алгоритму?
В проекте идет метод BlowFish.pas (by xkor) с комплектом методов:
procedure Init(const Key1:String);
procedure DecodeBlock(var data:Block);
procedure EncodeBlock(var data:Block);
procedure bfDecode(var data:array of Char; len: Integer);
procedure bfEncode(var data:array of Char; len: Integer);

и пачка методов из вспомогательного юнита:
procedure AddCheckSumm(var data: array of byte; Len: Integer);
function RepairKey(key: String): String;
function RSAEncrypt(a,p,rsakey: String): String;
function AntiXOR(s: String): String;

Что из этого подойдет?

1.2) А зачем пакет расшифровывать если пакет идет на сервер?

2) Добавил сравнительную таблицу пакетов (compare_LS.png), учитывая что первые 2 байта это размер, с 3-го кодируются данные, как по размеру пакета понять какой это пакет: Init, RequestAuthLogin и т.д.??

ScythLab
05.06.2016, 19:56
1.1) А не подскажете чем расшифровывать или по какому алгоритму?
По умолчанию трафик в Ла2 шифруется с помощью BF (также для RequestAuthLogin используется RSA и для части пакетов еще какой-то xor). Ответить на вопрос "чем и как" в данном случае, к сожалению, не смогу, т.к. ответ потянет минимум на полновесную статью, а то и на главу какой-нить книги, к тому же не являюсь большим специалистом в этой области.


Что из этого подойдет?
Все из перечисленных функций как раз занимаются расшифровкой пакетов.


1.2) А зачем пакет расшифровывать если пакет идет на сервер?
Это как проход через часового: ты должен знать пароль для прохода и лучший вариант его узнать - подслушать пароль.


как по размеру пакета понять какой это пакетникак, в данном случае можно догадаться по очередности пакетов, на сколько помню очередность такая:
1) сервер присылает Init
2) клиент отвечает AuthGameGuard
3) сервер GGAuth
4) клиент RequestAuthLogin
5) сервер LoginOk либо LoginFail
6) клиент RequestServerList
7) сервер ServerList
8) клиент RequestServerLogin
9) сервер PlayOk либо PlayFail
плюс в эти пакеты могут вмешиваться NetPing и 8D
PS. В очередности могу немного ошибиться, за подробностями обращайся к статьям KyberPrizrak.

Linux
07.06.2016, 16:07
Платформа: HighFive, Ревизия протокола: c621 (согласно TechnoWiz@rd)

Основные методы:


const
MAX_PKT_SIZE = $FFFF;
var
BLOWFISH_KEY: String; { 6B60CB5B82CE90B1CC2B6C556C6C6C6C }
MainBuff: array[0..MAX_PKT_SIZE-1] of byte;
RecvPktCount: Integer;
DecodeBF: boolean;
L2BF: L2BlowFish;
L2BF_Key: String;
RSA_Key: String;
SessionID: Integer;
GGAuthResponse: Integer;
SessionKey1_1, SessionKey1_2: Integer;
SessionKey2_1, SessionKey2_2: Integer;

procedure TfrmMain.WMSOCK_RS_EVENT(var Msg: TMessage);
var
SocketError: Integer;
Len: Integer;
begin
SocketError := WSAGetSelectError(Msg.lParam);
if (SocketError<>0) then begin
if SocketError=10053 then
ToLog('[WMSOCK_RS_EVENT]: WSAECONNABORTED (#10053) - Software caused connection abort')
else
ToLog('[WMSOCK_RS_EVENT]: WS_ERROR (#number): '+IntToStr(SocketError));
ToLog('');
L2SocketClose(RS_Socket);
Exit;
end;

case WSAGetSelectEvent(Msg.lParam) of
FD_Read:
begin
FillChar(MainBuff, Length(MainBuff), 0);
Len := recv(RS_Socket, MainBuff, MAX_PKT_SIZE, 0);
inc(RecvPktCount);
LS_Parser(MainBuff, Len);
end;
FD_Close:
L2SocketClose(RS_Socket);
end;
end;
procedure TfrmMain.LS_Parser(buff: Array of Byte; Len: Integer);
var
temp: array [0..MAX_PKT_SIZE-1] of char;
s: string;
i: integer;
begin
if RecvPktCount=1 then
begin
if buff[2]=0 then
DecodeBF := False
else
DecodeBF := True;
end;

if DecodeBF then
begin
Move(buff[2],temp[0],Len-2);
L2BF.bfDecode(temp,Len-2);
if temp[0]=#0 then
begin
SetLength(s,Len-2);
for i:=0 to Len-3 do
s[i+1]:=temp[i];
s:=AntiXor(s);
for i:=0 to Len-3 do
temp[i]:=s[i+1];
end;
Move(temp[0],buff[2],Len-2);
end;

PacketView(buff,Len,True);

case buff[2] of
$00:
LS_Init(buff,Len);
$0B:
LS_GGAuth(buff,Len);
$01:
LS_LoginFail(buff,Len);
$03:
LS_LoginOk(buff,Len);
$04:
LS_ServerList(buff,Len);
$06:
LS_PlayFail(buff,Len);
$07:
LS_PlayOk(buff,Len);
end;
end;




Порядок авторизации на Login-Server:
1) Init()............................................ .......[OK] { Server->Client }


procedure TfrmMain.LS_Init(buff: array of byte; Len: integer);
begin
if Len<8 then exit;

Move(buff[3], SessionID, 4);
if Len>=155 then
begin
SetLength(RSA_key,128);
Move(buff[11],RSA_key[1],128); { RSA Key changed }
end;

if Len>=171 then
begin
SetLength(L2BF_key,16);
Move(buff[155],L2BF_key[1],16); { BlowFish Key changed }
L2BF.Init(L2BF_key);
end;
end;
{ sending RequestGGAuth packet }
RequestGGAuth();




2) RequestGGAuth()..................................[OK] { Client->Server }


procedure TfrmMain.RequestGGAuth;
var
Data: array[0..39] of byte;
begin
FillChar(data, Length(data), 0);
data[0]:=7;
Move(SessionID, data[1], 4);
AddCheckSumm(data, 24);
PacketSend(data, 40);
end;



3) LS_GGAuth()....................................... ..[OK] { Server->Client } сервер ответил, что авторизация на GG прошла успешно


procedure TfrmMain.LS_GGAuth(buff: array of byte; Len: integer);
begin
if Len>=7 then
Move(buff[3], GGAuthResponse, 4);

RequestAuthLogin(Login, Password);
end;



4) RequestAuthLogin()...............................[OK] { Client->Server } клиент отправляет Логин и Пароль


procedure TfrmMain.RequestAuthLogin(_login, _password: string);
var
data: array[0..175] of byte;
crypt_text: string;
begin
FillChar(data,Length(data),0);
crypt_text := RSAEncrypt(_login, _password, RepairKey(RSA_key));
Move(crypt_text[1], data[1], 128);
Move(GGAuthResponse, data[129], 4);
data[149]:=8;
AddCheckSumm(Data, 160);
PacketSend(Data, 176);
end;



5) LoginOK()......................................... ....[OK] { Server->Client } проверка Логина и Пароля прошла успешно, +Session_Key_1


procedure TfrmMain.LS_LoginOk(buff: array of byte; Len: integer);
begin
if Len<12 then exit;
ToLog('[LS_LoginOk]: Login Successful!');
ToLog('');
Move(buff[3],SessionKey1_1,4);
Move(buff[7],SessionKey1_2,4);

RequestServerList();
end;



6) RequestServerList()..............................[FAIL] { Client->Server }


procedure TfrmMain.RequestServerList();
var
data: array[0..31] of byte;
begin
FillChar(data, Length(data), 0);
data[0] := 5;
Move(SessionKey1_1, data[1], 4);
Move(SessionKey1_2, data[5], 4);
data[9] := 4;
AddCheckSumm(data, 16);
PacketSend(data, 32);
DecodeBF := TRUE;
end;



Далее описывать код пока не буду - до тех пунктов даже не доходит программа

7) ServerList()...................................... ....[NoNe] { Server->Client } передается список рабочих серверов


8) RequestServerLogin()............................[NoNe] { Client->Server } запрос игры на выбранном сервере


9) PlayOK().......................................... ....[NoNe] { Server->Client } подключение к Game-Server разрешено, +Session_Key_2

Лог выполнения программы - L2Connect_Log.txt

Вопросы:
1) Ну раз программа прошла GGAuth и LoginOK значит с шифрованием все нормально: иначе бы в методе LS_Parser программа не смогла бы определить тип пакета ( [LS_Parser]: buff[2]=0x0B ) и не продвинулась бы дальше по цепочке. Что не так в пакете RequestServerList? в упор не пойму, где я ошибся

supernewbie
07.06.2016, 16:56
Linux, шифрование начинается с пакета RequestServerList

Linux
07.06.2016, 17:43
Linux, шифрование начинается с пакета RequestServerList

А конкретнее: какой алгоритм, какие параметры?
В этих двух статьях я не нашел ссылки, что пакет RequestServerList как-то по особому должен шифроваться
Какие из приведенных ниже методов из этих статей надо применить к пакету?

Вспомогательные методы - Шифрация пакетов GameServer (KyberPrizrak)


char key_sc[8];
char key_cs[8];

void Encrypt(char *raw, int size) {
int temp = 0;
for (int i=0; i<size; i++) {
int temp2 = raw[i] &0xff;
raw[i] = (char)(temp2 ^ (key_cs[i&7] &0xff) ^ temp);
temp = raw[i];
}

int old = key_cs[0] &0xff;
old |= key_cs[1] << 8 &0xff00;
old |= key_cs[2] << 0x10 &0xff0000;
old |= key_cs[3] << 0x18 &0xff000000;
old += size;
key_cs[0] = (char)(old &0xff);
key_cs[1] = (char)(old >> 0x08 &0xff);
key_cs[2] = (char)(old >> 0x10 &0xff);
key_cs[3] = (char)(old >> 0x18 &0xff);
}

void Decode(char *input, int size) {
int i = 0;
int j = 0;
for(int k=0; k < size; k++) {
int i1 = input[k] & 0xFF;
input[k] = (char)(i1 ^ key_sc[j++] & 0xFF ^i);
i = i1;
if(j>7) j=0;
}
long l = key_sc[0] & 0xFF;
l |= key_sc[1] << 8 & 0xFF00;
l |= key_sc[2] << 16 & 0xFF0000;
l |= key_sc[3] << 24 & 0xFF000000;
l += size;
key_sc[0] = (char)(l & 255L);
key_sc[1] = (char)(l >> 8 & 255L);
key_sc[2] = (char)(l >> 16 & 255L);
key_sc[3] = (char)(l >> 24 & 255L);
}

void Key(char* packet, int len) {
key_sc[0] = packet[4];
key_sc[1] = packet[5];
key_sc[2] = packet[6];
key_sc[3] = packet[7];
key_sc[4] = (char)0xA1;
key_sc[5] = (char)0x6C;
key_sc[6] = (char)0x54;
key_sc[7] = (char)0x87;
for(i=0;i<8;i++) {
key_cs[i] = key_sc[i];
}
}

// вычисляет чексумму и вставляет её в пакет
// как пользоватся: add_ckecksum(CelyjPaket+2, DlinaPaketa-(2+4+4));
void add_ckecksum(unsigned char *raw, int count) {
unsigned long chksum = 0;
unsigned long ecx;
int i = 0;
for(i = 0; i < count; i += 4) {
ecx = (unsigned long)raw[i];
ecx |= (unsigned long)raw[i + 1]<<8;
ecx |= (unsigned long)raw[i + 2]<<16;
ecx |= (unsigned long)raw[i + 3]<<24;
chksum ^= ecx;
}
memcpy(raw+count, (char *)&chksum, 4);
}

void RSAKeyDecode(char* RSAKey) {
for (int i = 0; i < 64; i++) {
RSAKey[i + 64] ^= RSAKey[i];
}
for (int i = 0; i < 4; i++) {
RSAKey[i + 13] ^= RSAKey[i + 52];
}
for (int i = 0; i < 64; i++) {
RSAKey[i] ^= RSAKey[i + 64];
}
for (int i = 0; i < 4; i++) {
BYTE tmp = RSAKey[i];
RSAKey[i] = RSAKey[i + 77];
RSAKey[i + 77] = tmp;
}
}




Вспомогательные методы - Шифрация пакетов GameServer (TechnoWiz@rd)


Каждый пакет состоит из размера пакета (2 байта), типа пакета (1 байт) и блока параметров (переменная длина). В дополнение к этому, в пакетах Login-Server, в конце добавляется контрольная сумма и дополняется нулями так, чтобы размер пакета был кратен 8-ми байтам. Контрольная сумма может быть рассчитана следующей функцией:

unsigned long checksum( unsigned char *packet, int count ) {
long chksum = 0L;
for( int i = 0; i < count; i += 4 )
chksum ^= *((unsigned long *)&raw[i]);
return chksum;
};

Все последующие пакеты будут шифроваться динамическим BlowFish ключом. Пакет LoginRequest дополнительно шифруется по алгоритму RSA. Ключ состоит из следующих частей: B = 1024, E = 65537, N = передается в пакете Init. Вместе эти 3 части составляют целый RSA ключ. Байты N в пакете зашифрованы функцией:

void scrambleMod( char *n ) {
typedef unsigned char byte;
int i;

for( i=0; i<4; i++ ) {
byte temp = n[0x00 + i];
n[0x00 + i] = n[0x4d + i];
n[0x4d + i] = temp;
};

// step 2 xor first 0x40 bytes with last 0x40 bytes
for( i=0; i<0x40; i++ ) {
n[i] = (byte)(n[i] ^ n[0x40 + i]);
};

// step 3 xor bytes 0x0d-0x10 with bytes 0x34-0x38
for( i=0; i<4; i++ ) {
n[0x0d + i] = (byte)(n[0x0d + i] ^ n[0x34 + i]);
};

// step 4 xor last 0x40 bytes with first 0x40 bytes
for( i=0; i<0x40; i++ ) {
n[0x40 + i] = (byte)(n[0x40 + i] ^ n[i]);
};

};

Для расшифровки можно воспользоваться следующей функцией:

void unscrambleMod( char *n )
{
typedef unsigned char byte;
int i;

// step 4 xor last 0x40 bytes with first 0x40 bytes
for( i=0; i<0x40; i++ ) {
n[0x40 + i] = (byte)(n[0x40 + i] ^ n[i]);
};

// step 3 xor bytes 0x0d-0x10 with bytes 0x34-0x38
for( i=0; i<4; i++ ) {
n[0x0d + i] = (byte)(n[0x0d + i] ^ n[0x34 + i]);
};

// step 2 xor first 0x40 bytes with last 0x40 bytes
for( i=0; i<0x40; i++ ) {
n[i] = (byte)(n[i] ^ n[0x40 + i]);
};

for( i=0; i<4; i++ ) {
byte temp = n[0x00 + i];
n[0x00 + i] = n[0x4d + i];
n[0x4d + i] = temp;
};
};

Для шифрования пакетов Game-Server используется алгоритм XOR. Ключ XOR генерируется случайно и передается клиенту в пакете CryptInit. Функции шифрования и дешифрации приведены ниже:

/* Декодирует данные */
void decrypt( unsigned char *data, unsigned int len, unsigned char *Key ){
int temp = 0;
for( unsigned int i = 0; i < len; ++i ) {
int temp2 = data[i] & 0xff;
data[i] = (temp2 ^ (Key[i & 15] & 0xff) ^ temp);
temp = temp2;
};

int old = Key[8] & 0xff;
old |= (Key[9] << 0x08) & 0xff00;
old |= (Key[10] << 0x10) & 0xff0000;
old |= (Key[11] << 0x18) & 0xff000000;
old += len;

Key[8] = old &0xff;
Key[9] = (old >> 0x08) & 0xff;
Key[10] = (old >> 0x10) & 0xff;
Key[11] = (old >> 0x18) & 0xff;
};

/* Кодирует данные */
void encrypt( unsigned char *data, unsigned int len, unsigned char *Key ){
int temp = 0;

for( unsigned int i = 0; i < len; i++) {
int temp2 = data[i] & 0xff;
data[i] = (temp2 ^ (Key[i & 15] & 0xff) ^ temp);
temp = data[i];
};

int old = Key[8] & 0xff;
old |= (Key[9] << 0x08) & 0xff00;
old |= (Key[10] << 0x10) & 0xff0000;
old |= (Key[11] << 0x18) & 0xff000000;
old += len;

Key[8] = old &0xff;
Key[9] = (old >> 0x08) & 0xff;
Key[10] = (old >> 0x10) & 0xff;
Key[11] = (old >> 0x18) & 0xff;
};

С каждым кодированным/декодированным пакетом ключ изменяется на длину пакета, поэтому нужно использовать два отдельных экземпляра ключа – один для шифрования исходящих пакетов, второй для расшифровки входящих.
Все пакеты шифруются начиная с 3-го байта, т.е. размер пакета никогда не шифруется.




Может ктото поделиться порядком подключения на ЛС/ГС по-байтно, что делается с каждым байтом?

Может кто поделиться рабочим примером кода подключения к ЛС/ГС? можно в личку если что

supernewbie
07.06.2016, 21:49
Linux, я имел ввиду что с RequestServerList начинается дополнительное секретное шифрование, алгоритм которого накрыт виртуализатором кода. этот алгоритм был добавлен админинстрацией и как правило имеет отличия для каждого инстанса защиты, чтобы узнать алгоритм шифрования необходимо произвести обратный инжиниринг кода защиты.

Linux
08.06.2016, 10:09
чтобы узнать алгоритм шифрования необходимо произвести обратный инжиниринг кода защиты.

код защиты находится в файле - Engine.dll?

supernewbie
09.06.2016, 03:53
Linux, код защиты может находиться в любом файле связанном с клиентом игры, который содержит исполняемый код, зависит от защиты. Чаще всего в L2.exe, dsetup.dll, Engine.dll, Fire.dll.