读书人

一段传奇世界游戏封包的加解密[有源码

发布时间: 2012-03-01 10:25:46 作者: rapoo

一段传奇世界游戏封包的加解密[有源码],我不知道怎么得到明文,请大家帮看看 - C++ Builder / Windows SDK/API
比如我用Wpe抓一个包,密文是#Rl=fwnfsv?ftvufuDaQDVN`> ELbF> pFo\=!
明文是什么?
我找了加解密的原码,可不知道用,小生是一个初学者,大家不要见笑!


[代码如下]
int CodeWoool(const BYTE * pIn, int size, CHAR * pOut)
{
BYTE b1 = 0,bcal = 0;
BYTE bflag1 = 0,bflag2 = 0;
int i = 0;
int iptr = 0;
int optr = 0;
while( iptr < size )
{
b1 = pIn[iptr++] ^ 0xeb;
if( i < 2 )
{
bcal = b1;
bcal> > =2;
bflag1 =bcal;
bcal &= 0x3c;
b1 &=3;
bcal |= b1;
bcal += 0x3b;
pOut[optr++] = (char)bcal;
bflag2 = (bflag1 & 3 ) | (bflag2 < < 2 );
}
else
{
bcal = b1;
bcal &= 0x3f;
bcal += 0x3b;
pOut[optr++] = (char)bcal;
b1> > = 2;
b1 &=0x30;
b1 |= bflag2;
b1 += 0x3b;
pOut[optr++] = (char)b1;
bflag2 = 0;
}
i ++;
i %=3;
}
pOut[optr] = 0;
if( i == 0 )
return optr;
pOut[optr++] = bflag2 + 0x3b;
pOut[optr] = 0;
return optr;
}
//---------------------------------------
int DecodeWoool(const char * in, BYTE * out)
{
BYTE b1;
BYTE b2;
BYTE b3;
BYTE b4;
int inLen=strlen((char*)in);
int inOffset=0;
int outOffset=0;
int remain;
/*for(int i=0;i <inLen;i++)
{
in[i]-=0x3b;
in[i]&=0x3f;
}*/
while(true)
{
remain=inLen-inOffset;
if(remain <=0)break;

b1=in[inOffset ];
b2=in[inOffset+1];
b3=in[inOffset+2];
b4=in[inOffset+3];
b1-=0x3b;
b1&=0x3f;
b2-=0x3b;
b2&=0x3f;
b3-=0x3b;
b3&=0x3f;
b4-=0x3b;
b4&=0x3f;

if(remain> =4)
{
out[outOffset ]=((b1 < <2)&0xf0)^(b1&0x3)^((b4)&0xc)^0xeb;
out[outOffset+1]=((b2 < <2)&0xf0)^(b2&0x3)^((b4 < <2)&0xc)^0xeb;
out[outOffset+2]=(b3&0x3f)^((b4 < <2)&0xc0)^0xeb;
inOffset+=4;
outOffset+=3;
}
else if(remain==3)
{
out[outOffset ]=((b1 < <2)&0xf0)^(b1&0x3)^((b3)&0xc)^0xeb;
out[outOffset+1]=((b2 < <2)&0xf0)^(b2&0x3)^((b3 < <2)&0xc)^0xeb;
inOffset+=3;
outOffset+=2;
}
else if(remain==2)
{
out[outOffset]=((b1 < <2)&0xf0)^(b1&0x3)^((b2 < <2)&0xc)^0xeb;
inOffset+=2;


outOffset+=1;
}
else
{
inOffset+=1;
}
}
out[outOffset]= '\0 ';
return outOffset;
}



[解决办法]
不是已经有了DecodeWoool么?outOffset就是数组大小

读书人网 >C++ Builder

热点推荐