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