PDA

Просмотр полной версии : [Помогите!] newxor.dll.


HARDporno[™]
04.04.2011, 23:45
Здравствуйте уважаемые пользователи,у меня вопрос к знающим людям.Создал тему так как на форуме не нашел вопросов а главное ответов по данной тематике.
Так вот собственно как написать newxor.dll для жилаемого сервера?Искал инфу по нету но,только нашел непонятные для меня строчки.
Пример :
вот комплект newxor.dpr и coding.pas от l2ph v.3.4.x
Распаковать из архива newxor.dpr и coding.pas в любую папку
Устанавливаешь Делфи 7 или 2007
Открываешь newxor.dpr
Правишь код под свой сервак
Компилишь
И еще одно вот это исходник для стандартной шифрации от L2phx 3.4,значит если пакеты видны то это так называемая стандартная шифрация?
library newxor;

uses
windows,
Coding in 'Coding.pas';

type
TXorCoding = class(TCodingClass)
private
keyLen: Byte;
public
constructor Create;
procedure InitKey(const XorKey; Interlude: Boolean = False);override;
procedure DecryptGP(var Data; const Size: Word);override;
procedure EncryptGP(var Data; const Size: Word);override;
end;

TXorCodingOut = class(TCodingClass)
private
keyLen: Byte;
public
constructor Create;
procedure InitKey(const XorKey; Interlude: Boolean = False);override;
procedure DecryptGP(var Data; const Size: Word);override;
procedure EncryptGP(var Data; const Size: Word);override;
end;

function CreateCoding(Value:PCodingClass): HRESULT; stdcall;
begin
Result:=0;
try
Value^:=TXorCoding.Create;
except
Result:=-1;
Value^:=nil;
end;
end;

function CreateCodingOut(Value:PCodingClass): HRESULT; stdcall;
begin
Result:=0;
try
Value^:=TXorCodingOut.Create;
except
Result:=-1;
Value^:=nil;
end;
end;

exports CreateCoding, CreateCodingOut;

{ TXorCoding }

constructor TXorCoding.Create();
begin
FillChar(GKeyS[0],SizeOf(GKeyS),0);
FillChar(GKeyR[0],SizeOf(GKeyR),0);
keyLen := 0;
End;

procedure TXorCoding.DecryptGP(var Data; const Size: Word);
var
k:integer;
pck:array[0..$4FFF] of Byte absolute Data;
begin
for k:=size-1 downto 1 do
pck[k]:=pck[k] xor GKeyR[k and keyLen] xor pck[k-1];
if size<>0 then pck[0]:=pck[0] xor GKeyR[0];
Inc(PLongWord(@GKeyR[keyLen-7])^,size);
end;

procedure TXorCoding.EncryptGP(var Data; const Size: Word);
var
i:integer;
pck:array[0..$4FFF] of Byte absolute Data;
begin
if size<>0 then pck[0]:=pck[0] xor GKeyS[0];
for i:=1 to size-1 do
pck[i]:=pck[i] xor GKeyS[i and keyLen] xor pck[i-1];
Inc(PLongWord(@GKeyS[keyLen-7])^,size);
end;

procedure TXorCoding.InitKey(const XorKey; Interlude: Boolean = False);
const
KeyConst: array[0..3] of Byte = ($A1,$6C,$54,$87);
KeyIntrl: array[0..7] of Byte = ($C8,$27,$93,$01,$A1,$6C,$31,$97);
var key2:array[0..15] of Byte;
begin
if Interlude then begin
keyLen:=15;
Move(XorKey,key2,8);
Move(KeyIntrl,key2[8],8);
end else begin
keyLen:=7;
Move(XorKey,key2,4);
Move(KeyConst,key2[4],4);
end;
Move(key2,GKeyS,16);
Move(key2,GKeyR,16);
end;

{ TXorCodingOut }

constructor TXorCodingOut.Create;
begin
FillChar(GKeyS[0],SizeOf(GKeyS),0);
FillChar(GKeyR[0],SizeOf(GKeyR),0);
keyLen := 0;
end;

procedure TXorCodingOut.DecryptGP(var Data; const Size: Word);
var
k:integer;
pck:array[0..$4FFF] of Byte absolute Data;
begin
for k:=size-1 downto 1 do
pck[k]:=pck[k] xor GKeyR[k and keyLen] xor pck[k-1];
if size<>0 then pck[0]:=pck[0] xor GKeyR[0];
Inc(PLongWord(@GKeyR[keyLen-7])^,size);
end;

