Новичок
Регистрация: 01.02.2009
Сообщений: 8
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
|
шифровка/дешифровка траффика давно решена в волкере. на каждом сервере существует , так называемый , Token - открытый ключ шифрования траффика и в самом боте эта муть давно работает ... так что на серверах, где разрешен торговый бот админы сами выкладывают Token для народа
Наткнулся в WPF на одну занимательную штуку - олгоритмы шифрования/дешифрования траффика. решил выложить ( может кто разберется)
Оффтоп
Код HTML:
library tstdll5;
uses FastMM4, SysUtils, Windows;//, Classes;
type
HWND = type LongWord;
DWORD = LongWord;
UINT = LongWord;
// демонстрационная DLL tstdll5.dll используется в скрипте 'demo_la2-endecGS-5.fsc'
// содержит ф-ции автоопределения трафика LA2 и де/кодирование трафика LA2 GS.
//
var /// ВНИМАНИЕ!!! Глобальные переменные ОБЩИЕ для всех соединений использующих эту DLL !!!
global_i : integer;
global_j : integer;
// ...
function StrPosLen(const Str1, Str2: PChar; Str1Len, Str2Len: dword): PChar; assembler;
// StrPosLen - ищет вхождение одного массива байт в другом, с заданной длиной.
// Str2 ищется в Str1
asm
// EAX - Str1, EDX - Str2, ECX - Str1Len, str2 - sub
PUSH EDI
PUSH ESI
PUSH EBX
OR EAX,EAX // Str1
JE @@2 // если строка Str1 пуста - на выход
OR EDX,EDX // Str2 - подстрока
JE @@2 // если строка Str2 пуста - на выход
MOV EBX,[ESP+14H] // Str2Len - подстрока
SUB ECX,EBX // ECX == разница длин строк : Str1 - Str2
JBE @@2 // если длина подсроки больше длины строки - выход
DEC EBX // Str2Len-1
MOV EDI,EAX // EDI - начало строки Str1
@@1: MOV ESI,EDX // ESI - смещение строки Str2
LODSB // загужаем первый символ подстроки в AL
REPNE SCASB // ищем этот символ в строке EDI
JNE @@2 // если символ не обнаружен - на выход
MOV EAX,ECX // сохраним разницу длин строк
PUSH EDI // запомним текущее смещение поиска
MOV ECX,EBX
REPE CMPSB // побайтно сравниваем строки
POP EDI
MOV ECX,EAX
JNE @@1 // если строки различны - ищем следующее совпадение первого символа
LEA EAX,[EDI-1]
JMP @@3
@@2: XOR EAX,EAX
@@3: POP EBX
POP ESI
POP EDI
end;
function Trafic_Detector(pc1 : pchar; pc1_le : integer) : integer; stdcall;
var
_gAbsNumPkt, TrafType, tPDecode, tKeyType, Protocol, isLS, isGS : pInteger;
_dFromServ : boolean;
_key, _Buff : pchar;
_key_le : integer; // размер буфера ключа
_key_sz : pInteger; // указатель на реальный размер ключа (в буфере)
_Buff_le : integer; // размер буфера пакета
ss : shortstring;
i : integer;
begin
// Внимание! не путайте переменные с указателями на переменные =)
result := -1;
try
// установим указатели на соответствующие переменные
// (FormatPck('dddddddbdcb',[_gAbsNumPkt, TrafType, tPDecode, tKeyType, Protocol, isLS, isGS, _kci, i2 , _dFromServ, _dBuff]);)
//
_gAbsNumPkt := pInteger(pc1); // указатели на переменные...
TrafType := pInteger(pc1+4);
tPDecode := pInteger(pc1+8);
tKeyType := pInteger(pc1+12);
Protocol := pInteger(pc1+16);
isLS := pInteger(pc1+20);
isGS := pInteger(pc1+24);
_key_le := pInteger(pc1+28)^; // указатель на размер буфера ключа
_key := pc1+32; // указатель на буфер ключа
_key_sz := pInteger(pc1+32+_key_le); // указатель на размер ключа в буфере ключа
_dFromServ := pByte(pc1+32+_key_le+4)^ <> 0;
_Buff_le := pInteger(pc1+32+_key_le+5)^; // размер буфера пакета (тут рамер буфера пакета равен фактическому размеру пакета, так как изменять сам пакет не будем ...)
_Buff := pc1+32+_key_le+9; // указатель на буфер пакета
//
// Определим тип трафика (в этом примере нас интересует только LA2)
//
if (TrafType^ = 0) and (_gAbsNumPkt^ = 1) then begin
case _Buff_le of
$0B,$9B,$AB,$BA: begin
TrafType^:= 2; // LA2
isLS^ := 1; // LS
if _Buff_le = $0B then tKeyType^ := 1 else tKeyType^ := 2; // это для LS, пока не потребуется
end;
$107: begin
TrafType^ := 2; // LA2
isGS^ := 1; // GS
end;
$07: begin
TrafType^ := 2; // LA2
isGS^ := 2; // GS
end;
else if _Buff_le >= $107 then begin // более надежный способ определить LA2 GS
ss := #$05#$52#$05#$54#$07#$51#$51#$55#$07#$02#$53#$53#$00#$52#$05#$52;
if StrPosLen(_Buff, @ss[1], _Buff_le, 16) <> nil then begin
// если найдена строчка '.R.T.QQU..SS.R.R' (древний рим епть =) тогда это гейм сервер ла2.
TrafType^ := 2; // LA2
isGS^ := 2; // GS
end;
end;
end;
//
if isGS^ > 0 then Protocol^ := pInteger(_Buff+3)^; // берем номер протокола GS
end;
//
// определим ключ GS:
//
if (_gAbsNumPkt^ = 2) then
if (TrafType^ = 2) and (isGS^ > 0) and _dFromServ then begin
if (_Buff_le = 12) then tKeyType^ := 1; // 12 байтный пакет - тип 1. GSDecodeJ (90% l2j)
if (_Buff_le = 16) then tKeyType^ := 2; // 16 байтный пакет - тип 2. GSDecode (sub-off servers)
if (_Buff_le = $1A) then tKeyType^ := 3; // часть фри серверов Interlude
if (_Buff_le = $1C) then tKeyType^ := 3; // часть фри серверов Interlude
if (_Buff_le = $15) then tKeyType^ := 3; // официальные сервера Interlude (на данный момент)
if (tKeyType^ > 0) and (_key_le >= 16) then begin
CopyMemory(_key, _Buff+4, 16);
if tKeyType^ < 3 then begin
ss := #$A1#$6C#$54#$87;
CopyMemory(Pchar(_key+4), @ss[1], 4); // C4/C5/псевдо интерлюд.
_key_sz^ := 8;
end;
if tKeyType^ = 3 then begin
ss := #$C8#$27#$93#$01#$A1#$6C#$31#$97;
CopyMemory(_key+8, @ss[1], 8); // интерлюд.
_key_sz^ := 16;
end;
end;
end;
result := pc1_le;
except
result := -2;
end;
end;
function DeXorGS(buff : pchar; buff_sz : integer; key : pchar; key_sz, keytype : integer) : integer; stdcall;
var i,j : integer;
b1,b2 : byte;
begin
result := 0;
// стандартный алгоритм XOR декодирования GS la2
if (key_sz = 0) or (buff_sz = 0) then exit;
b1 := 0; j := 0;
for i := 2 to buff_sz-1 do begin
b2 := byte(buff[i]);
buff[i] := char(b2 xor byte(key[j]) xor b1);
b1 := b2;
Inc(j,1);
if j >= key_sz then j := 0;
end;
case keytype of
1: if key_sz > 3 then Inc(pint(key)^, buff_sz-2);
2: if key_sz > 7 then Inc(pint64(key)^, buff_sz-2);
3: if key_sz > 15 then Inc(pint64(key+8)^, buff_sz-2);
end;
end;
function EnXorGS(buff : pchar; buff_sz : integer; key : pchar; key_sz, keytype : integer) : integer; stdcall;
var i,j : integer;
b1 : byte;
begin
result := 0;
// стандартный алгоритм XOR декодирования GS la2
if (key_sz = 0) or (buff_sz = 0) then exit;
b1 := 0; j := 0;
for i := 2 to buff_sz-1 do begin
buff[i] := char((byte(buff[i]) xor byte(key[j]) xor b1));
b1 := byte(buff[i]);
Inc(j,1);
if j >= key_sz then j := 0;
end;
case keytype of
1: if key_sz > 3 then Inc(pint(key)^, buff_sz-2);
2: if key_sz > 7 then Inc(pint64(key)^, buff_sz-2);
3: if key_sz > 15 then Inc(pint64(key+8)^, buff_sz-2);
end;
end;
{экспортируем ф-ции}
exports Trafic_Detector, DeXorGS, EnXorGS;
begin
end.
может, получится соорудить нечто подобное для пакет хака.
ЗЫ: желательно с привязкой к токену сервера , тогда головняков с дешифровкой трафика не будет вообще
|