聯眾公升級協議分析4

2021-03-31 08:57:00 字數 3016 閱讀 3675

聯眾公升級協議分析 續篇(三)

雲網(jimzj@21**.***)

接上篇下面就去如何去分析每個命令字作說明:

在這之前,我們先定義每乙個包的包頭結構:

typedef struct _tagpackhead

int     n***mand ;      //命令字

int     ndatalen ;          //包長度

}packhead, *lppackhead ;

上面的得到乙個完整的協議包時已用到這個結構了。

一、登入使用者命令

0x0000   00 02 00 80 c8 00 00 00-01 00 00 00 04 00 02 00   ...€?..........

0x0010   00 00 00 00 79 6f 75 73-68 69 5f 31 39 38 31 00   ....dddddd_1981.

0x0020   00 b3 03 00 00 00 00 00-c5 dc c5 dc c5 dc cc f8   .?.....是是是是

0x0030   00 c5 00 00 00 00 00 00-c7 00 ff 00 00 00 00 00   .?.....?.....

0x0040   01 00 00 00 68 6f 6e 64-61 30 34 31 32 00 00 00   ....ffffff0412...

從資料上看,命令字是0x80000200我們不必要每乙個資料都要知道它是什麼意思,只要找到我們的一資料就行了。從上面所標誌的顏色來看,前面的是命令字,紅色的是什麼呢?大家想一下,打公升級一共是四個人,呵呵,你大概會明白了,這個是伺服器分配給每個使用者的編號,這個很重要,因為其它指令中不會再出現使用者名稱了,只會有乙個使用者編號。經過多次分析,使用者的編號是固定的,我們按座位坐下來時分,如下面所示:(是在大廳中坐下等人時,不是出牌時)

0    ------|------  2

包的前面一部分是使用者個資料,後面的就是每乙個使用者的資訊,所以我們定義的包結構如下:

typedef struct _tagrespshjiuserregister

int     nflag0 ;

char    cucount ;       //使用者數

char    cflag1 ;

char    cdapai ;

char    cflag4 ;

}respshjiuserregister, *lprespshjiuserregister;

typedef struct _taggameuserinfo

char    cusernum ;      //使用者編號

char    cflag1 ;

char    cflag2 ;

char    cflag3 ;

char    cuser[ 20 ] ;    //使用者登入名稱

char    calia[ 20 ] ;     //使用者中文名稱

int     nflag4 ;

}gameuserinfo, *lpgameuserinfo;

上面說明analylinkrecvpack函式中用到的dispatchpackets如下所示:(這個就是分解每乙個包了)

void __fastcall tfrmmain::dispatchpackets( const char * ppack )

packhead * ppackhead = ( packhead * )ppack ;        //包頭

if( ppackhead->ndatalen > max_***mand_size - sizeof( packhead )) return ;

switch( ppackhead->n***mand )

case resp_shji_user_register :

if( ppackhead->ndatalen >= sizeof( respshjiuserregister ) + sizeof( gameuserinfo ))              //過濾錯誤的包

revgameuserinfo(( char * )( ppackhead + 1 )) ;              //包內容

break ;

函式revgameuserinfo就是分解使用者資訊的,上面我們已定義了包的結構,所以取得使用者的資訊就很容易了:

void __fastcall tfrmmain::revgameuserinfo( char * ppackcontent )

respshjiuserregister * pinfo = ( respshjiuserregister * )ppackcontent ;

int nusercount = pinfo->cucount ;

for( int i = 0 ; i < nusercount ; i ++ )   //共有四個使用者

gameuserinfo * puser = ( gameuserinfo * )( ( char * )( pinfo + 1 ) + i * sizeof( gameuserinfo )) ;

switch( puser->cusernum )

case pos_left : //編號為0的使用者

panelleft->caption  = ( string )puser->calia ;

break ;

case pos_top  : //編號為1的使用者

paneltop->caption   = ( string )puser->calia ;

break ;

case pos_right:  //編號為2的使用者

panelrig->caption   = ( string )puser->calia ;

break ;

case pos_bot  : //編號為3的使用者

panelbot->caption   = ( string )puser->calia ;

break ;

到此,我們得到了公升級中的每乙個使用者的資訊,呵呵,是不是有點成就感了,我們稍為休息一下,喝一口茶。。。。。

聯眾公升級協議分析1

聯眾公升級協議分析 雲網 jimzj 21 記得剛到大學時,第一件和大家一起玩的就是打牌,相信很多人都會有這個經歷 我也是在那時候學會公升級 拖拉機 的。大二時曾經瘋狂玩過,所以對公升級一直都很情有獨衷 但工作後,一方面找不到人,另一方面就算找到人了也不能像以前一樣通 宵的去玩。還好,一次看到別人在...

聯眾公升級協議分析6

聯眾公升級協議分析續篇 五 雲網 jimzj 21 接上篇 五 出牌命令 上面說是這麼多,現在終於到了全部協議分析中最重要的部分內容了 記錄每乙個玩家所出的牌資訊,這樣就可以分析還剩餘什麼樣的牌了。0x0000 0d 20 00 00 38 00 00 00 00 00 00 00 01 00 00...

網路協議分析 VRRP協議分析

2 rip 2的報文格式 3 rip 2的驗證報文 三 例項化 rip報文由頭部 header 和多個路由表項 route entries 部分組成。乙個rip表項中最多可以有25個路由表項。rip是基於udp協議的,所以rip報文的資料報不能超過512個位元組。1 command 長度8bit,報...