聯眾公升級協議分析1

2021-03-31 08:57:00 字數 4836 閱讀 9153

[ **]

聯眾公升級協議分析

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

記得剛到大學時,第一件和大家一起玩的就是打牌,相信很多人都會有這個經歷;我也是在那時候學會公升級(拖拉機)的。

大二時曾經瘋狂玩過,所以對公升級一直都很情有獨衷;但工作後,一方面找不到人,另一方面就算找到人了也不能像以前一樣通

宵的去玩。還好,一次看到別人在網上玩聯眾的公升級,呵呵,從此後不怕找不到人了,工作之餘可以隨時和別人玩一下,過一把

隱;說了這麼多,還沒有轉入正題,不意思。

料的話,不防貼出來與大家共享一下。

一、對於外掛程式,首先我們談一下資料的獲取:

1、對於動作遊戲類:可以通過api發命令給視窗或api控制滑鼠、鍵盤等,使遊戲裡的人物進行流動或者攻擊,這個是

對於本地遊戲而言的,網上有很多這方面的介紹,在這裡就不再寫了。

3、攔截socket包:要替換winsock.dll或者winsock32.dll,我們寫的替換函式要和原來的函式一致才行,就是說它的函式輸出

什麼樣的,我們也要輸出什麼樣子的函式,而且引數,引數順序都要一樣才行,然後在我們的函式裡面呼叫真正的winsock32.dll裡面

的函式就可以了。當遊戲進行的時候它會呼叫我們的動態庫,然後從我們的動態庫中處理完畢後才跳轉到真正動態庫的函式位址,

這樣我們就可以在裡面處理自己的資料了;不過這程方法要自已重新去寫如下面的乙個例子:

void * psocketfun = getprocaddress( i, "wsastartup" );

wsastartup1 = (int(_stdcall *)( word, lpwsadata ))psocketfun;

winsock32.dll裡有有這麼多的函式,要自己乙個乙個的替換,有不是很累,這個動態庫還是公用的,萬一那乙個地方寫錯了,不

是會出很大問題,所以還是覺得這個方法不是很好。

4、直接監聽網路資料報:這個方法就和sniffer和***view所用的技術差不多了,不過我們並不要直接去監聽到網路層或以下

的資料報,只要到ip層的就可以了;

利用 raw socket: 原始套接字

它來傳送和接收 ip 層以上的原始資料報,如 icmp、tcp、udp...等,一般的遊戲資料量不大的話多採用tcp協議傳輸資料,

助,同時要感謝作者(shadowstar)提供了這麼好的文章,我也從中得不少幫助(~_~)。

下面是我做的一段資料接收和分離出來的ip包的程式:

tryniprevlen = recv( pctlsocket->m_socket, ciprevbuff, max_***mand_size - 24, 0 ) ;

catch( ... )

if( niprevlen == socket_error ) continue ;

ip    * p_ip  = ( ip * )ciprevbuff ;

tcp * p_tcp = ( tcp * )( ciprevbuff + ip_hdrlen( p_ip )) ;

if( p_ip->dstaddr != pctlsocket->addr_in.sin_addr.s_un.s_addr ) continue ; //這句和下一句過濾其它不要的包

if( p_ip->protocol != ipproto_tcp ) continue ;

int nsrcport = ntohs( p_tcp->srcport ) ;

if( nsrcport != port_dodz ) continue ;      

char * ppackconten = ( char * )p_tcp + tcp_hdrlen( p_tcp ) ;       //這裡就是得到了包的內容了

npacklen = ntohs( p_ip->totallen ) - ip_hdrlen( p_ip ) - tcp_hdrlen( p_tcp ) ; //這個是包的長度

二、資料的協議分析

下面來分析一下聯眾公升級的協議,本來自己接收到資料了,就可以把資料寫下來,不過還是用別人的現成工具會更好一點,

0x0000   05 02 00 00 22 00 00 00-00 20 00 00 c1 00 00 00   ....".... ..?..

0x0010   00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

0x0020   06 00 00 00 67 67 2e 68-74 6d 05 02 00 00 23 00   ....gg.htm....#.

0x0030   00 00 01 20 00 00 46 00-00 00 00 00 00 00 00 00   ... ..f.........

0x0040   00 00 00 00 00 00 00 00-00 00 07 00 00 00 67 67   ..............gg

0x0050   2e 68 74 6d 6c                                    .html

像這樣的資料,相信讓誰都會搞不清楚是什麼東西,不過不懷疑有一些天才可以異想天開,不過去從原始資料來分析別人的協

議確實要一些靈感的,:)。好像是在為自己吹噓,不好意思了..... 不過呢,協議的分析要與實際的操作結合起來,如果你不會玩

公升級,很難想像你會很容易分析出來別人的協議來。還好我自己在這方面還不算,還是公升級中是乙個小**類的分資料了,呵呵。

