⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 depacket.pas

📁 这是天翼外挂的源代码
💻 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 + -