procedure TXorCodingOut.EncryptGP(var Data; const Size: Word);
var
i:integer;
pck:array[0..$4FFF] of Byte absolute Data;
begin
if size<>0 then pck[0]:=pck[0] xor GKeyS[0];
for i:=1 to size-1 do
pck[i]:=pck[i] xor GKeyS[i and keyLen] xor pck[i-1];
Inc(PLongWord(@GKeyS[keyLen-7])^,size);
end;

procedure TXorCodingOut.InitKey(const XorKey; Interlude: Boolean);
const
KeyConst: array[0..3] of Byte = ($A1,$6C,$54,$87);
KeyIntrl: array[0..7] of Byte = ($C8,$27,$93,$01,$A1,$6C,$31,$97);
var key2:array[0..15] of Byte;
begin
if Interlude then begin
keyLen:=15;
Move(XorKey,key2,8);
Move(KeyIntrl,key2[8],8);
end else begin
keyLen:=7;
Move(XorKey,key2,4);
Move(KeyConst,key2[4],4);
end;
Move(key2,GKeyS,16);
Move(key2,GKeyR,16);
end;

begin

end.
Заранее спасибо.

J-Fobos
05.04.2011, 00:11
Для версии 3.5 с учетом не нулевых ObfuscationKey (из KeyPacket)
library newxor;

uses
usharedstructs in '..\units\usharedstructs.pas',
Classes,
windows,
sysutils;

{$R *.res}

type
TXorCoding = class(TCodingClass)
private
keyLen: Byte;
DecAccumulatorSize, EncAccumulatorSize : integer;
DecAccumulator, EncAccumulator : array [0..$ffff] of byte;
public
constructor Create;
procedure InitKey(const XorKey; Interlude: Byte = 0);override;
procedure DecryptGP(var Data; var Size: Word);override;
procedure EncryptGP(var Data; var Size: Word);override;
procedure PreDecrypt(var Data; var Size: Word); override;
procedure PostEncrypt(var Data; var Size: Word); override;
end;

TXorCodingOut = class(TCodingClass)
private
keyLen: Byte;
DecAccumulatorSize, EncAccumulatorSize : integer;
DecAccumulator, EncAccumulator : array [0..$ffff] of byte;
public
constructor Create;
procedure InitKey(const XorKey; Interlude: Byte = 0);override;
procedure DecryptGP(var Data; var Size: Word); override;
procedure EncryptGP(var Data; var Size: Word); override;
procedure PreDecrypt(var Data; var Size: Word); override;
procedure PostEncrypt(var Data; var Size: Word); override;
end;


function CreateCoding(Value:PCodingClass): HRESULT; stdcall;
begin
Result:=0;
try
Value^:=TXorCoding.Create;
except
Result:=-1;
Value^:=nil;
end;
end;

function CreateCodingOut(Value:PCodingClass): HRESULT; stdcall;
begin
Result:=0;
try
Value^:=TXorCodingOut.Create;
except
Result:=-1;
Value^:=nil;
end;
end;

exports CreateCoding, CreateCodingOut;

{ TXorCoding }

constructor TXorCoding.Create();
begin
FillChar(GKeyS[0],SizeOf(GKeyS),0);
FillChar(GKeyR[0],SizeOf(GKeyR),0);
keyLen := 0;
EncAccumulatorSize := 0;
DecAccumulatorSize := 0;
End;

procedure TXorCoding.DecryptGP(var Data; var Size: Word);
var
k:integer;
pck:array[0..$FFFD] of Byte absolute Data;
begin
//server>>PreDecrypt>[DecryptGP]>(PH)>EncryptGP>PostEncrypt>>client
for k:=size-1 downto 1 do
pck[k]:=pck[k] xor GKeyR[k and keyLen] xor pck[k-1];
if size<>0 then pck[0]:=pck[0] xor GKeyR[0];
Inc(PLongWord(@GKeyR[keyLen-7])^,size);
end;

procedure TXorCoding.EncryptGP(var Data; var Size: Word);
var
i:integer;
pck:array[0..$FFFD] of Byte absolute Data;
begin
//server>>PreDecrypt>DecryptGP>(PH)>[EncryptGP]>PostEncrypt>>client