我們可以想一下遊戲一整個流程,登入、進入遊戲室、找到玩家、發牌,扣底、出牌和結束。有了這樣乙個流程在腦子中可以幫

助想像每乙個資料的資訊。

我用的是很差的方法去讓這個過程和接收到的資料合在一起分析的:

1、啟動***view或其它的接收資料報的工具,設定好過濾條件,只接收ip/tcp包,目標的ip是自己的機器,如果不設定這些條件

呵呵,那網路是的大量資料報就全被你吃下來了,到時要從幾萬個包中找出你所要的資料,太難了吧...

2、接著就啟動聯眾的遊戲,進入公升級(為了分析這些協議,我總被人家說慢得像烏龜,還失去了很多分:( ),這時你就可要注

意了收集資料了,記下當前打會,什麼時候叫牌,反牌,得分,出的牌,很從資料都要記錄下來,同時還要想著如何出牌才能贏,要

不真有些對不起和你一起玩的對家了。

3、有了資料一實際上過程的記錄,分析協議就有了著手的地方了,我們先看下面的一段資料:

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

0x0010   00 00 00 00 63 61 6f 77-65 69 5f 30 30 31 30 00   ....ddddd_0010.

0x0020   11 20 00 00 18 00 00 00-67 79 75 67 68 00 00 00   . ......dddd...

從這裡可以看到,ddddd_0010(原始資料不是這個,我修改了)與一起的玩的的名稱是不是一樣呢,如果是一樣的就好了,這個可

是伺服器返回來的與你一起玩的玩家資訊;

如果你做過scoket方面的程式設計,你應該可以知道乙個包的大體結構,下面我來說一下:

應用包頭標誌

包序列號

整個包的長度

crc校驗(或累加和校驗)

命令字資料體長度

資料體網路上的資料並不是整像我們想像的那樣,發乙個包出去,就會在對方接下整個包,很多時候會分幾次才能接收下來整個完整的包

。我們再看乙個包:

0x0000   10 20 00 80 24 00 00 00-d9 54 df 77 01 00 00 00   . .€$...賂遷....

0x0010   01 00 00 00 00 00 00 00-03 00 00 00 00 00 00 00   ................

0x0020   03 00 00 00 01 00 00 00-01 00 00 00 17 71 40 00   .............q@.

這兩個包有什麼相同之處,就是包頭開始的8個位元組,是不是可以看出來乙個包的整體結構了,注意網路資料格式轉換為機器資料格

式的話要反轉一下資料msdn上可以找到類似這樣的函式ntohl、ntohs、 htonl和htons,所以我們在看資料時也要把字倒轉一下...

如果你了解的話,和般的80是作為乙個回應包的標識,這樣我們就可以看到了兩個命令字了:

80 00 00 02           十六進製制表示:0x80000002

80 00 20 10                   0x80002010

這兩個命令都不同,可以看到,協議上並沒有統計的應用包頭標誌,直接從命令字開始了。有了上面的概念,接下來的自然就是

長度過,因為第乙個包沒有完整,我們看第二個包,一般長度用兩個位元組就可以了,但會有用四個位元組的,也就是乙個int型別的值,第二

個包的長度不難看到就是0x24,假設長度使用四個位元組,那麼內容就應該是d9 54 .... 71 40 00,0x24 = 36,我們資料一下,剛好就是

這個長度,呵呵,到現在你和我一樣,了解一包的結構形式了,我們正在一步往成功的方向去了...

到了這一步,大家也差不多可以動手自己去分析一下協議了,因為一些其它的因為,我在這裡就不再往下分析各個命令字的具體作用

了,不過可以告訴大家0x80000002是使用者登入後伺服器返回來的所有玩家資訊,注意一下,我們在註冊聯眾使用者時,最長的登入名稱不能

超過19個位元組,所以在包就應加上乙個結束符,就是20個位元組了。

上面的分析只是乙個引子,由本人水平有限,有什麼錯誤的地方請大家指出,共同學習。

的測試,如果發現在什麼bug,可以用郵件方式通知我,謝謝!

聯眾公升級協議分析4

聯眾公升級協議分析 續篇 三 雲網 jimzj 21 接上篇下面就去如何去分析每個命令字作說明 在這之前,我們先定義每乙個包的包頭結構 typedef struct tagpackhead int n mand 命令字 int ndatalen 包長度 packhead,lppackhead 上面的...

聯眾公升級協議分析6

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

RTSP協議分析 1

rtsp協議的proposed standard在rfc 2326中定義,是乙個被廣泛支援的處理流 傳輸的。目前real quicktime的流 解決方案並都支援rtsp。個人覺得,rtsp 在設計的時候參考了http的內容,rtsp同其下的rtp rtcp的關係類似於http同tcp的關係。但是仍...