魔兽局域网协议UDP部分详细解释
魔獸局域網主要有4種消息?
第一種、搜索游戲:?
F7 2F 10 00 50 58 33 57 15 00 00 00 00 00 00 00 ?PX3W?
這個格式比較簡單。?
F7 2F 10 00 是格式頭部,消息含義的標志。?
50 58 33 57 是PX3W幾個字,就是冰封王座的逆序。?
15 00 00 00 是版本號,0x15=21,即是1.21版的冰封王座在搜索游戲。?
00 00 00 00 是某個魔獸的標志,看似無意義,實際很重要。后面會說明。?
魔獸在多種情況下都會發布此消息,例如剛進入局域網,從游戲中退出,從創建的游戲中退出等等。?
第二種、結束游戲:?
F7 33 08 00 00 00 00 00?
F7 33 08 00為消息內容標志,00 00 00 00同第一種消息,后面說明。?
魔獸在收到此消息后會從游戲列表中刪除對應IP的游戲。?
魔獸在取消游戲或者開始游戲時會發送此消息。?
第三種、LANTag?
這個是魔獸中傳輸次數最多的消息。短小但是作用多。?
F7 32 10 00 00 00 00 00 01 00 00 00 00 00 00 00 ??
F7 32 10 00 消息標志,不多說了。?
00 00 00 00 神秘標志。?
01 00 00 00 忘了,貌似是固定值?
02 00 00 00 空余位置數+1?
那個特殊的標志是什么呢?那個就是魔獸創建游戲的次數。?
它表示了當前是第幾次游戲。關閉游戲后重置為0。看似這個是沒什么用的標志,但是魔獸程序對收到的消息中這個值不對(和當前系統游戲次數不同)的消息都是無視,例如創建了8次游戲的魔獸服務器(主機),對F7 2F 10 00 50 58 33 57 15 00 00 00 01 00 00 00是沒有反映的,F7 2F 10 00 50 58 33 57 15 00 00 00 08 00 00 00才能正常的返回游戲信息。但是作為一個特例,所有主機對00都有響應。但是其中還稍有不同。我們先把這個標志成為tagcount。?
這個LANtag有很多用處。處于等待狀態的魔獸收到lantag后會發送一個tagcount和lantag中相同的搜索游戲消息(第一種消息)。已經搜索到對應IP創建的游戲的魔獸會根據lantag改變游戲列表中空余位置的顯示。同時tagcount=00的特殊性就體現在這里,搜索到某IP創建的游戲的魔獸對00會返回搜索游戲消息,而不管是從哪個ip發來的,而對從該IP發送過來的tagcount不等于0的lantag無返回消息。?
第四種、游戲信息:?
F7 30 8B 00消息標志,略過。?
58 33 57 15 冰封王座標志,略過。?
15 00 00 00 版本號。?
01 00 00 00 tagcount,請參考上文。?
39 0A E5 01 未知,每次消息都不同?
00 01 03 49 07 01 01 55 01 D1 55 01 0D 65 C3 9B:未知,包含例如是否開圖,是否開啟裁判等信息。?
E5 BD 93 E5 9C B0 E5 B1 80 E5 9F 9F E7 BD 91 E5 86 85 E7 9A 84 E6 B8 B8 E6 88 8F 20 28 46 6C 00:UTF-8的局域網游戲名稱“當地局域網內的游戲 (Fl”。?
4D EB 61 71 73 5D 69 65 73 A1 75 5D?
29 33 29 55 65 75 73 65 6F 61 73 53 75 63 61 6F?
65 2F 77 33 79 B1 01 47 6D 79 69 6F 67 1B 53 6F?
6F 77 01 01?
一段簡單加密的信息,地圖和創建者信息。加密規則如下。?
從"(Fl/0"后開始往后第10個字節開始,每8個為一個加密組,例如:?
D1 55 01 0D 65 C3 9B 4D為一個加密組,D1為密鑰。?
EB 61 71 73 5D 69 65 73為一個加密組,EB為密鑰。?
其實是一段簡單的奇偶校驗加密。?
0xEB=11101011。將二進制字符串逆序取反為00101000,所以,正確字符串為:?
EB-0 61-0 71-1 73-0 5D-1 69-0 65-0 73-0?
其中密鑰位舍去,得61 70 73 5C 69 65 73即為aps/ies?
如此解密此部分數據為:?
Maps/iest/(2)EchoIsles.w3x/0FlyingSnow/0/0?
/0為結束符,即二進制00。?
最后以一個00最結束。?
02 00 00 00:游戲總共允許玩家。?
01 00 00 00:未知,似乎是電腦數。?
01 00 00 00:未知,似乎是玩家數。?
01 00 00 00:剩余空位。?
08 00 00 00:未知。似乎是定值。?
E0 17=0x17E0=6112,游戲端口。?
至此分析完畢。?
游戲數據流程是,魔獸發送搜索信息->接受游戲信息->根據Lantag調整空閑人數。?
魔獸啟動局域網時會發送一個搜索信息廣播(僅當前子網),僅廣播一次。?
當新游戲主機加入時,該游戲主機廣播一個Lantag,魔獸收到Lantag后向該主機發送搜索消息。游戲主機在創建完游戲等待加入時每隔一段時間廣播一個Lantag。游戲主機的空閑位置有任何變化時廣播Lantag。?
取消或開始游戲后發送結束消息
最近老有人問我是不是出了改dota英雄技能的外掛,什么月騎無限大,劍圣無限斬,巫妖無限彈之類。
我在這里一并回答一下,并且稍微說說原理。因為我對地圖方面其實是一竅不通,如果有說的不對的地方,還請指正。
其實這些現象都是使用了作弊地圖導致的。本來魔獸爭霸是有一個地圖驗證的,如果你跟主機的圖不同,是進不去的(要下載地圖)。但是魔獸對地圖中的war3map.j文件是進行bcc(block check character)校驗的,bcc不同于md5,bcc一般只是用來排錯的,并不是加密算法。所以就有人寫出了這樣的代碼,可以在b文件末尾添加上一些不起作用的字串,來讓b文件的bcc校驗碼等于a文件(具體代碼我就不貼出來了,很容易搜到)。于是呢,我們就可以做到隨意修改地圖中的war3map.j ,然后再處理一下,使之跟原來的war3map.j的bcc校驗碼相同。再把改過并處理后的war3map.j文件替換原來的,這樣做出來的作弊地圖,暴雪的驗證會因為bcc校驗相同,而把它認為和原版圖是相同的。達到的效果就是,別人用正版圖建主機,你可以進入,你用盜版圖建主機,別人用正版圖也可以進入。但是別以為可以為所欲為的修改war3map.j ,雖然你突破了驗證這一關進入了游戲,但是魔獸的聯機機制是沒有辦法突破的。
在這里稍微談一下魔獸的聯機機制,沒興趣的請略過這一段。魔獸聯機時,一直有個同步機制,每個聯機的玩家都會同時計算所有數據,一旦有不一致,就會導致掉線,這也是為什么用金山游俠之類的游戲修改器單機時可以改錢,聯機時一改就掉線。因為你只能修改你自己的機器上的數據,而無法改別人的,單方面修改的結果就是造成你跟其他人不同,你就會掉線。當然,如果所有人同時修改的話,仍然是不會掉線的,所以現在有一些聯機修改器,參加游戲的幾個玩家一起開這個修改器,可以在玩rpg時改錢什么的,我幾個同學就老是用這種修改器來通關一些很難打的rpg圖。順便說一下,這樣玩下來保存的replay是無法正常播放的,因為replay只記錄動作,你使用修改器的改動不會被記錄,播放replay時會因為你并未像你游戲時那樣修改數據,造成replay不合邏輯而出錯。再順便說一下吧,為什么所謂的人品外掛并不能實現。曾有人發帖抱怨,怎么藍胖子次次放招都多重施法,怎么某人每次都暴擊,他們是不是用了人品掛。其實這是不可能的,有人以為魔獸中的隨機數據都是由主機計算的,這樣主機就可以找到辦法來修改隨機數,造成每次都對他有利的結果。但是實際中并非如此,隨機數也是所有人一起計算的,也就是說魔獸里的隨機是個偽隨機。在一局游戲一開始時,主機會發給每個玩家一個隨機數種子(這個種子很有可能就是主機從建立主機到游戲開始所經歷的毫秒數),之后的一整局中,所有的隨機數都根據這個隨機數種子,依照事先定好的算法計算出來,這樣也就保證了所有人計算出同樣的“隨機”結果。另外,這個隨機種子也會記錄進replay,這也從一個側面說明了魔獸里的隨機是偽隨機,如果是真的隨機,replay就無法重現了。說的有點多了,下面回到正題。
因為魔獸聯機機制的存在,你要是隨意改了war3map.j,例如改成給自己增加10000的錢,但是別人是按照的沒有修改的war3map.j,在別人機器中你是沒有那么多錢的。這時你買一個8000的物品,在你自己機器上是可以的,因為你有10000的錢,但是在其他人機器上,你錢卻根本不夠!這樣的不合理動作就會造成你跟其他人斷開連接。
也就是說,你只能修改那些不會造成沖突的地方。例如有些作弊圖可以顯示出地圖全開的效果,因為這些顯示的東西只是在你本地機器上顯示出來的,并不會對其他玩家照成沖突。類似這樣的修改都是可行的,不會掉線。
那么,為什么會出現這種有變態技能效果的dota作弊圖呢?我剛開始也很困惑,這么夸張的改動怎么竟然沒有掉線?我跟朋友要了個作弊圖玩的replay,在我的機器上,用正版dota地圖播放,竟然完全再現了那些變態效果!因為我對地圖方面并不了解,所以開始上網找資料,并通過qq向某些搞地圖的高人請教,又下載了那個變態版dota作弊圖和某平臺私自山寨的所謂“原版”dota圖,提取出來war3map.j來進行對比。經過n久的努力,總算搞明白他是怎么改出來這種效果的了。
原來是因為dota使用到了game cache,而作弊圖是單方面修改了game cache中的數據,然后通過函數同步給了所有的玩家。通俗點說,game cache相當于一個池子,所有玩家共享這塊區域,任意一個玩家都可以修改這個池中的數據,也可以發出通知,讓所有人都來同步這個池子,這樣就變相修改了其他人的數據。舉個例子,例如dota里黑曜石的放逐技能,它可以減少一個人的智力,一分鐘后再歸還給他,dota里關于這個技能的函數,把目標和要歸還的智力值記錄在game cache中,1分鐘之后會再從game cache取出目標和智力值,給目標加上相應的智力值,就完成了歸還這個人的智力的過程。但是在作弊圖中,這里增加了代碼,先進行一個判斷,如果黑曜石是本機玩家,會把game cache中記錄的目標改成本方隨機的一個隊友,然后把game cache中記錄的智力值改為500,然后通知所有玩家同步game cache中的這兩個值,這樣就完成了對所有人game chche中這兩個值的修改。1分鐘一到,dota就會向這個目標“歸還”智力,這樣,本方的一個玩家就憑空增加了500智力。(那個被減少智力的倒霉玩家就無法被歸還了,可憐)
大致的原理就是這樣了,具體細節我就不詳細敘述了。不過dota用到game cache的地方其實并不多,所以能改的地方也就那幾個。這也是為什么作弊圖要專門改這幾個地方,而不是改成例如加錢或者加攻擊力或者直接勝利之類的,不是不想改,而是無法實現。另外,暴雪官方的地圖是不會這樣使用game cache的,所以不用擔心對戰地圖被改(另外對戰圖還有暴雪標志的保護)。其他的rpg地圖,如果本身沒有用到game cache的,也就改不出來什么花樣,最多顯示個全圖之類。
暴雪將會在1.23修補這個地圖驗證漏洞,目前1.23的補丁已經在測試中了,相信升級之后,這種改圖作弊將不復存在。只是不知國內玩家到時是不是還要繼續死守bug頻出的1.20呢?
強行插入廣告一則:浩方平臺會再對地圖進行自己的驗證,md5驗證,作弊圖是無法通過的。
至于做山寨dota圖的某平臺嘛,就我目前來看,它是沒有任何地圖驗證的,唉。
?
主要UDP包:
收索包:
內容:F7 2F 10 00 50 58 33 57 15 00 00 00 00 00 00 00
功能:向主機提出收索信息。問別人“你建什么主機?”
在打開魔獸進入局域網的時候,會向當前網段(255.255.255.255)廣播這個包。只要條件符合,收到這個包的主機都會返回一個地圖信息給他(他:這個收索包的IP端口)
主機包:
內容:F7 32 10 00 00 00 00 00 01 00 00 00 00 00 00 00
功能:告訴別人:“我建主機了,要不要看看。”
建立主機的時候開始,向當前網段廣播這個包,每5秒鐘一次。收到這包的客戶機會發送搜索包。
地圖包:
內容:??
F7 30 8C 00 50 58 33 57? 14 00 00 00 01 00 00 00??
39 69 C2 00 E5 BD 93 E5? 9C B0 E5 B1 80 E5 9F 9F??
E7 BD 91 E5 86 85 E7 9A? 84 E6 B8 B8 E6 88 8F 20???
28 76 73 00 00 01 03 49? 07 01 01 77 01 B9 79 01???
99 D5 B9 31 4D CB 61 71? 73 5D 45 6F 77 19 6F 6D???
6F 61 65 5D 45 2B 6F 75? 41 21 41 6D 6D 2B 73 75??
61 73 73 21 77 B1 37 2F? 37 31 63 2F 77 23 33 79???
01 77 73 01 01 00 0A 00? 00 00 01 00 00 00 01 00?
00 00 0A 00 00 00 1B 00? 00 00 E0 17??????????????
功能:“這就是我所建的圖,你好好看。”
主機收到搜索包之后就把這個包返回給他,包括所有有用信息。
魔獸的工作流程
魔獸進入局域網的時候會廣播一個搜索包,只發送一次。只發送當前網段(255.255.255.255),所以我們的魔獸只能看到本寢室,或者少數幾個寢室的幾個主機。
建立了了主機的魔獸收到之后就會發送一個包給他,這個包就是地圖信息,包括地圖信息,主機名,加入了多少人,剩下多少位置,還有一個重要的數據就是游戲的端口。一般魔獸的端口是6112.
建立主機的魔獸會向本地發送一個包,“我建立主機了”
搜到這條消息的魔獸會發送一個搜索包給主機。
主機就發送 地圖信息。
收到之后就解析地圖,這時候大家就看到了有人建主了?????????????????? 點擊加入·?~? 建立tcp連接 一直到推出主機的游戲
ps:?一場游戲下來,和主機發送的包 大概25MB(半小時) 主機收發的包就是 9*25 MB/30 min ;//按照dota計算 一個主+9個客戶端的10人游戲。 這樣粗略的估計主機的網速要求就是 9*25*1024/30*60=128>100 kb/s 加上一點點別的程序所要的通訊包。要想不卡,主機的網速需要保證這個數吧。
關鍵技術
1,監聽主機(建立了魔獸地圖的機器)的地圖信息。
??????
????? 有兩種方法能獲得地圖信息,一種是抓包,把所有的和6112端口有關的包都抓過來分析。(個人覺得這樣電腦的負擔太大了)。現在的多數搜索器都是這樣實現的。
????? 但是Java要實現抓包不是很容易。c++能實現這個功能,可以考慮用c++編譯一個dll。Java調用。或者用開源項目。搜搜就能找到。
??????
????? 我用的方法是建立一個線程。每5秒鐘發送一個包收索本機是否建立主機。如果自己建立了主機,則會返回一個地圖信息包。收到之后告訴其他ip“我建主了”;
????? 這樣客戶端就不需要一直發送搜索包了。
????? 找到了主機,一切都好辦了。
?2,告訴別人我建主機了
????? 如何告訴別人我建立了主機。很簡單,建立了主機的魔獸會每5秒鐘發送一個包給當前網段,告訴別人我建主機了。
????? 我們只要把這個包發送到其他ip的6112端口就ok了。就是告訴別人“我建主了”,收到的人就會發送一個包:“看看什么圖”,然后主機就會回復一個包,沒錯這就??? 是地圖信息!
??????
?3,解析地圖
????? 不解析地圖不會對游戲產生任何影響。因為魔獸接受地圖包,自己解析,它很明白這圖是什么。但是解析地圖,你可以知道主機建立的這個地圖是什么,主機叫什么??? 名字,有幾個人加入,有幾個電腦。還有幾個空位置。主機是什么版本。這些很有用的信息在軟件上顯示出來時很有用的!
????? 關于UDP包的解說有好多的文章。大家可以去google上搜索一下,關鍵字?魔獸 UDP?
????? 我這里就幾點補充。
這個是網上的:
02 00 00 00:游戲總共允許玩家。?
01 00 00 00:未知,似乎是電腦數。?
01 00 00 00:未知,似乎是玩家數。?
01 00 00 00:剩余空位。?
08 00 00 00:未知。似乎是定值。
E0 17=0x17E0=6112,游戲端口。
02 00 00 00:游戲總共允許玩家。?
01 00 00 00:未知,這似乎是定值。?
01 00 00 00:已知,這就是是玩家數。?
01 00 00 00:已知,除電腦外的所有空位。?
08 00 00 00:未知。不斷變化著……。
E0 17=0x17E0=6112,游戲端口。
?
?
// 這個數是這樣計算的:除電腦外的所有位置,包括已經有人的位置,例如總數是10個,加了3個電腦,則這個數就是7,不關那7個位置是否有無人。
這里把地圖的解析代碼貼出來。
?
view plaincopy to clipboardprint??
總結
以上是生活随笔為你收集整理的魔兽局域网协议UDP部分详细解释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: acpi_hardware_id可以通过
- 下一篇: 底层表大全