if size<>0 then pck[0]:=pck[0] xor GKeyS[0];
for i:=1 to size-1 do
pck[i]:=pck[i] xor GKeyS[i and keyLen] xor pck[i-1];
Inc(PLongWord(@GKeyS[keyLen-7])^,size);
end;

procedure TXorCoding.InitKey(const XorKey; Interlude: Byte = 0);
const
KeyConst: array[0..3] of Byte = ($A1,$6C,$54,$87);
KeyIntrl: array[0..7] of Byte = ($C8,$27,$93,$01,$A1,$6C,$31,$97);
var key2:array[0..15] of Byte;
begin
if Interlude <> 0 then begin
keyLen:=15;
Move(XorKey,key2,8);
Move(KeyIntrl,key2[8],8);
end else begin
keyLen:=7;
Move(XorKey,key2,4);
Move(KeyConst,key2[4],4);
end;
Move(key2,GKeyS,16);
Move(key2,GKeyR,16);
end;

procedure TXorCoding.PreDecrypt(var Data; var Size: Word);
//server>>[PreDecrypt]>DecryptGP>(PH)>EncryptGP>PostEncrypt>>client
procedure YourDecryptFuncton(var Packet:TPacket);
begin
//сюда поступает пакетик который необходимо декриптовать.
//если ты захочешь сразу преобразовать его в декриптованный линейковский пакет
//то decryptgp оставляй пустым
//если же это поверхносный навесок на криптовку - рекомендую "раздельное питание"
end;

var
L2Packet : TPacket; //обьявлен в шаредструктуре
OutBuffer : array[0..$ffff] of byte;
begin
//выходящий буффер - пуст.
fillchar(OutBuffer, $ffff, 0);

//Суем в аккумулятор то что пришло.
move(data,DecAccumulator[DecAccumulatorSize],size);
inc(DecAccumulatorSize, Size);

Size := 0; //выход обнуляем не давая пакетхаку эту поцию обработать если на следующей проверке
//мы вылетим с этой функции либо не попадем в цикл (это и есть склейка пакетов. когда длина линейковского пакета
//меньше фактически полученных данных. мы будем ждать копя данные в аккумуляторе)

if DecAccumulatorSize < 2 then exit; //в аккумуляторе нет даже длинны.


//в акумуляторе есть чтото по длинне превышающей либо равной 2м байтам. читаем их как размер пакета
move(DecAccumulator[0], L2Packet.Size, 2);

//!если криптуеться весь траффик включая ДЛИННУ пакетов - в этом месте декриптовать L2Packet.Size!

while (L2Packet.Size <= DecAccumulatorSize) do
//Резка пакетов в этом вайле
//будем крутиться тут пока нам будет хватать фактических данных для обслуживания длинн линейковских пакетов.
begin
//подчистим дату пакета, дабы не мусор не смущал при отладке.
fillchar(l2packet.data[0], $FFFD, 0);
//вытягиваем с акумулятора данные пакета.
move(DecAccumulator[2], L2Packet.data[0], L2Packet.Size-2);
//сдвигаем батики в акумуляторе на эту же длинну, затирая считаный с аккумулятора пакет
move(DecAccumulator[L2Packet.Size], DecAccumulator[0], DecAccumulatorSize-L2Packet.Size);
//и умельшаем длинну акумулятора
dec(DecAccumulatorSize, L2Packet.Size);
//Декриптуем
YourDecryptFuncton(L2Packet);
//декриптованный пакет суем в временный выходящий буффер (он нужен только потому что нельзя мовнуть в data[xxx])
move(L2Packet, OutBuffer[Size], L2Packet.Size);
//и увеличиваем колво байт в выходящем буфере
inc(Size, L2Packet.Size);
//Режем следующий пакет
if DecAccumulatorSize >= 2 then
begin
move(DecAccumulator[0], L2Packet.Size, 2);
//декрипт длинны ?
end
else
break;
end;

//сливаем данные с временного буфера в выход буффер
move(OutBuffer[0], data, $ffff);
end;


procedure TXorCoding.PostEncrypt(var Data; var Size: Word);
//server>>PreDecrypt>DecryptGP>(PH)>EncryptGP>[PostEncrypt]>>client
//в общем точная копия декрипта, только екрипт. а так все на тех же местах.

