聯眾公升級協議分析 續篇(三)
雲網(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,報...