PDA

Просмотр полной версии : Все сначала...


Zergatul
27.02.2008, 14:26
Вообщем решыл сделать некое подобие бота для интерлюда. Из алгоритмов шыфрования я знаю только обычное ксорирование, никогда не работал с чем-то другим. При конекте к логин серверу как я понял мне пришол пакет Init длиной $AB (знач используется ревизия протокола c621). Обясните плиз что мне извлекать из него, как шыфровать следующие пакеты. И ище если можна обьясните плиз с чексумой.
Где-то было написано : в пакетах сервера авторизации, в конце добавляется контрольная сумма и дополняется нулями так, чтобы размер пакета был кратен 8-ми байтам.
Где-то здесь на форуме xkor давал пример:
procedure AddChecksum(var data:array of char; position: Word);
var
i:Word;
begin
for i := 0 to (position div 4)-1 do
PCardinal(@data[position])^:=PCardinal(@data[position])^ xor PCardinal(@data[i*4])^;
end;
и написал как использовать его:
pck:=HexToString('26 00 02 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00');
AddChecksum(pck[3],Length(pck)-8-2);
В итоге результат - 26 00 '02 00 00 00' '00 00 00 00' '00 01 00 00' '00 00 00 00' '02 01 00 00' '00 00 00 00'
Тоесть процедура проходится по скроке и каким-то образом считает что-то, что вовсе не похоже на сумму :)
Здесь у меня вопрос: AddChecksum надо использовать уже после дополнения пакета нулями, или раньше ? (Вопрос возможно глупый, но с примера я так и не понял этого. Возможно pck, это уже пакет, дополненый 8 нулевыми байтами - если это так, тогда мне все понятно).

Zergatul
27.02.2008, 14:26
Вообщем решыл сделать некое подобие бота для интерлюда. Из алгоритмов шыфрования я знаю только обычное ксорирование, никогда не работал с чем-то другим. При конекте к логин серверу как я понял мне пришол пакет Init длиной $AB (знач используется ревизия протокола c621). Обясните плиз что мне извлекать из него, как шыфровать следующие пакеты. И ище если можна обьясните плиз с чексумой.
Где-то было написано : в пакетах сервера авторизации, в конце добавляется контрольная сумма и дополняется нулями так, чтобы размер пакета был кратен 8-ми байтам.
Где-то здесь на форуме xkor давал пример:
procedure AddChecksum(var data:array of char; position: Word);
var
i:Word;
begin
for i := 0 to (position div 4)-1 do
PCardinal(@data[position])^:=PCardinal(@data[position])^ xor PCardinal(@data[i*4])^;
end;
и написал как использовать его:
pck:=HexToString('26 00 02 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00');
AddChecksum(pck[3],Length(pck)-8-2);
В итоге результат - 26 00 '02 00 00 00' '00 00 00 00' '00 01 00 00' '00 00 00 00' '02 01 00 00' '00 00 00 00'
Тоесть процедура проходится по скроке и каким-то образом считает что-то, что вовсе не похоже на сумму :)
Здесь у меня вопрос: AddChecksum надо использовать уже после дополнения пакета нулями, или раньше ? (Вопрос возможно глупый, но с примера я так и не понял этого. Возможно pck, это уже пакет, дополненый 8 нулевыми байтами - если это так, тогда мне все понятно).

NLObP
27.02.2008, 19:09
Контрольная сумма считается для пакета начиная с кода типа пакета (исключаем первые два байта длины пакета) и заканчивая адресом предшествующим началу контрольной суммы.
procedure build_RequestServerList();
begin
{RequestServerList
Формат:
1A 00 // Длина
05 // Тип
XX XX XX XX // SessionKey1_FistPart из LoginOk
XX XX XX XX // SessionKey1_SecondPart из LoginOk
04 00 00 00 00 00 00
XX XX XX XX // чексумма 00 00 00 00}
InitPkt; //инициализируем пакет
WriteW($1a);//длина пакета 26
WriteID($05);
WriteD(SessionKey1_FistPart);
WriteD(SessionKey1_SecondPart);
WriteB($04);
//WriteW($0);
//WriteB($0);
pos:=18; WriteD(pkt_ckecksum(2,16)); // чексумма
//WriteD($0); //"\x00\x00\x00\x00";
//к.сумма считается для блока начиная со смещ. 2, длиной 16 байт
//add_ckecksum(2,16);
end;

NLObP
27.02.2008, 19:09
Контрольная сумма считается для пакета начиная с кода типа пакета (исключаем первые два байта длины пакета) и заканчивая адресом предшествующим началу контрольной суммы.
procedure build_RequestServerList();
begin
{RequestServerList
Формат:
1A 00 // Длина
05 // Тип
XX XX XX XX // SessionKey1_FistPart из LoginOk
XX XX XX XX // SessionKey1_SecondPart из LoginOk
04 00 00 00 00 00 00
XX XX XX XX // чексумма 00 00 00 00}
InitPkt; //инициализируем пакет
WriteW($1a);//длина пакета 26
WriteID($05);
WriteD(SessionKey1_FistPart);
WriteD(SessionKey1_SecondPart);
WriteB($04);
//WriteW($0);
//WriteB($0);
pos:=18; WriteD(pkt_ckecksum(2,16)); // чексумма
//WriteD($0); //"\x00\x00\x00\x00";
//к.сумма считается для блока начиная со смещ. 2, длиной 16 байт
//add_ckecksum(2,16);
end;

Zergatul
28.02.2008, 21:10
Контрольная сумма считается для пакета начиная с кода типа пакета (исключаем первые два байта длины пакета) и заканчивая адресом предшествующим началу контрольной суммы.

Спс, с чексумой все ясно 8)

Добавлено спустя 1 день 1 час 3 минуты 53 секунды:
Как я вижу всем влом отвечать на мои вопросы, ибо почитав немного олчитс.ру я понял что всё намного сложнее чем кажется... В каждого ПТС сервера свои приколы при логине

Zergatul
28.02.2008, 21:10
Контрольная сумма считается для пакета начиная с кода типа пакета (исключаем первые два байта длины пакета) и заканчивая адресом предшествующим началу контрольной суммы.

Спс, с чексумой все ясно 8)

Добавлено спустя 1 день 1 час 3 минуты 53 секунды:
Как я вижу всем влом отвечать на мои вопросы, ибо почитав немного олчитс.ру я понял что всё намного сложнее чем кажется... В каждого ПТС сервера свои приколы при логине

dmitry501
29.02.2008, 10:11
ага, и не только при логине :) у более-менее продвинутых серверов, которые могут позволить потратить деньги на сервер, в гейм-сервере заморочек не меньше.

Zergatul
02.03.2008, 02:09
Дайте кто-то нормальную и простенькую прогу, что бы просто отображала все пакеты.... интересно посмотреть что происходит с клиентом при конекте к ЛС.