|
|
这是一段传奇世界客户端封包加密和解密的函数,那位高手高手高高手给俺分析一下,最好都给标一下注释,诚心帮我的可以加我QQ:170301048谢谢 哥哥姐姐拉
char CWOLSocket::GetMsgFlag()
{
return m_msgflag;
}
void CWOLSocket::SetMsgFlag(char flag)
{
m_msgflag = flag;
}
int CWOLSocket::EncodeMsg(const BYTE *inbuf,BYTE *outbuf,int len)
{
int outcount=0;
BYTE b1,b4=0;
int bcount=0;
for(int i=0;i<len;i++)
{
b1=inbuf^0xeb;
if(bcount==2)
{
outbuf[outcount]=(b1&0x3f)+0x3b;
outcount++;
b4|=((b1>>2)&0x30);
outbuf[outcount]=b4+0x3b;
outcount++;
bcount=0;
b4=0;
}
else
{
outbuf[outcount]=((b1&0xF0)>>2|(b1&3))+0x3b;
outcount++;
b4<<=2;
b4|=(b1>>2)&3;
bcount++;
}
}
if(bcount!=0)
{
outbuf[outcount]=b4+0x3b;
outcount++;
}
outbuf[outcount] = 0;
return outcount;
}
int CWOLSocket: ecodeMsg(const BYTE *inbuf,BYTE *outbuf,int len)
{
int outcount=0;
BYTE b1,b2,b3,b4;
int bcount=0;
int kk = len / 4;
int ll = len % 4;
int index;
for(int i=0;i<kk;i++) // 先按照四个字节一组处理
{ index = i << 2;
b1 = inbuf[index] - 0x3b;
b2 = inbuf[index + 1] - 0x3b;
b3 = inbuf[index + 2] - 0x3b;
b4 = inbuf[index + 3] - 0x3b;
outbuf[outcount] = (((b1<<2) & 0xF0) | (b1 & 0x03) | (b4 & 0x0C)) ^ 0xeb;
outcount++;
outbuf[outcount] = (((b2<<2) & 0xF0) | (b2 & 0x03) | ((b4<<2) & 0x0C)) ^ 0xeb;
outcount++;
outbuf[outcount] = (b3 | ((b4<<2) & 0xC0)) ^ 0xeb;
outcount++;
}
index = kk * 4;
if(ll == 2)
{ b1 = inbuf[index] - 0x3b;
b4 = inbuf[index + 1] - 0x3b;
outbuf[outcount] = (((b1<<2) & 0xF0) | (b1 & 0x03) | ((b4<<2) & 0x0C)) ^ 0xeb;
outcount++;
}
else if(ll == 3)
{ b1 = inbuf[index] - 0x3b;
b2 = inbuf[index + 1] - 0x3b;
b4 = inbuf[index + 2] - 0x3b;
outbuf[outcount] = (((b1<<2) & 0xF0) | (b1 & 0x03) | (b4 & 0x0C)) ^ 0xeb;
outcount++;
outbuf[outcount] = (((b2<<2) & 0xF0) | (b2 & 0x03) | ((b4<<2) & 0x0C)) ^ 0xeb;
outcount++;
}
outbuf[outcount] = 0;
return outcount;
}
int CWOLSocket::UnGateCode(char *in, char *out)
{
if(in==NULL)
return 0;
int lcnt=strlen(in)>>1;
if(lcnt==0)
return 0;
if(in[0]==(char)0)//'\0' )
return 0;
int i=0;
int icode=0;
int _edi=0xf667;
for(i=0;i<lcnt;i++)
{
out=((hex2int(ucase(in[i*2]))&0xf)<<4);
out+=hex2int(ucase(in[i*2+1]))&0xf;
icode=((int)out)&0xff;
out^=((_edi & 0xffff)>>8);
_edi=(((_edi+icode)* 0xce6d)&0xffff)+0x58bf;
}
out[lcnt]=(char)0;//'\0';
return 1;
}
// 登陆数据包加密函数
int CWOLSocket::CodeGateCode(char *in, char *out)
{
int lcnt=strlen(in) ;
int i=0;
int icode=0;
int tcode=0;
int hbyte=0;
int lbyte=0;
int _edi=0xf667;
for(i=0;i<lcnt;i++)
{
icode=((int)in)&0xff;
//tcode = icode;
//icode = ((int)out) & 0xff;
tcode=icode;
tcode^=((_edi&0xffff)>>8);
hbyte=(tcode&0xf0)>>4;
lbyte=(tcode&0xf);
out[i*2]=int2hex(hbyte);
out[i*2+1]=int2hex(lbyte);
_edi=(((_edi+tcode)*0xce6d)&0xffff)+0x58bf;
}
out[i * 2] = '\0';
return 1;
} |
|