逆向思維 魔獸世界封包分析 1

2022-06-22 02:18:10 字數 3204 閱讀 5586

一、登入模組流程及封包分析

我們先看登入流程。從封包流程來看,魔獸的登入流程是這樣的:

1.由client向登入/賬號伺服器(login server)傳送使用者名稱及密碼等資訊。此資料報的最後部分是使用者名稱(明文表示,未加密),在使用者名稱的前乙個位元組表示的是使用者名稱的長度。登入/賬號伺服器向client返回登入成功及後續連線到遊戲伺服器伺服器所必備的資訊等。這中間的兩個來往資料報,我還沒有看出具體有什麼作用。在這個互動過程中,由登入/賬號伺服器向client傳送所有的遊戲伺服器列表,伺服器列表資料報的內容包括:ip, port, 伺服器上所擁有的角色個數等資訊,因伺服器列表內容過多,被客戶端分為兩次接收完畢。

2.client收到login server的伺服器列表後,根據最近訪問的伺服器標識(這個資訊應該是包含在那個伺服器列表資料報中),連線到最近遊戲的那個遊戲伺服器(game server)。連線成功後,game server首先向client傳送乙個8位元組的資料報,據以往的常識判斷,這個資料報的內容很可能是以後客戶端與伺服器通訊的加密金鑰。

3.client向game server再次傳送自己的賬號資訊。game server與client經過兩個資料報的互動後,向client傳送角色資料報,此包中包括了玩家在該game server所建立的所有角色資訊,當然這個資訊只是部分的,並不是該角色的所有資訊。

4.在此後的通訊過程中,client每隔30秒向game server傳送乙個保持連線的包,該包長度為10位元組,包的最後四位元組是乙個遞增數字,前面6位元組暫時未看出規律。

5.只要client沒有點選某個角色進入最終的game server,則client要始終與login server保持連線。當client點選角色進入game server時,client才與login server斷開連線。在以後的遊戲過程中,client始終與且僅與該game server進行資料通訊。

通過對登入流程中的資料報初步分析,可以得出以下幾個結論:   1.client向login server發的第乙個資料報,使用者名稱部分是採用明文的,且該資料報的內容,每次登入都一樣,並沒有因時間的不同而發生改變。由此可以推算:針對於此資料報中的密碼加密演算法是固定不變的,換句話說,密碼的加密演算法是比較容易通過逆向工程被找到的。偶認為,針對於此處,伺服器也應該先向客戶端傳送乙個加密金鑰,以後的通訊可以用該金鑰作為安全驗證的依據。但暴雪沒有這樣作,最大的可能是為了提高伺服器的效率,在登入伺服器上,如果每個客戶端一旦連線成功,登入伺服器都得向客戶端廣播乙個資料報的話,可能這個量還是比較大的,這可能延長了玩家的登入等待時間,所以他們沒有在這塊作。

2.client在登入login server的位址,每次login server的登入位址都可能是不一樣的。偶沒有在客戶端目錄裡找到這些位址,只在客戶端目錄裡找到了四個大區的四個網域名稱,我猜想,魔獸世界是用的dns解析的簡單方法來實現login server的簡單動態均衡的。不知道這個猜想是否正確。

3.「根據玩家最近在玩的哪個遊戲,由客戶端和伺服器自動為玩家選擇進入這個遊戲伺服器」,這一項設定充分體現了暴雪一貫的風格:為玩家著想,最大限度地提高遊戲的舒適度。再次對暴雪的態度予以肯定!

4.一旦玩家進入了遊戲世界,客戶端與伺服器的通訊埠會一直保持不變。即:魔獸世界的遊戲世界伺服器群設計結構採用的是帶閘道器的伺服器集群。

5.偶覺得在整個的登入流程中,讓我產生最大疑問的就是login server與client的連線保持邏輯。當client與game server連線了之後,client並未與login server斷開,是一直保持連線的。後來,經進一步的抓包分析,client之所以要與login server保持這樣的連線,是為了當client重新選擇伺服器時,不至於重新連線login server。當client點選了"選擇伺服器"按紐後,login server會每隔5秒向client發乙個當前所有的伺服器列表資料報。要知道,這個伺服器列表資料報的內容可是非常大的,如果有玩家就開啟了這個視窗不關閉,login server向這種情況的所有玩家每5秒鐘就發乙個伺服器列表資料報,這個廣播量可是很大的哦(2k左右,這可是乙個使用者是2k哦)。偶認為這裡的邏輯設計是相當不合理的。login server如果為了給客戶端提供乙個最新的全域性伺服器列表,可以保持連線,但也沒必要每隔5秒就向客戶端發乙個伺服器列表,最多隻在客戶端在某個伺服器上建立了不同的角色後再更新這個列表也是可以的,但只用更新這個列表中的變化內容即可,不用發全部的完整包,這樣,在通訊量上就小了很多。據說,魔獸剛開始的時候,產生down機的原因就是登入模組沒有處理好,偶不知道現在的這個情況是不是已經經過改良的了。但偶還是認為每隔5秒就向客戶端傳送乙個2k的包,這一點是不可以被接受的。