procedure YourEncryptFuncton(var Packet:TPacket);
begin
//аналоично YourDeacryptFuncton но наоборот.

end;

var
L2Packet : TPacket;
OutBuffer : array[0..$ffff] of byte;
begin
fillchar(OutBuffer, $ffff, 0);
move(data,EncAccumulator[EncAccumulatorSize],size);
inc(EncAccumulatorSize, Size);
Size := 0;
if EncAccumulatorSize < 2 then exit;
move(EncAccumulator[0], L2Packet.Size, 2);
while (L2Packet.Size <= EncAccumulatorSize) do
begin
fillchar(l2packet.data[0], $FFFD, 0);
move(EncAccumulator[2], L2Packet.data[0], L2Packet.Size-2);
move(EncAccumulator[L2Packet.Size], EncAccumulator[0], EncAccumulatorSize-L2Packet.Size);
dec(EncAccumulatorSize, L2Packet.Size);
YourEncryptFuncton(L2Packet);
move(L2Packet, OutBuffer[Size], L2Packet.Size);
inc(Size, L2Packet.Size);
if EncAccumulatorSize >= 2 then
begin
move(EncAccumulator[0], L2Packet.Size, 2);
end
else
break;
end;
move(OutBuffer[0], data, $ffff);
end;



{ TXorCodingOut }

constructor TXorCodingOut.Create;
begin
FillChar(GKeyS[0],SizeOf(GKeyS),0);
FillChar(GKeyR[0],SizeOf(GKeyR),0);
keyLen := 0;
EncAccumulatorSize := 0;
DecAccumulatorSize := 0;
end;

procedure TXorCodingOut.DecryptGP(var Data; var Size: Word);
var
k:integer;
pck:array[0..$FFFD] of Byte absolute Data;
begin
//client>>PreDecrypt>[DecryptGP]>(PH)>EncryptGP>PostEncrypt>>server

for k:=size-1 downto 1 do
pck[k]:=pck[k] {xor GKeyR[k and keyLen]} xor pck[k-1];
if size<>0 then pck[0]:=pck[0] xor GKeyR[0];
Inc(PLongWord(@GKeyR[keyLen-7])^,size);
end;

procedure TXorCodingOut.EncryptGP(var Data; var Size: Word);
var
i:integer;
pck:array[0..$FFFD] of Byte absolute Data;
begin
//client>>PreDecrypt>DecryptGP>(PH)>[EncryptGP]>PostEncrypt>>server

if size<>0 then pck[0]:=pck[0] xor GKeyS[0];
for i:=1 to size-1 do
pck[i]:=pck[i] {xor GKeyS[i and keyLen]} xor pck[i-1];
Inc(PLongWord(@GKeyS[keyLen-7])^,size);
end;

procedure TXorCodingOut.InitKey(const XorKey; Interlude: Byte = 0);
const
KeyConst: array[0..3] of Byte = ($A1,$6C,$54,$87);
KeyIntrl: array[0..7] of Byte = ($C8,$27,$93,$01,$A1,$6C,$31,$97);
var key2:array[0..15] of Byte;
begin
if Interlude <> 0 then begin
keyLen:=15;
Move(XorKey,key2,8);
Move(KeyIntrl,key2[8],8);
end else begin
keyLen:=7;
Move(XorKey,key2,4);
Move(KeyConst,key2[4],4);
end;
Move(key2,GKeyS,16);
Move(key2,GKeyR,16);
end;

procedure TXorCodingOut.PreDecrypt(var Data; var Size: Word);
procedure YourDecryptFuncton(var Packet:TPacket);
begin
//сюда поступает пакетик который необходимо декриптовать.
//если ты захочешь сразу преобразовать его в декриптованный линейковский пакет
//то decryptgp оставляй пустым
//если же это поверхносный навесок на криптовку - рекомендую "раздельное питание"
end;

var
L2Packet : TPacket; //обьявлен в шаредструктуре
OutBuffer : array[0..$ffff] of byte;
begin
//client>>[PreDecrypt]>DecryptGP>(PH)>EncryptGP>PostEncrypt>>server
//выходящий буффер - пуст.
fillchar(OutBuffer, $ffff, 0);

//Суем в аккумулятор то что пришло.
move(data,DecAccumulator[DecAccumulatorSize],size);

