[ **]
聯眾公升級協議分析
雲網(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的關係。但是仍...