游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1783|回复: 2

求助高手给我分析一下这段程序!!俺是新手!

[复制链接]

4

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2005-7-15 04:18:00 | 显示全部楼层 |阅读模式
这是一段传奇世界客户端封包加密和解密的函数,那位高手高手高高手给俺分析一下,最好都给标一下注释,诚心帮我的可以加我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;
}

42

主题

418

帖子

418

积分

中级会员

Rank: 3Rank: 3

积分
418
发表于 2005-7-15 08:53:00 | 显示全部楼层

Re:求助高手给我分析一下这段程序!!俺是新手!

俺最怕的就是看代码,特别是很长的代码。。。
只能帮你顶了。。。

38

主题

120

帖子

120

积分

注册会员

Rank: 2

积分
120
发表于 2005-7-15 13:09:00 | 显示全部楼层

Re:求助高手给我分析一下这段程序!!俺是新手!

怎么传奇世界的 也有啊。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-26 10:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表