inc(DecAccumulatorSize, Size);

Size := 0; //выход обнуляем не давая пакетхаку эту поцию обработать если на следующей проверке
//мы вылетим с этой функции либо не попадем в цикл (это и есть склейка пакетов. когда длина линейковского пакета
//меньше фактически полученных данных. мы будем ждать копя данные в аккумуляторе)

if DecAccumulatorSize < 2 then exit; //в аккумуляторе нет даже длинны.


//в акумуляторе есть чтото по длинне превышающей либо равной 2м байтам. читаем их как размер пакета
move(DecAccumulator[0], L2Packet.Size, 2);

//!если криптуеться весь траффик включая ДЛИННУ пакетов - в этом месте декриптовать L2Packet.Size!

while (L2Packet.Size <= DecAccumulatorSize) do
//Резка пакетов в этом вайле
//будем крутиться тут пока нам будет хватать фактических данных для обслуживания длинн линейковских пакетов.
begin
//подчистим дату пакета, дабы не мусор не смущал при отладке.
fillchar(l2packet.data[0], $FFFD, 0);
//вытягиваем с акумулятора данные пакета.
move(DecAccumulator[2], L2Packet.data[0], L2Packet.Size-2);
//сдвигаем батики в акумуляторе на эту же длинну, затирая считаный с аккумулятора пакет
move(DecAccumulator[L2Packet.Size], DecAccumulator[0], DecAccumulatorSize-L2Packet.Size);
//и умельшаем длинну акумулятора
dec(DecAccumulatorSize, L2Packet.Size);
//Декриптуем
YourDecryptFuncton(L2Packet);
//декриптованный пакет суем в временный выходящий буффер (он нужен только потому что нельзя мовнуть в data[xxx])
move(L2Packet, OutBuffer[Size], L2Packet.Size);
//и увеличиваем колво байт в выходящем буфере
inc(Size, L2Packet.Size);
//Режем следующий пакет
if DecAccumulatorSize >= 2 then
begin
move(DecAccumulator[0], L2Packet.Size, 2);
//декрипт длинны ?
end
else
break;
end;

//сливаем данные с временного буфера в выход буффер
move(OutBuffer[0], data, $ffff);
end;



procedure TXorCodingOut.PostEncrypt(var Data; var Size: Word);
//в общем точная копия декрипта, только екрипт. а так все на тех же местах.

procedure YourEncryptFuncton(var Packet:TPacket);
begin
//аналоично YourDeacryptFuncton но наоборот.

end;

var
L2Packet : TPacket;
OutBuffer : array[0..$ffff] of byte;
begin
fillchar(OutBuffer, $ffff, 0);
move(data,EncAccumulator[EncAccumulatorSize],size);
inc(EncAccumulatorSize, Size);
Size := 0;
if EncAccumulatorSize < 2 then exit;
move(EncAccumulator[0], L2Packet.Size, 2);
while (L2Packet.Size <= EncAccumulatorSize) do
begin
fillchar(l2packet.data[0], $FFFD, 0);
move(EncAccumulator[2], L2Packet.data[0], L2Packet.Size-2);
move(EncAccumulator[L2Packet.Size], EncAccumulator[0], EncAccumulatorSize-L2Packet.Size);
dec(EncAccumulatorSize, L2Packet.Size);
YourEncryptFuncton(L2Packet);
move(L2Packet, OutBuffer[Size], L2Packet.Size);
inc(Size, L2Packet.Size);
if EncAccumulatorSize >= 2 then
begin
move(EncAccumulator[0], L2Packet.Size, 2);
end
else
break;
end;
move(OutBuffer[0], data, $ffff);
end;



begin

end.


unit usharedstructs;

interface
uses Classes;

const
PCK_GS_ToServer = 4;
PCK_GS_ToClient = 3;
PCK_LS_ToServer = 2;
PCK_LS_ToClient = 1;

type

TEncDecSettings =
record
isChangeXor,
isNoDecrypt,
isNoProcessToClient,
isNoProcessToServer,
isKamael,
isGraciaOff,
isSavePLog,
isNoLog,
ShowLastPacket,
HexViewOffset,
isprocesspackets : boolean;

NoFreeAfterDisconnect : boolean;
UseSocks5Chain, Socks5NeedAuth : boolean;
Socks5Port : cardinal;
Socks5Host, Socks5AuthUsername, Socks5AuthPwd : string;

