谁来帮我分析下这个解密程序,不大看的懂,太菜了,谢谢大家 ( 积分: 46 )

  • 主题发起人 主题发起人 冬月
  • 开始时间 开始时间

冬月

Unregistered / Unconfirmed
GUEST, unregistred user!
function DecodeA(pIn:PChar;pOut:PChar;Size:Integer):Integer;
var
i1,i2,i3,i4:byte;
i,iptr,optr:integer;
key1,key2:byte;
begin
key1:=$ac;
key2:=$3c;
iptr:=0;
optr:=0;
for i:=0 to (Size div 4)-1 do
begin
//依次取出4个字符
i1:=byte(pIn[iptr])-key2;
Inc(iptr);
i2:=byte(pIn[iptr])-key2;
Inc(iptr);
i3:=byte(pIn[iptr])-key2;
Inc(iptr);
i4:=byte(pIn[iptr])-key2;
Inc(iptr);
//生成第一个明文字符
pOut[optr]:=chr((i1 and 3) or (((i1 and $3c) shl 2) or (i4 and $c)) xor key1);
Inc(optr);
//生成第二个明文字符
pOut[optr]:=chr((i2 and 3) or (((i2 and $3c) shl 2) or ((i4 and $3)) shl 2) xor key1);
Inc(optr);
//生成第三个明文字符
pOut[optr]:=chr((i3 and $3f) or ((i4 and $30) shl 2) xor key1);
Inc(optr);
end;
case (Size mod 4) of
//当密文有2个零头字符的处理
2:begin
//分别取出零头的2个字符
i1:=byte(pIn[iptr])-key2;
Inc(iptr);
i2:=byte(pIn[iptr])-key2;
Inc(iptr);
//生成零头明文字符
pOut[optr]:=chr((i1 and 3) or ((i1 and $3c) shl 2) or ((i2 and 3) shl 2) xor key1);
Inc(optr);
end;
//当密文有3个零头字符的处理
3:begin
//分别取出零头的3个字符
i1:=byte(pIn[iptr])-key2;
Inc(iptr);
i2:=byte(pIn[iptr])-key2;
Inc(iptr);
i3:=byte(pIn[iptr])-key2;
Inc(iptr);
//生成两个零头明文字符
pOut[optr]:=chr((i1 and 3) or ((i1 and $3c) shl 2) or (i3 and $0C) xor key1);
inc(optr);
pOut[optr]:=chr((i2 and 3) or ((i2 and $3c) shl 2) or ((i3 and $03) shl 2) xor key1);
Inc(optr);
end;
end;//case结束 ;
pOut[optr]:=#0;
DecodeA:=optr;
end;
 
function DecodeA(pIn:PChar;pOut:PChar;Size:Integer):Integer;
var
i1,i2,i3,i4:byte;
i,iptr,optr:integer;
key1,key2:byte;
begin
key1:=$ac;
key2:=$3c;
iptr:=0;
optr:=0;
for i:=0 to (Size div 4)-1 do
begin
//依次取出4个字符
i1:=byte(pIn[iptr])-key2;
Inc(iptr);
i2:=byte(pIn[iptr])-key2;
Inc(iptr);
i3:=byte(pIn[iptr])-key2;
Inc(iptr);
i4:=byte(pIn[iptr])-key2;
Inc(iptr);
//生成第一个明文字符
pOut[optr]:=chr((i1 and 3) or (((i1 and $3c) shl 2) or (i4 and $c)) xor key1);
Inc(optr);
//生成第二个明文字符
pOut[optr]:=chr((i2 and 3) or (((i2 and $3c) shl 2) or ((i4 and $3)) shl 2) xor key1);
Inc(optr);
//生成第三个明文字符
pOut[optr]:=chr((i3 and $3f) or ((i4 and $30) shl 2) xor key1);
Inc(optr);
end;
case (Size mod 4) of
//当密文有2个零头字符的处理
2:begin
//分别取出零头的2个字符
i1:=byte(pIn[iptr])-key2;
Inc(iptr);
i2:=byte(pIn[iptr])-key2;
Inc(iptr);
//生成零头明文字符
pOut[optr]:=chr((i1 and 3) or ((i1 and $3c) shl 2) or ((i2 and 3) shl 2) xor key1);
Inc(optr);
end;
//当密文有3个零头字符的处理
3:begin
//分别取出零头的3个字符
i1:=byte(pIn[iptr])-key2;
Inc(iptr);
i2:=byte(pIn[iptr])-key2;
Inc(iptr);
i3:=byte(pIn[iptr])-key2;
Inc(iptr);
//生成两个零头明文字符
pOut[optr]:=chr((i1 and 3) or ((i1 and $3c) shl 2) or (i3 and $0C) xor key1);
inc(optr);
pOut[optr]:=chr((i2 and 3) or ((i2 and $3c) shl 2) or ((i3 and $03) shl 2) xor key1);
Inc(optr);
end;
end;//case结束 ;
pOut[optr]:=#0;
DecodeA:=optr;
end;
 
