📄 depacket.pas
字号:
unit DePacket;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,qsocket2,winsock,packetstruct;
var
buffer:array [0..10] of char;
buff:array [0..BUFFERSIZE] of byte;
buf_4:array [0..3] of char;//发送数据
send3:array [0..5] of Char;
buf_3:array [0..255] of byte;
precode:array [0..BUFFERSIZE] of char; //需要加密的明码。保存未曾加密的明码
coded:array [0..BUFFERSIZE] of char; //密码,经过加密后将要发送的密码
uncode:array [0..BUFFERSIZE] of char; //解密后的明码
test1:byte;
N:integer=$00;
procedure connenctsend(s:Tsocket); //送给服务器的第一个包,接受KEY用
procedure publicrecv1(s:Tsocket); //接受服务器的第一个包,里面有辅助加解密数据
procedure publicrecv2(s:Tsocket);//接受的第二个包
function msgsend(s:Tsocket;pbuf:pchar;length:integer):integer;
procedure encode(j:integer); //通用加密函数。 参数为precode,j为需要加密的数据长度,通用加密函数
procedure decode(_start:integer); //通用解密函数 ,_start 为封包长度所在位置
procedure logoname(name:string;pass:string);// 登陆加密
procedure msgrecv;//解包函数
procedure get_keytab; //根据传送来的偏移(buf4[0..3])返回key_tab
function StrToASCII(str:PChar;strlen:Integer):string;
implementation
uses unit2,idmessgae,gamemain;
var
buf_2:array [0..65520] of byte;
function StrToASCII(str:PChar;strlen:Integer):string;
var
str2 : string;
i : Integer;
p : Integer;
ascii : string;
begin
setlength(ascii,2*strlen);
ascii:='';
for i:=0 to strlen-1 do
begin
p:=integer(str[i]);
str2:=IntToHex(p,2);
ascii:=ascii+str2;
end;
StrToASCII:=ascii;
end;
procedure readfile;
var
f:file;
NUM:integer;
begin
AssignFile(f,extractfilepath(paramstr(0))+'table.dat');
reset(f,1);
seek(f,0);
BlockRead(f,buf_2,65520,NUM);
end;
procedure IncPN(var K:integer);
begin
if N>$FF then N:=$00 else inc(N);
end;
function msgsend(s:Tsocket;pbuf:pchar;length:integer):integer;
var
ptbuf:array[0..BUFFERSIZE] of char;
i,err,j:integer;
begin
i:=0;
j:=length+1;
fillchar(ptbuf,BUFFERSIZE,$00);
ptbuf[i]:=char(PACKET_START1);
i:=i+1;
ptbuf[i]:=char(PACKET_START2);
i:=i+1;
copymemory(ptbuf+i,@j,1);
i:=i+1;
copymemory(ptbuf+i,@N,1);
IncPN(N);
i:=i+1;
copymemory(ptbuf+i,pbuf,length);
i:=i+length;
err:=send(s,ptbuf,i,0);
if err=0 then result:=0 else result:=1;
end;
procedure connenctsend(s:Tsocket); //送给服务器的第一个包,接受KEY用
var
buffer:array [0..10] of char;
begin
buffer[0]:=char($AA);buffer[1]:=char($00);buffer[2]:=char($04);
buffer[3]:=char($00);buffer[4]:=char($00);buffer[5]:=char($F9);
buffer[6]:=char($41);
send(s,buffer,7,0);
end;
procedure publicrecv1(s:Tsocket); //接受服务器的第一个包,里面有辅助加解密数据
var
a1,b1,c1,i,j,k:integer;
asn:array [0..3] of byte;
bsn:array [0..3] of byte;
buf_1:array [0..255] of byte;
temp2:byte;
temp3:integer;
begin
fillchar(buff,BUFFERSIZE,$00);
recv(s,buff,BUFFERSIZE,0);
asn[0]:=buff[9] shr 4;
asn[1]:=buff[10] shr 4 ;
asn[2]:=buff[11] shr 4;
asn[3]:=buff[12] shr 4;
bsn[0]:=buff[9] and $0F;
bsn[1]:=buff[11] and $0F;
a1:=integer(bsn[0])*16+integer(bsn[1]);
b1:=a1;
readfile;
c1:=integer(asn[0])*$1000 +integer(asn[1])*$100 +integer(asn[2])*$10 +integer(asn[3]);
///////////////
// c1:=$4e65;
// b1:=$12;
for i:=0 to b1-1 do
begin
buf_1[i]:=buf_2[c1+i];
end;
for j:=0 to 255 do
begin
buf_3[j]:=j;
end;
k:=0;
j:=0;
for i:=0 to 255 do
begin
temp3:=buf_1[j];
temp3:= (temp3+buf_3[i]) and $FF;
k:=(k+temp3) and $ff;
temp2:=k;
temp3:=buf_3[i];
buf_3[i]:=buf_3[temp2];
buf_3[temp2]:=temp3;
j:=(j+1) mod b1;
end;
temp3 := buf_3[0];
temp3 := (temp3 Xor $57) And $FF;
temp3 := (buf_3[1] Xor temp3) And $FF;
temp3 := (temp3 + buf_3[2]) And $FF;
temp3 := (buf_3[3] Xor temp3) And $FF;
temp3 := (temp3 + buf_3[4]) And $FF;
buf_4[0] := char(temp3);
temp3 := buf_3[0];
temp3 := (temp3 Xor $57) And $FF;
temp3 := (temp3 Xor $00) And $FF;
temp3 := (buf_3[5] Xor temp3) And $FF;
temp3 := (temp3 + buf_3[6]) And $FF;
temp3 := (buf_3[7] Xor temp3) And $FF;
temp3 := (temp3 + buf_3[8]) And $FF;
buf_4[1] := char(temp3);
temp3 := buf_3[0];
temp3 := (temp3 Xor $57) And $FF;
temp3 := (temp3 Xor $06) And $FF;
temp3 := (buf_3[9] Xor temp3) And $FF;
temp3 := (temp3 + buf_3[10]) And $FF;
temp3 := (buf_3[11] Xor temp3) And $FF;
temp3 := (temp3 + buf_3[12]) And $FF;
buf_4[2] := char(temp3);
end;
procedure publicrecv2(s:Tsocket);//接受的第二个包
var
buf_5:array [0..11] of byte; //是选择服务器时候第一次接受的数据的第5位至第16位(头)
i,j:integer;
send2:array [0..11] of Byte;//"AA 00 06 10"+ send2(7)--send2(11) 为第2次发送的数据.就是返回结果
Stemp1, Stemp2 : integer;
te2, te3, te4, te5, te11 : Byte;
begin
//buf_3,buf_4
j:=0;
fillchar(buff,BUFFERSIZE,$00);
recv(s,buff,BUFFERSIZE,0);
for i:=4 to 15 do
begin
buf_5[j]:=buff[i];
j:=j+1;
end;
te11 := buf_3[0];
j := 0;
For i := 1 To 12 do
begin
te2 := buf_3[4*i-2];
te3 := buf_3[4*i];
te4 := buf_3[4*i-3];
te5 := buf_3[4*i-1];
If te3 < buf_5[j] Then
begin
Stemp1 := buf_5[j] - te3;
end
Else
begin
Stemp1 := Not te3;
Stemp1 := (Stemp1 + 1) And $FF;
Stemp1 := buf_5[j] + Stemp1;
end;
Stemp1 := (Stemp1 Xor te5) And $FF;
If te2 > Stemp1 Then
begin
Stemp2 := (Not te2) And $FF;
Stemp2 := (Stemp2 + 1) And $FF;
Stemp1 := (Stemp1 + Stemp2) And $FF;
end
Else
begin
Stemp1 := (Stemp1 - te2) And $FF;
end;
Stemp1 := (te4 Xor Stemp1) And $FF;
Stemp1 := (Stemp1 Xor te11) And $FF;
te11 := (te11 Xor Stemp1) And $FF;
send2[j] := Stemp1;
j := j + 1;
end;
N:=$10;
j:=7;
i:=0;
for j:=7 to 11 do
begin
send3[i]:=char(send2[j]);
i:=i+1;
end;
end;
procedure get_keytab; //根据传送来的偏移(buf4[0..3])返回key_tab
var
a1,b1,c1,i,j,k:integer;
asn:array [0..3] of byte;
bsn:array [0..3] of byte;
buf_1:array [0..255] of byte;
temp2:byte;
temp3:integer;
begin
asn[0]:=byte(buf_4[0]) shr 4;
asn[1]:=byte(buf_4[1]) shr 4 ;
asn[2]:=byte(buf_4[2]) shr 4;
asn[3]:=byte(buf_4[3]) shr 4;
bsn[0]:=byte(buf_4[0]) and $0F;
bsn[1]:=byte(buf_4[2]) and $0F;
a1:=integer(bsn[0])*16+integer(bsn[1]);
b1:=a1;
readfile;
c1:=integer(asn[0])*$1000 +integer(asn[1])*$100 +integer(asn[2])*$10 +integer(asn[3]);
//c1:=$F791;
//b1:=$1b;
// test1:=b1; ////////////////////////test
for i:=0 to b1-1 do
begin
buf_1[i]:=buf_2[c1+i];
end;
for j:=0 to 255 do
begin
buf_3[j]:=j;
end;
k:=0;
j:=0;
for i:=0 to 255 do
begin
temp3:=buf_1[j];
temp3:= (temp3+buf_3[i]) and $FF;
k:=(k+temp3) and $ff;
temp2:=k;
temp3:=buf_3[i];
buf_3[i]:=buf_3[temp2];
buf_3[temp2]:=temp3;
j:=(j+1) mod b1;
end;
end;
procedure encode(j:integer); //加密,参数为precode,j为长度,通用加密函数
var
i,v1,temp:integer; //j 为明码长度
begin
fillchar(coded,BUFFERSIZE,$00);
temp:=buf_3[0];
for i:=0 to j-1 do
begin
temp :=(temp xor byte(precode[i])) and $FF;
v1:=temp;
temp := (buf_3[4*i+1] Xor temp) And $FF;
temp := (temp + buf_3[4*i+2]) And $FF;
temp := (buf_3[4*i+3] Xor temp) And $FF;
temp := (temp + buf_3[4*i+4]) And $FF;
coded[i] := char(temp);
temp :=v1;
end;
end;
procedure decode(_start:integer); //解密,参数为precode,j为长度,通用解密函数
// _start 为buff需要处理的开始位置,_end为长度
var
buf_5:array [0..255] of byte;
i,j,j1,_end,Stemp1, Stemp2:integer;
send2:array [0..255] of Byte;
te2, te3, te4, te5, te11 : Byte;
begin
_end:=integer(buff[_start]);
_end:=_start+_end+1;
j:=0;
for i:=_start+2 to _end-1 do
begin
buf_5[j]:=buff[i];
j:=j+1;
end;
te11 := buf_3[0];
j1:=j;
j := 0;
fillchar(send2,255,$00);
For i := 1 To _end-_start-1 do
begin
te2 := buf_3[(4*i-2) mod 256];
te3 := buf_3[(4*i) mod 256];
te4 := buf_3[(4*i-3) mod 256];
te5 := buf_3[(4*i-1) mod 256];
If te3 < buf_5[j] Then
begin
Stemp1 := buf_5[j] - te3;
end
Else
begin
Stemp1 := Not te3;
Stemp1 := (Stemp1 + 1) And $FF;
Stemp1 := buf_5[j] + Stemp1;
end;
Stemp1 := (Stemp1 Xor te5) And $FF;
If te2 > Stemp1 Then
begin
Stemp2 := (Not te2) And $FF;
Stemp2 := (Stemp2 + 1) And $FF;
Stemp1 := (Stemp1 + Stemp2) And $FF;
end
Else
begin
Stemp1 := (Stemp1 - te2) And $FF;
end;
Stemp1 := (te4 Xor Stemp1) And $FF;
Stemp1 := (Stemp1 Xor te11) And $FF;
te11 := (te11 Xor Stemp1) And $FF;
send2[j] := Stemp1;
j := j + 1;
end;
i:=0;
fillchar(uncode,BUFFERSIZE,$00);
for j:=0 to _end-_start-2 do
begin
uncode[i]:=char(send2[j]);
i:=i+1;
end;
// uncode[0]:=char(buf_5[j1-1]);
// uncode[1]:=char(_end); //char(buff[integer(_start)-2]);
end;
procedure msgrecv;//解包函数
var
cwd:string;
i,j:integer;
//dwtime: Dword;
begin
//dwtime:=gettickcount;
fillchar(uncode,BUFFERSIZE,$00);
j:=0;
for i:=0 to leng do
begin
if (buff[i]=$AA) and (buff[i+1]=$00) then
begin
decode(j+2);
cwd:=StrToASCII(uncode,2);
if cwd='3300' then
begin
idrecv;
break;
end;
if cwd='0D00' then
begin
publicrecv;
break;
end;
if cwd='7113' then
begin
privaterecv;
break;
end;
if (cwd='1A00')and (cwd='0E00') then
begin
distroy;
break;
end;
if cwd='0700' then
begin
wpselet;
break;
end;
end;
j:=j+1;
end;
end;
procedure logoname(name:string;pass:string);// 登陆加密
var
i,j,t,f,g:integer;
begin
j:= 0;
f:=0;
fillchar(buf_4,4,$00);
for i:=0 to 3 do
begin
buf_4[j]:=send3[i];
j:=j+1;
end;
get_keytab; //获取key_tab(buf_3)
precode[f]:=char($03);
f:=f+1;
byte(precode[f]):=strlen(pchar(name));
f:=f+1;
for t:=1 to strlen(pchar(name)) do
begin
precode[f]:=name[t];
f:=f+1;
end;
byte(precode[f]):=strlen(pchar(pass));
f:=f+1;
for t:=1 to strlen(pchar(pass)) do
begin
precode[f]:=pass[t];
f:=f+1;
end;
g:=strlen(precode);
N:=$01;
encode(g);
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -