PDA

Просмотр полной версии : Снова про Init как проверить правельность результата?


Brave
13.01.2011, 01:38
Я новичок на этом форуме, поэтому хочется всех поприветствовать!
Надеюсь найти здесь ответы на возникающие сложности, поиском пользоваться умею, но к сожалению не решил свои проблемы.


Для экспериментов с пакетами, установил java логин-сервер от L2Base для Interlude на локалке.

Пишу на Delphi 7.(I love Pascal :) )
(На работе программирую на редкостной гадости под названием Х++)

Привожу код моего консольного приложения:
(Куски брал с похожих тем)

type
PFixPck = ^TFixPck;
TFixPck = packed record case Integer of
0:(ch: array[Word] of Char);
1:(bt: array[Word] of Byte);
2:(size: Word;
id: Byte;
dbt: array[0..65532] of Byte);
end;
var
ws: TWSAData;
Sock:TSocket;
Addr_in: sockaddr_in;
size: integer;
DataB:TFixPck;
i:integer;

procedure LoginXORDecrypt(var xpck: TFixPck);
var
i,k: Integer;
begin
i:=xpck.size-8;
k:=PInteger(@xpck.ch[i])^;
while i>=6 do begin
PInteger(@xpck.ch[i])^:=PInteger(@xpck.ch[i])^ xor k;
k:=k-PInteger(@xpck.ch[i])^;
i:=i-4;
end;
end;

function GetSocketData(Socket: TSocket; var Data; const Size: Word): Boolean;
var
Position: Word;
Len: Integer;
DataB: array[0..$5000] of byte absolute Data;
begin
Result:=False;
Position:=0;
while Position<Size do
begin
Len:=recv(Socket,DataB[Position],1,0);
if Len<=0 then Exit;
Inc(Position, Len);
end;
Result:=True;
end;


begin
if WSAStartup($202,ws)<>0 then
begin
Writeln('Error1!');
exit;
end;
Sock:=WinSock.socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);
if Sock= INVALID_SOCKET then
begin
Writeln('Oshibka sozdania soketa!');
exit;
end;
FillChar(Addr_in, SizeOf(sockaddr_in), 0);
Addr_in.sin_family:= AF_INET;
Addr_in.sin_addr.s_addr := inet_addr('127.0.0.1');
Addr_in.sin_port := HToNS(2106);
if connect(Sock, Addr_in, SizeOf(Addr_in))=0 then
begin
WriteLn('Connect!!! =)');
DataB.size:=186;
write(inttostr(DataB.size));
GetSocketData(Sock,DataB.dbt,186);
for i:=0 to 186 do
begin
Write(IntToHex(ord(DataB.ch[i]),2));write(' ')
end;
LoginXORDecrypt(DataB);
WriteLn('=');
for i:=0 to 186 do
begin
Write(IntToHex(ord(DataB.ch[i]),2));write(' ')
end;
end
else
begin
WriteLn('No connect!!!');
end;

{ TODO -oUser -cConsole Main : Insert code here }
end.


Доп.Вопрос: Какой тег подкрашивает Delphi код?

Вкратце:
1.Создаю сокет
2.Подключаюсь
3.Читаю буфер
4.Вывожу результат
5.XOR (РазКСОРиваю)
6.Вывожу результат.

Вот что получается:

RAW представление:
BA 00 00 BA 00 0D CA D7 70 99 75 78 3D F5 C6 F5 D2 4D 40 BC D8 84 98 37 8A 98
7F 0D 8D 99 3C 83 1F 29 B8 EC DF 4C 39 85 C9 66 3B B1 E2 97 79 C5 34 5B 0A 4C 7
9 EC 17 0E 33 6E 98 FF EE AE 88 3A 97 3C 36 A1 63 B8 27 54 79 4E BE 67 AC C8 18
71 25 24 00 4A 10 B5 7E 70 1D 85 D5 CA 93 A2 F7 53 78 4B CF AD 80 1B 87 4E 9C C0
66 4B AF C7 CF 08 A1 FE F3 C0 96 21 7D 42 50 D5 9B 2D DB CD 51 04 CD B8 96 C0 5
2 3D 5C 07 97 2A 58 E6 29 7F 6D E8 10 D8 7D 18 75 77 6D F8 B8 A1 2D 90 99 35 00
36 13 E1 DC 83 F4 67 8D EE 5A E3 07 87 54 E3 81 DF 23 E0 AD 6E 0C B0 F3 00 1F AD
F6
=========LoginXORDecrypt=============
BA 00//размер
00 //тип пакета(Init)
BA 00 0D 21// ID сессии
F0 AD 0D CF//Ревизия протокола
//Далее не осилил, так как ненашел нормального описания см. ниже.
AA F0 B0 86 91 0A 36 38 6D A1 EC 71 3B 09 1F 4B
70 77 4F 44 97 B2 ED 61 6E 19 D6 F2 CB 17 F7 BC 73 0E C3 7F 01 6C 87 03 46 96 09 8F 02 26 C4 E0 F9 7D 82 7A 9A 4A 8B EB 12 DB 05 B5 F1 E2 F9 56 69 89 2C 18 BB CA 70 EA 45 15 30 CB 39 8E D8 BA 64 E4 6B CC F6 07 51 4A 94 FC A4 A1 8B F2 83 A9 43 30 7A 20 37 D7 21 86 7E 59 73 06 67 E5 E9
54 D6 97 5A C3 44 E0 53 42 C4 3B EB 64 21 7F 3A B5 F1 26
37 C0 FF 05 6F 68 C0 32 E8 BE 97 3F 55 2D 5A 8B AA 2C B7
80 BF 59 95 B2 04 76 6C 0E 40 86 3A
88 BC 2C B1 2F 50 00
00 00 00 F3
00 1F AD F6


Описания пакета Init которые мне удалось найти:
[I]1.http://fursoffers.narod.ru/Packets.htm#Init

Сразу появляется вопрос:
По алгоритму XOR который я взял с форума, XOR ключ находиться не в последних 4 байтах а в пред последних 4 байтах.(Номер первого байта ключа (186-8=178)) Как правильно его брать?

2.http://www.la2kings.ru/la2bot/packets.html#Init
Это описание вообще не понятное. поэтому прошу объяснить, что есть что в пакете.
Не могли бы вы мне пояснить от чего зависит место расположения XOR ключа в пакете Init от сервера?

Как проверить, правильно ли я расксорил пакет?

Возможно я вообще все не так делаю =))

alexteam
13.01.2011, 01:45
http://l2ext.com/files/l2EmuSrc.rar

Добавлено через 2 минуты
Какой тег подкрашивает Delphi код?
[ HIGHLIGHT="delphi" ] лишние пробелы - убрать. [ /HIGHLIGHT ]

Brave
13.01.2011, 01:59
Скачал, скомпилировал, удачно подключился, есть чем проверять свои наработки, очень рад :p) Это просто супер!!!
Вопрос: А это только для Interlude? Если нет, то огласите пожалуйста весь список поддерживаемых хроник.
P.S. "Очередная хрень =)" -> Очень полезная хрень для новичков.;)

alexteam
13.01.2011, 02:07
работает для ГФ+
ил, возможно.
единственное что там надо править - это размер блока в пакете с списком серверов. (кажется 21 для ГФ и 23 для грации, или наоборот. непомню.)

Brave
14.01.2011, 02:18
Вот на вопрос про пакет Init для разных хроник я не получил ответа.
Какая структура для каких хроник? Как сделать коннектор универсальным, чтобы он по пакету Init узнавал что за хроники? Конечно есть другой выход-выставлять хроники опционально.

axlexteam, еще раз спасибо за исходники, очень продвинулся.:cool:

Как из клиента выдрать статический BlowFish ключ?

guplen
14.01.2011, 03:16
Как из клиента выдрать статический BlowFish ключ?

Зачем его выдирать из клиента, если он известен и написан на том сайте, который ты написал в 1 сообщении.

По умолчанию статический ключ -
6B 60 CB 5B 82 CE 90 B1 CC 2B 6C 55 6C 6C 6C 6C.

Brave
14.01.2011, 15:41
Собственно разобрав пример который мне прислал уважаемых alexteam я составил алгоритм действий, который опишу ниже для того чтобы знатоки
откорректировали недочёты, если они есть, и тема была полезна для других пользователей.
Собствено алгоритм:
Сразу хочется сказать что размер пакета отрезаеться при его получении и добаляеться при его отправке
то есть пакет состоит из структуры:
packet=record
size:word//размер пакета
Data:array [0..size]of byte;//собственно данные с которыми мы проводим операции.
end;