isAION{,
ignoreServerToClient,
ignoreClientToServer}: boolean;
end;

{Используется плагинами}

PCodingClass =^TCodingClass;
TCodingClass = class(TObject)
public
GKeyS,GKeyR:array[0..15] of Byte;
procedure InitKey(const XorKey; Interlude: Byte = 0); Virtual; Abstract;
procedure DecryptGP(var Data; var Size: Word); Virtual; Abstract;
procedure EncryptGP(var Data; var Size: Word); Virtual; Abstract;
procedure PreDecrypt(var Data; var Size: Word); Virtual; Abstract;
procedure PostEncrypt(var Data; var Size: Word); Virtual; Abstract;
end;


PCorrectorData = ^TCorrectorData;
TCorrectorData = packed record
_seed : integer; // random generator seed for mixing id tables
_1_byte_table : string;
_2_byte_table : string;
_2_byte_table_size: integer;
_id_mix : boolean;
temp_seed : integer;
protocol: integer;
end;

TCharArray = array[0..$FFFF] of AnsiChar;
TCharArrayEx = array[0..$1FFFE] of AnsiChar; //2х

PPacket = ^TPacket;
TPacket = packed record case Integer of
0: (Size: Word;
Data: array[0..$FFFD] of Byte);
1: (PacketAsByteArray: array[0..$FFFF] of Byte);
2: (PacketAsCharArray: TCharArray);
3: (pckSize: Word;
pckId: Byte;
pckData: array[0..$FFFC] of Byte);
end;


TNewPacket = procedure(var Packet:tpacket;FromServer : boolean; Caller: TObject) of object; // Caller это TencDec к примеру -> TencDec(caller).name вызывает акшин только TencDec
TNewAction = procedure (action : byte; Caller: TObject) of object; //Caller зависит от action
TStringArray = array of string;


{экземпляр этого класса (точнее его потомок) передается в плагины.}
TOnTimer = procedure(const param: Cardinal); stdcall;
tConnectInfo = packed record
ConnectID:integer;
ConnectName:string[200];
end;

tConnectInfoEx = packed record //Используеться в ASL
ConnectInfo : tConnectInfo;
Valid : boolean;
end;

PPluginStruct = ^TPluginStruct;
TPluginStruct = class (tobject)
private
public
userFormHandle: THandle;
ConnectInfo : tConnectInfo;
UserFuncs : tstringlist;
function ReadC(const pck:string; const index:integer):byte; Virtual; Abstract;
function ReadH(const pck:string; const index:integer):word; Virtual; Abstract;
function ReadD(const pck:string; const index:integer):integer; Virtual; Abstract;
function ReadQ(const pck:string; const index:integer):int64; Virtual; Abstract;
function ReadF(const pck:string; const index:integer):double; Virtual; Abstract;
function ReadS(const pck:string; const index:integer):string; Virtual; Abstract;

function ReadCEx(const pck; const index:integer):byte; Virtual; Abstract;
function ReadHEx(const pck; const index:integer):word; Virtual; Abstract;
function ReadDEx(const pck; const index:integer):integer; Virtual; Abstract;
function ReadQEx(const pck; const index:integer):int64; Virtual; Abstract;
function ReadFEx(const pck; const index:integer):double; Virtual; Abstract;
function ReadSEx(const pck; const index:integer):string; Virtual; Abstract;
procedure WriteC(var pck: string; const v:byte; ind:integer=-1); Virtual; Abstract;
procedure WriteH(var pck: string; const v:word; ind:integer=-1); Virtual; Abstract;
procedure WriteD(var pck: string; const v:integer; ind:integer=-1); Virtual; Abstract;
procedure WriteQ(var pck: string; const v:int64; ind:integer=-1); Virtual; Abstract;
procedure WriteF(var pck: string; const v:double; ind:integer=-1); Virtual; Abstract;
procedure WriteS(var pck: string; const v:string; ind:integer=-1); Virtual; Abstract;
procedure WriteCEx(var pck; const v:byte; ind:integer=-1); Virtual; Abstract;
procedure WriteHEx(var pck; const v:word; ind:integer=-1); Virtual; Abstract;
procedure WriteDEx(var pck; const v:integer; ind:integer=-1); Virtual; Abstract;
procedure WriteQEx(var pck; const v:int64; ind:integer=-1); Virtual; Abstract;
procedure WriteFEx(var pck; const v:double; ind:integer=-1); Virtual; Abstract;
procedure WriteSEx(var pck; const v:string; ind:integer=-1); Virtual; Abstract;

Function SetScriptVariable(scriptid:integer; varname:string; varvalue:variant):boolean; Virtual; Abstract;
Function GetScriptVariable(scriptid:integer; varname:string):variant; Virtual; Abstract;
function CallScriptFunction(scriptid:integer; Name: String; Params: Variant; var error:string): Variant; Virtual; Abstract;

function IsScriptIdValid(scriptid:integer):boolean; Virtual; Abstract;


function CreateAndRunTimerThread(const interval, usrParam: Cardinal;
const OnTimerProc: TOnTimer): Pointer; Virtual; Abstract;
procedure ChangeTimerThread(const timer: Pointer; const interval: Cardinal;
const usrParam: Cardinal = $ffffffff;
const OnTimerProc: TOnTimer = nil); Virtual; Abstract;
procedure DestroyTimerThread(var timer: Pointer); Virtual; Abstract;
function StringToHex(str1,Separator:String):String; Virtual; Abstract;
function HexToString(Hex:String):String; Virtual; Abstract;
function DataPckToStrPck(var pck): string; Virtual; Abstract;
procedure SendPacketData(var pck; const tid: integer; const ToServer: Boolean); Virtual; Abstract;
procedure SendPacketStr(pck: string; const tid: integer; const ToServer: Boolean); Virtual; Abstract;
procedure SendPacket(Size: Word; pck: string; tid: integer; ToServer: Boolean); Virtual; Abstract;

function getConnectionName(id : integer):string; Virtual; Abstract;
function getConnectioidByName(name : string):integer; Virtual; Abstract;
Function GoFirstConnection:boolean; Virtual; Abstract;
Function GoNextConnection:boolean; Virtual; Abstract;
procedure ShowUserForm(ActivateOnly:boolean); Virtual; Abstract;
Procedure HideUserForm; Virtual; Abstract;
end;

implementation



end.

HARDporno[™]
05.04.2011, 22:13
Спасибо конечно за ответ,но можно ли ответить в таком види:
1.Учи Delphi
2.Скачай это
3.Миняй это
4. и тд.(Все для примера написал).
Готов потрать время но то чтобы нормально разбиратся в этом.
И еще раз зарание спасибо.

Добавлено через 17 часов 58 минут
Поможет кто?
Или же все через wmz?

J-Fobos
10.04.2011, 03:31
Я так подозреваю надо выучить делфи и основы ассемблера, также научится работать с отладчиками.

HARDporno[™]
10.04.2011, 11:53
Я так подозреваю надо выучить делфи и основы ассемблера, также научится работать с отладчиками.
Ну что ж спасибо за ответ,на днях начну учить основы.

//J-Fobos: наиболее популярный отладчики Olly и IDE, большенство людей что работают с линейкой юзают именно их.

DarkDeidara
09.08.2011, 23:33
Когда пытаюсь скомпилировать (Для версии 3.5), выдаёт ошибку
Build
[Warning] Project1.dpr(9): File not found: 'newxor.res'
[Error] File not found: 'newxor.res'

чего ему не хватает для компиляции и где это взять??

J-Fobos
10.08.2011, 00:00
DarkDeidara, уберите эту строчку {$R *.res}.

DarkDeidara
10.08.2011, 01:22
Спасибо, скомпилировал.
жаль что к серву не подошло...

//J-Fobos: оно и не должно было подойти, выложенный код встроен в пакетхак по умолчанию, я его только для примера привел.

Anarcheon2
11.08.2011, 11:22
объясните в личку как компилировать, а то я вообще в этом нуб, а хочется научится...

enot221
12.08.2011, 07:25
объясните в личку как компилировать, а то я вообще в этом нуб, а хочется научится...

Сначало учишь делфи, потом основы ассемблера /bonk

enot221
15.08.2011, 04:47
P.S а кому нужна помощь насчёт newxor.dll вам в кодеркс, мне там помогли несколько раз /problem

SangreVienta
17.08.2011, 10:44
P.S а кому нужна помощь насчёт newxor.dll вам в кодеркс, мне там помогли несколько раз
Cори , но что за ,,кодеркс,, ???
Думаю что нужна будет помощь с newxor.dll , и хочу узнать заранее. СПС .

