Я новичок на этом форуме, поэтому хочется всех поприветствовать!
Надеюсь найти здесь ответы на возникающие сложности, поиском пользоваться умею, но к сожалению не решил свои проблемы.
Для экспериментов с пакетами, установил java логин-сервер от L2Base для Interlude на локалке.
Пишу на Delphi 7.(I love Pascal
)
(На работе программирую на редкостной гадости под названием Х++)
Привожу код моего консольного приложения:
(Куски брал с похожих тем)
delphi Код:
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 от сервера?
Как проверить, правильно ли я расксорил пакет?
Возможно я вообще все не так делаю =))