1. Создаём соединение с логин сервером.
2. Принимаем пакет Init.
2.1 Расшифровываем Data при помощи ХОR ключа содержащегося в последних 4-х байтах
2.2 Расшифровываем Data статическим ключом BlowFish.
2.3 Запоминаем SessionID 4 байта. RSA ключ 128 байт. Новый BlowFish ключ 16 байт.
3.Отправляем пакет RequestGGAuth c SessionID, который взяли из пакета Init.Добавили ЧекСумму.Зашифровали BlowFish.
4.Приняли ответ GGAuth от сервера.
4.1 Расшифровали его BlowFish.
4.2 Запоминаем GGAuthResponse
Теперь у нас есть все данные чтобы авторизироваться на сервере.
5. Зашифровываем логин и пароль при помощи RSA.
5.1 Формируем пакет RequestAuthLogin:128 байт Зашифрованного логина и пароля.В 129 байт пишем 4 байта с GGAuthResponse.
В 149 байт ставим 8. Добавляем чек сумму 160 байт.
5.2 Зашифровываем пакет BlowFish из пакета Init.
6. Отправляем.
7.Принимаем, все ли правильно сделали. =)

Жду ответов. Так же хочется узнать об изменениях этого алгоритма в зависимости от хроник.

А еще чуть не забыл спросить. Что такое Ревизия?? Я это слово встречал на сборках серверов, а есть ли она у клиента?

xkor
15.01.2011, 23:10
2.1 Расшифровываем Data при помощи ХОR ключа содержащегося в последних 4-х байтах
2.2 Расшифровываем Data статическим ключом BlowFish.
по моему наоборот, сначала BlowFish'ем дешифруем а потом уже XOR

Добавлено через 12 минут
Что такое Ревизия??это порядковый номер под который присвоен сорцам текущей версии при заливке в систему контроля версий

Кислый
08.02.2011, 23:05
у меня примерно из этой же оперы вопрос:

init по версии 785a должен содержать 11 байт.
например:
Сервер, Length: 11 (0x0B)
-------------------------------------------------------
0x0000| 0B 00 00 9C 77 ED 03 5A 78 00 00
-------------------------------------------------------
вроде все верно. но вот что меня заинтересовало: в одном из серверов я увидел это:

Сервер, Length: 155 (0x9B)
*-------------------------------------------------------*
0x0000| 9B 00 00 FD 8A 22 00 5A 78 00 00 E5 FB 6D E3 DE
0x0010| D5 FC 45 42 B8 84 01 26 73 C3 FF BD 0B 32 FA B6
0x0020| F9 CA 0E 48 0F 94 7A CC C1 AF FE B5 76 5C B0 9D
0x0030| 6E 5A 73 EE 77 12 67 47 1C 78 D2 9B 22 D1 38 90
0x0040| 60 82 53 14 1C B2 04 D6 75 29 47 08 56 8C 81 63
0x0050| 14 93 B1 47 2C B8 F9 23 DB 09 8C 87 56 36 02 92
0x0060| BA 25 57 51 9E 33 8D 40 6E E0 3D A7 CA 9A 69 D6
0x0070| 07 AE 60 25 5C 47 C8 55 5A 07 83 E5 B8 0B 85 FF
0x0080| 62 66 07 B9 D4 E4 D3 65 DD 3C F4 00 00 00 00 00
0x0090| 00 00 00 00 00 00 00 00 00 00 00

155 байт. Третьи хроники.

Почему так ?

Добавлено через 20 минут
согласно вот этому:
procedure LS_init(buff: array of byte; Len: integer);
begin
ToLog('********* LS_init ************');
ToLog('');
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);
ToLog('RSA Key changed :');
end;
if Len>=171 then begin
SetLength(bf_key,16);
Move(buff[155],bf_key[1],16);
bf.Init(bf_key);
ToLog('BlowFish key changed');
end;
//sending AuthGG packet
AuthGameGuard;
end;
в 785a возможно RSA шифрование логина и пароля.