以上只是針對於魔獸世界登入流程的簡單分析,沒有多少技術含量,拿出來跟大家相互討論討論,看看有沒有可以借鑑的地方,後面還會有其它部分的封包分析。歡迎繼續關注偶的blog:

偶在文章前面部分說過,作為乙個網路程式設計人員,熟練使用截包軟體和掌握基本的封包分析方法是其基本能力之一,發此文的目的乙個原因也是希望向正在作網路程式設計的兄弟介紹一下相關工具的使用和常見的分析方法。下面補充一下關於封包分析的基本方法和相關工具:

1.你需要乙個截包工具,偶推薦:commview,小巧但功能強大,支援自定義的封包分析外掛程式以dll形式裝載,也就是說只要你願意,你可以寫個dll對某類特殊形式的包進行顯示、記錄、解密等特別處理。

2.如何檢視真正的封包資料。在commview裡,會詳細列出自網絡卡級別以上的各層封包資料,包括ethernet層,ip層和tcp層。而我們作封包分析時,只需要關注tcp層。但tcp層裡也有很多內容,對於我們的分析需求來說,我們需要關注的是其data欄位(在協議目錄裡可以看到"data length標識,點選即可檢視data段")的內容。

3.tcp的幾個狀態對於我們分析所起的作用。在tcp層,有個flags欄位,這個欄位有以下幾個標識:syn, fin, ack, psh, rst, urg.其中,對於我們日常的分析有用的就是前面的五個字段。它們的含義是:syn表示建立連線,fin表示關閉連線,ack表示響應,psh表示有data資料傳輸,rst表示連線重置。其中,ack是可能與syn,fin等同時使用的,比如syn和ack可能同時為1,它表示的就是建立連線之後的響應,如果只是單個的乙個syn,它表示的只是建立連線。tcp的幾次握手就是通過這樣的ack表現出來的。但syn與fin是不會同時為1的,因為前者表示的是建立連線,而後者表示的是斷開連線。rst一般是在fin之後才會出現為1的情況,表示的是連線重置。一般地,當出現fin包或rst包時,我們便認為客戶端與伺服器端斷開了連線;而當出現syn和syn+ack包時,我們認為客戶端與伺服器建立了乙個連線。psh為1的情況,一般只出現在data內容不為0的包中,也就是說psh為1表示的是有真正的tcp資料報內容被傳遞。tcp的連線建立和連線關閉,都是通過請求-響應的模式完成的。

逆向思維 魔獸世界封包分析 2

封包分析的手段,說簡單也挺簡單的,那就是 比較!要不斷地從不同的思維角度對封包進行對比分析,要充分發揮你的想象力不斷地擷取自己需要的包進行比較。不僅要作橫向 同類 的比較,還要作縱向 不同類 的比較。即時對於同乙個包,也要不斷地反覆研究。初涉封包分析的新手,一般會不知道封包分析究竟該從何入手。基於經...

逆向思維 魔獸世界封包分析 2

封包分析的手段,說簡單也挺簡單的,那就是 比較!要不斷地從不同的思維角度對封包進行對比分析,要充分發揮你的想象力不斷地擷取自己需要的包進行比較。不僅要作橫向 同類 的比較,還要作縱向 不同類 的比較。即時對於同乙個包,也要不斷地反覆研究。初涉封包分析的新手,一般會不知道封包分析究竟該從何入手。基於經...

魔獸世界程式設計寶典讀書筆記 1

第1章關於魔獸世界的程式設計 1.1定製使用者介面 魔獸世界的遊戲客戶端包括兩個部分 遊戲世界和使用者介面。遊戲世界是乙個三維世界,這些元素在指令碼語言的介面中是不容易訪問並且不能改變的。使用者介面由遊戲客戶端的其他元素組成,包括了動態按鈕 單位窗體 地圖和選項視窗。作者們可以通過編寫外掛程式來新增...