这是一个对传奇世界的封包解密的函数.
老兄你不用分析了,拿来用就是了.
 
要想看懂,关键是先要理解数据格式.
 
//每个封包以#开头,紧接着是一个数字(从1-9递增,到了9再返回1),作为封包验证。最后是以!结尾。
//在那个数字和!之间就是封包内容。
//在客户端截获的SEND封包中,那段控制域内容是经过了6BIT编码。
//控制域:未加密代码以每3个字节为一段,一共就是24位。
//然后每6BIT一段分开,在前面加2bit(00),然后每个字节再加3C,3个字节的封包数据被扩展成了4个字节的封包数据
PPackage = ^TPackage;
TPackage = record //明文包
DW1:WORD
//(4字节)
DW2:WORD
//(4字节)

W1:WORD
//(2字节)
W2:WORD
//(2字节)
W3:WORD
//(2字节)
W4:WORD
//(2字节)
end;
PcrypPackage = ^TcrypPackage;
TcrypPackage = record //密文包
B1:Byte;
B2:Byte;
B3:Byte;
B4:Byte;
B5:Byte;
B6:Byte;
B7:Byte;
B8:Byte;
B9:Byte;
B10:Byte;
B11:Byte;
B12:Byte;
B13:Byte;
B14:Byte;
B15:Byte;
B16:Byte;
end;

//解密指令包
procedure _DecodePackage(source : pointer{PcrypPackage};Dest:Pointer{PPackage});
begin
asm
PUSH ESI
PUSH EDI
PUSH EAX
PUSH EBX
PUSH ECX
PUSH EDX

MOV EDI,Dest
MOV ESI,Source
MOV EBX,15 //Source
MOV EDX,11 //Dest
MOV ECX,4
@@LOOP:
CMP ECX,00
JE @@EXIT
PUSH ECX

//最后一个字节
MOV AL,[ESI+EBX]
DEC EBX

SUB AL,3Ch
MOV Cl,2
SHL AL,CL

MOV AH,[ESI+EBX]
DEC EBX
SUB AH,3Ch

RCR AX ,CL
MOV [EDI+EDX],AL
DEC EDX
//最后一个字节

//倒数第2个字节
MOV AL,AH
MOV CL,4
SHL AL,CL

MOV AH,[ESI+EBX]
DEC EBX
SUB AH,3Ch

RCR AX,CL
MOV [EDI+EDX],AL
DEC EDX
//倒数第2个字节

//倒数第3个字节
MOV AL,AH
MOV CL,6
SHL AL,CL

MOV AH,[ESI+EBX]
DEC EBX
SUB AH,3Ch

RCR AX,Cl
MOV [EDI+EDX],AL
DEC EDX
//倒数第3个字节
POP ECX
DEC ECX
JMP @@LOOP
@@EXIT:
POP EDX
POP ECX
POP EBX
POP EAX
POP EDI
POP ESI
end;
end;
//加密指令包
procedure _EncodePackage(source : pointer{PPackage};Dest:Pointer{PcrypPackage});
//6BIT加密
begin
ASM
PUSH ESI
PUSH EDI
PUSH EAX
PUSH ECX

MOV EDI,Dest //Dest
MOV ESI,Source //Source

MOV ECX,4
@@LOOP:
CMP ECX,0
JE @@EXIT
PUSH ECX
////
MOV AH,[ESI]
INC ESI
MOV CL,2
SHR AX,CL
ADD AH,3Ch
MOV [EDI],AH
INC EDI
//
//
MOV AH,[ESI]
INC ESI
MOV CL,2
RCL AL,CL
RCR AX,CL
SHR AX,CL
ADD AH,3Ch
MOV [EDI],AH
INC EDI
//
//
MOV AH,[ESI]
INC ESI
MOV CL,4
RCL AL,CL
RCR AX,CL
MOV CL,2
SHR AX,CL
ADD AH,3Ch
MOV [EDI],AH
INC EDI
//多出一个字节
SHR AL,Cl
ADD AL,3CH
MOV [EDI],AL
INC EDI
//

POP ECX
DEC ECX
JMP @@LOOP
@@EXIT:
POP ECX
POP EAX
POP EDI
POP ESI
END;
end;
 
crossrowman,这个我也不会调用啊,请帮助做一个DEMO,谢谢了
 
后退
顶部