Вход

Просмотр полной версии : L2Walker NoVerify


mOBSCENE
30.07.2009, 22:09
Кто нибудь отучивал волкер от верификации?
Я решил попробовать сделать как в WSS но чего то не хватает, не пойму чего.

Для волкера 10.9.1 я взял из patcher.ini (WSS) запись:
[L2Walker 10.9.1]
Offset1=$004168CA
Offset2=$00626B54

По адресу Offset1 находится:
004168C0 |. B8 60806100 MOV EAX,618060
004168C5 |. E8 F6F40100 CALL 00435DC0 ; L2Walker.00435DC0
004168CA |. 83F8 01 CMP EAX,1
004168CD |. 75 22 JNZ SHORT 004168F1 ; L2Walker.004168F1
004168CF |. C783 84000000>MOV DWORD PTR DS:[EBX+84],3

Тут я понял патчить нужно так:
004168C0 |. B8 60806100 MOV EAX,618060
004168C5 |. E8 F6F40100 CALL 00435DC0 ; L2Walker.00435DC0
004168CA B8 01000000 MOV EAX,1
004168CF |. C783 84000000>MOV DWORD PTR DS:[EBX+84],3

Или как делал xkor для WCorrector:
004168C0 |. B8 60806100 MOV EAX,618060
004168C5 |. E8 F6F40100 CALL 00435DC0 ; L2Walker.00435DC0
004168CA B0 01 MOV AL,1
004168CC 90 NOP
004168CD 90 NOP
004168CE 90 NOP
004168CF |. C783 84000000>MOV DWORD PTR DS:[EBX+84],3

По адресу Offset2 находится нечто похожее на структуру для:
DWORD(Pointer(Offset2)^) := DWORD(inet_addr(PAnsiChar(LoginServerIP))); //LoginServerIP:String
WORD(Pointer(Integer(Offset2)+4)^) := WORD(LoginServerPort); //LoginServerPort:Integer
WORD(Pointer(Integer(Offset2)+8)^) := WORD(ProtocolVersion); //ProtocolVersion:Integer
Извиняюсь за код выше, по другому не дочухал как можно оформить.

Вот для наглядности этот же Offset2:
00626B54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
00 00 00 00 - LoginServerIP
00 00 - LoginServerPort
00 00 - ProtocolVersion

Не ясно, что ему не хватает, бот ловит первый пакет, успешно его расшифровывает, после короткое время тупит и высыпает 3 ошибки без деталей и благополучно дохнет...
Кто может делал, что то подобное, может знает что ему не хватает то.(

xkor
03.08.2009, 16:24
mOBSCENE, а ты думаешь WSS или мой корректор валкера только патчат чтобы он нормально коннектился?)
от патча отключается верификация, но вместе с ней еще что то отвечающее за шифрование, в результате бот то ли вообще разучивается авторизоваться по ревизии с РСА то ли хз как этот вид авторизации меняется, а вот старый тип авторизации в общем то не сильно меняется, просто пакеты шифруются не только блоуфишем (кстати ключ если не изменяет память используется как при авторизации по РСА), но и под ним еще XOR'ом, как первый пакет от сервера при РСА авторизации, но тут валкер ожидает ВСЕ пакеты с ксором и сам выдаёт тоже с ним.., короче надо перешифровывать все пакеты чтобы сервак понял бота и наоборот)

mOBSCENE
16.09.2009, 20:15
mOBSCENE, а ты думаешь WSS или мой корректор валкера только патчат чтобы он нормально коннектился?)

Было такое мнение..)

от патча отключается верификация, но вместе с ней еще что то отвечающее за шифрование, в результате бот то ли вообще разучивается авторизоваться по ревизии с РСА то ли хз как этот вид авторизации меняется, а вот старый тип авторизации в общем то не сильно меняется, просто пакеты шифруются не только блоуфишем (кстати ключ если не изменяет память используется как при авторизации по РСА), но и под ним еще XOR'ом, как первый пакет от сервера при РСА авторизации, но тут валкер ожидает ВСЕ пакеты с ксором и сам выдаёт тоже с ним.., короче надо перешифровывать все пакеты чтобы сервак понял бота и наоборот)

На самом деле все оказывается повеселей блин.(

>>но и под ним еще XOR'ом, как первый пакет от сервера при РСА авторизации

А при первом пакете от сервера он должен быть 2 раза XOR'ом зашифрован под BF ?

Кстати не у кого не завалялась та сама функция что по XOR зашифровывает? а то в наличии есть только для расшифровки "AntiXOR" зовут вроде в la2_client_emu ..)

alexteam
16.09.2009, 20:34
(111 xor 222) xor 222 = 111
не так ли ?

dmitry501
17.09.2009, 06:00
Вот держи

function TPacket.doXORdec(data: PChar; const data_len: cardinal): cardinal;
var
pos: integer;
edx, ecx: cardinal;
begin
ecx := PCardinal(@data[data_len - 8])^;
pos := data_len - 12;
while pos >= 4 do begin
edx := PCardinal(@data[pos])^;
edx := ecx xor edx;
ecx := ecx - edx;
PCardinal(@data[pos])^ := edx;
dec(pos, 4);
end;
Result:=ecx;
end;

function TPacket.doXORenc(data: PChar; const data_len, key: cardinal): cardinal;
var
pos, edx, ecx: cardinal;
begin
ecx := PCardinal(@key)^;
pos := 4;
while pos < data_len - 8 do begin
edx := PCardinal(@data[pos])^;
ecx := ecx + edx;
edx := edx xor ecx;
PCardinal(@data[pos])^ := edx;
inc(pos, 4);
end;
PCardinal(@data[pos])^ := ecx; // вписываем новый ключ
Result := ecx;
end;


(с) Sh00rGo wss 2.7