联众升级协议分析 续篇(一)
云网(jimzj@21cn.com)
因为上一次正在做一个项目,所以时间不多,并没有很多的时间去写完关于联众升级协议分析的全过程还有所有协议的全部内容就匆匆在CSDN上发表了《外挂制用 联众升级协议分析》(也可以在CSDN开发高手9月份中的《网络游戏的协议 分析》找到相关内容),在网上发表后,收到很多读者的来信,希望我把联众协议分析的整个过程详细完成,并把关键的协议分析的说明一下;正好现在手头的工作不多(不要告诉我的老板呵,要不他狠不得又把所有任务都放到我这了L)可以去完成这协议的分析说明。
上一篇文章已说明了数据是如何接收的,在这里就不再赘述,如果不了解的朋友可以再找一下这篇文章来读一下。现在我就从协议分析的内容,还有如何从程序中得到数据说明每一个命令的意思,希望大家在读这个文章后,也可以自己去做一个外挂了。
在分析命令之前,还是有必要说明一下如何从接收到的网络数据中提取一个我们要的包的说明(下面内容就是从网络数据中找到一个完整的协议包)
int __fastcall TCltSocket::AnalyLinkRecvPack(int nLen, PCHAR pDataBuff, int & nLastLen, int nSrcPort)
{
int nCPosition = -1 ; //包头的开始位置
int nCmdFlag = -1 ; //命令字标志
lpPackHead pPackHead ; //包头结构
int nAppPackHeadSize = sizeof( PackHead ) ; //包头长度
if( nLastLen < nAppPackHeadSize ) return 1 ; //网络包剩下长度小于一包头时不是一个完整的包
//找到包头开始位
for( int i = 0 ; i < nLen - 2; i ++ )
{
nCmdFlag = * ( int * )(pDataBuff + i ) ; //一个个字节搜索网络数据包中的命令字标志
if( m_GameCmdFlagMap.find( nCmdFlag ) != m_GameCmdFlagMap.end())
{
nCPosition = i ; //找以所要命令字的开始位置
break ;
}
}
……………………….
if( pPackHead->nDataLen > ( nLastLen - nAppPackHeadSize )) //分析是完成包
{
memcpy( pDataBuff, ( pDataBuff + nCPosition ), nLastLen ) ;
return 1 ;
}
else //这里的pPackHead->nDataLen就是上次我说的包长度了
{
if ( nLastLen < ( nLastLen - pPackHead->nDataLen - nAppPackHeadSize ))
{
nLastLen = 0 ;
}
else
{
nLastLen = nLastLen - pPackHead->nDataLen - nAppPackHeadSize ;
}
try
{
DispatchPackets( (PCHAR)pPackHead, nSrcPort ); //在这里就得到了一个完整的协议包了
}
catch(Exception &e)
{
}
memcpy( pDataBuff, pDataBuff + nCPosition + pPackHead->nDataLen + nAppPackHeadSize , nLastLen ) ; //当前剩下的网络数据,下一次接收到其它数据后一起分析
return 0 ;
}
}
.....待续