HARDporno[™]
17.08.2011, 11:18
Cори , но что за ,,кодеркс,, ???
Думаю что нужна будет помощь с newxor.dll , и хочу узнать заранее. СПС .
coderx.ru
сайт разработчиков пх.

PrOgReSsiV
20.09.2011, 19:34
Если не ошибаюсь, делфи построен на паскале. Т.е. Мб лучше начать с паскаля?
2-ое. Ребят, кто шарит в этом, напишите пож маленький видео мануал. (Кому конечно не в лом)
3-ье. Кирилл, когда ты будешь в скайпе? :) Ссори за оффтоп ^^

Федя
20.09.2011, 19:40
Язык обжект паскаль, но надо знать что с 2007 года делфи имеет статус отдельного языка -)
Я сам начинал с паскаля , понять основы консольного программирования можно с него, а потом учить делфи.

st1mul[3Dfx]
10.06.2012, 10:44
Догадываюсь что эта тема есть в подполье, но все же, если посчитаете ее нужной удалите
Вот алгоритм шифрации от Hinta.
I. Первый пакет от клиента к логин серверу
1. Берем 1-ю константу (39 41 41 31 42 44 35 41 "9AA1BD5A")
2. Модифицируем её (Добавляем к каждому символу строки его позицию)
3. Делаем из неё Хэш по MD5 алгоритму
4. Берем 2-ю константу (41 56 4D "AVM")
5. Модифицируем её (Добавляем к каждому символу строки его позицию)
6. Суммируем результат пункта 3 и пункта 5
7. Из результата делаем Хэш по MD5 алгоритму
8. Суммируем строку саму с собой 4 раза.
9. Ксорим с пакетом
10. Прогоняем через функцию криптовки (названия не знаю. Обозвал HintCrypt())
11. Далее любимый блоуфиш и шлем на сервер

II. Второй и третий пакет от клиента к логин серверу
1. модифицируем логин (Добавляем к каждому символу строки его позицию)
2. К пункту 1 прибавляем модифицированную константу (3A 43 44 35 47 4A 3C 49 ":CD56J<I")
3. Модифицируем пароль (Добавляем к каждому символу строки его позицию)
4. Прибавляем его к пункту 2
5. Делаем Хэш по MD5 алгоритму из полученной строки
6. Прибавляем вторую константу (41 56 4D "AVM")
7. Делаем Хэш по MD5 алгоритму из полученной строки
8. Суммируем строку саму с собой 2 раза.
9. Ксорим с пакетом
10. Прогоняем через функцию криптовки (названия не знаю. Обозвал HintCrypt())
11. Далее любимый блоуфиш и шлем на сервер

III. Пакеты от логин сервера к клиенту (LoginOk, PlayOk)
1. Прогоняем через функцию декриптовки (названия не знаю. Обозвал HintDeCrypt())Как вы понимаете, догадаться как меняются ксор ключи на интуитивном уровне невозможно -
- вывод учите ассемблер.
Алгоритм взят отсюда ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
Кто ищет - тот найдет

crazy55
05.07.2013, 03:44
newbie question. what is the difference to use l2phx in a decrypted traffic and not decrypted? what can I do after decrypted that can not do before?

Midsummer
06.07.2013, 16:45
newbie question. what is the difference to use l2phx in a decrypted traffic and not decrypted? what can I do after decrypted that can not do before?

There are two types of servers: with and without protection. Protection means traffic encryption.
Some servers have the protection that encrypts traffic, and unless you're using l2phx with decrypt functions, you're unable to do anything.

Licoze
06.07.2013, 18:34
Если не ошибаюсь, делфи построен на паскале. Т.е. Мб лучше начать с паскаля?
2-ое. Ребят, кто шарит в этом, напишите пож маленький видео мануал. (Кому конечно не в лом)
3-ье. Кирилл, когда ты будешь в скайпе? :) Ссори за оффтоп ^^

Маленький мануал по паскалю не получится, ибо учить прийдется не мало так как надо хорошо осознавать что ты пишеш. С делфи естественно не получится так как все намного сложнее и если кто то и сделает видео то в итоге получится тыкнем сюда , тыкнем туда и ты ничего не поймеш)