研究(準確的說,應該用“折騰”)魔獸區域網路聯機的時候,一開始是猛的自己抓包分析,大概的弄清楚資料含義了,可是不太相信自己,就上網拚命的搜資料,最後發現也有不少的人在研究這個東西...
心語的專欄
http://blog.csdn.net/xinrui5577/archive/2009/09/16/4560590.aspx
看到他的文章,給了我不少的肯定,更佩服心語前輩(給過我啟迪的都是前輩),用java來實現~其實只要懂java,學C++是很easy的,程式設計語言無界限嘛……
下面是我對他文章的理解:
首先魔獸在進入區域網路的時候它就開始啟用通訊端並綁定udp通訊端到本地連接埠6112(預設連接埠),開始向255.255.255.255即同一網段廣播詢問資訊
內容:F7 2F 10 00 50 58 33 57 14 00 00 00 00 00 00 00
我的魔獸版本是1.20E所以第九個位元組是0x14,從對WC3 Game Searcher抓包來看,1.21 是15,1.22是16...
war3.exe只把這個UDP資料包發給同網段的IP,所以,如果你想要搜尋不同網段的IP就只需要把這個包發給他的6112連接埠就行了...
當他的機子上的war3.exe在6112連接埠收到這個包以後,就會往你的6112發回饋UDP包,如果你不想做其他什麼事而只想讓他能聯機就行的話,給他發了這個UDP包就萬事OK了,工作完成了,接下來的事war3.exe會處理...
如此看來,要實現聯機也是非常之簡單的...
而當你自己建好主機以後,war3.exe就會廣播建主資訊
內容:F7 32 10 00 01 00 00 00 01 00 00 00 04 00 00 00
告訴別人說 我建主了……
同樣,如果你要讓不同網段的機子知道你建了主,只要往他的6112連接埠發這個訊息就行了,在他的war3.exe接到這個訊息後接下來的連結war3會自己搞定...
所以,如果你寫個程式在自己建主機的時候發送 建主資訊包 的話就能實現讓不同網段的機子加入你的主機,發送 詢問資訊包 的話就能實現加入不同網段的主機...
當然,要實現像WC3 Game Searcher 一樣強大的功能就繼續分析魔獸資料包羅...
監聽本地的6112連接埠,在他發UDP包的時候就把這個包轉寄到不同網段,這就要用到原始通訊端了……
用UDP協議也行,不過要用到SO_REUSEADDR屬性,連接埠重用,但是這裡有個問題,就是當你把通訊端重綁定到6112連接埠時,魔獸退出了區域網路,而當魔獸要再進區域網路的時候就會出現 不能串連網路 的錯誤,因為連接埠被你的socket綁定了嘛,魔獸的通訊端是沒設定SO_REUSEADDR屬性的...
然後後面就是一個詳細的主機資訊包,有主機名稱,地圖資訊,當前遊戲人數等,我就不繼續分析啦,有興趣就看心語的那篇文章……
這裡提供一個思路:
在對戰平台玩魔獸就不會不知道有個工具叫T人掛,其原理就是當你是主機的時候斷開與玩家的TCP串連,而目前大部分的T人掛都不能做到指定玩家T人,只能根據進主機的先後順序看分配的連接埠大小對應關係來判斷,有個工具除外,就是Shadow French 的W3XCustomKick
他是讀魔獸的記憶體來得到玩家ID跟連接埠號碼的對應關係的(巨牛B啊),有興趣的可以拿著Smart Check去慢慢跟蹤,不過我保證你看到後會想哭……如果從TCP串連入手的話,就能很容易得到玩家ID跟連接埠號碼的對應關係,但前提是你得從建主機前就開始監聽……
下面是同學加入我主機時發過來的一個TCP包
00000000 F7 1E 32 00 02 00 00 00 C4 D4 85 03 00 E0 17 01 ..2..... ........
00000010 00 00 00 57 6F 72 6C 64 43 72 65 61 74 65 72 00 ...World Creater.
00000020 01 00 02 00 17 E0 3A 14 58 21 00 00 00 00 00 00 ......:. X!......
00000030 00 00 ..
從上面可以看到使用者名稱就是World Creater
挺邪惡的,有興趣的就研究下……
本文提到的工具下載:
抓包工具:
WSockExpert
http://download.csdn.net/source/1820067
SmartSniff
http://download.csdn.net/source/1820078
附上我寫一個樣本lancraft,裡面整合了簡單的MH功能
WC3TOOL
http://download.csdn.net/source/1819854