免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動!
內容參考于:圖靈Python學院
上一個內容:29.第二階段x64游戲實戰-技能冷卻
發送數據包的方式(函數)操作系統提供
1.send
2.sendTo
3.WSASend
4.其它非操作系統提供,自己封裝的發包函數(它雖然是自己封裝的,但是底層還是用操作系統的函數,所以還是可以找)
下圖是網絡游戲和服務器交互流程(發送網絡數據包,簡稱發包)
游戲客戶端和游戲服務器
游戲服務器是在游戲公司那邊,游戲公司它會發布一個pc端exe的版本讓我們下載(游戲或者叫客戶端),也就是下載游戲,下載安裝到我們自己的電腦上面,安裝好運行、登錄,登錄就開始給服務器發送消息告訴服務器我們的角色上線了,然后服務器就會把我們角色相關的數據返回給我們(進入的地圖場景、身上的裝備、背包物品等各種各樣的數據,統統發送給我們),在游戲中我們看到的游戲界面實際都是本地(我們電腦中的內存)數據,是我們電腦本身的數據,比如說我們的電腦斷網了,游戲還是存在還是可以看得到游戲的界面,但游戲會提示網絡超時、掉線等,但游戲還是存在的一些數據也是存在的,還是一樣的有場景、有文字、有我們游戲角色、有攻擊力、裝備等畫面還是存在,斷網了只不過我們的游戲沒辦法和游戲服務器相互傳輸數據了而已,只是傳輸的這個線斷了,我們的數據發不過去,游戲服務器的數據發不過來,現在知道發包這件事之后再看游戲中吃藥這個事,點擊藥物之后血量會增加,它實際上是點擊藥物之后,給游戲服務器發送一個吃藥的事情,然后服務器把最新的血量給我們發過來,我們游戲看到的血量增加只是一個顯示效果,這里就要分清一個東西,游戲中那些操作會進行發包,那些不會進行發包,比如打開背包、關閉背包、打開人物信息窗口、關閉人物信息窗口這些功能就沒必要告訴服務器這種東西不是很重要沒有意義,所以這些東西就不會有發包,也就是斷網了也能正常使用,然后比如移動這個東西要不要告訴服務器,這肯定要告訴服務器的,再比如說背包里的貨幣,這種是最影響戰斗力的東西很重要它就會經過服務器校驗,就比如背包里顯示的貨幣有55,這個55只是本地的,只是供給我們看的,實際用錢的時候,服務器會拿服務器中的貨幣來做校驗,所以就算我們本地把貨幣改成9999也沒有用,這只是改的本地,服務器沒有改
我們玩家和游戲
在 游戲客戶端和游戲服務器 中寫了,敏感操作都會發送一個數據包,比如買東西時的貨幣、人物屬性變化這種敏感操作都會給服務器發送一個數據包,這個數據包是怎么發送的呢?發送數據包它是通過一個公共函數(公共call),最開始寫了發送數據包的4種方式,當我們觸發了一個需要發包的操作,比如移動,它就會拼接移動的數據包,比如我們當前坐標、目的地坐標,還有個數據包頭,數據包頭用于告訴服務器當前是移動還是吃藥還是釋放技能等,拼接完數據包之后,一般游戲會為了防止被抓包,會加密數據包,然后調用發送數據包函數,把數據包發送給服務器,然后服務器接到我們的數據包,執行服務器對應的代碼執行完把結果返回給游戲,然后游戲會進行解密數據包,然后通過數據包的描述執行對應的代碼,比如移動
通過上面可以看出,我們觸發的移動只是讓游戲發送一個數據包,至于移動不移動要看服務器返回的數據包
然后移動、釋放技能等會觸發發送數據包的操作會有很多,所以游戲開發者不可能給移動專門寫一個拼接數據包、加密、發送數據包的代碼,也不可能給釋放技能專門寫一個拼接數據包、加密、發送數據包的代碼,如果每個都單獨寫拼接數據包、加密、發送數據包的代碼會很費事,所以所有發送數據包的操作使用的拼接數據包、加密、發送數據包的代碼都是同一個,所以拼接數據包、加密數據包一般都是游戲開發者自己寫的,我們沒法找,但是發送數據包的操作它只能使用操作系統提供的,所以我們在操作系統提供的發送數據包函數設置斷點,就能找到加密之前的數據包,然后分析數據包結構,然后模擬數據包,然后把模擬的數據包發送給游戲服務器,這就可以實現一些東西,比如自動喊話
當前的游戲它使用的是send函數發送的數據包,把send、sendTo、WSASend全部設置斷點,誰的斷點觸發了游戲就用的誰,如果都沒觸發那就找ws2_32.WEP函數,這個函數是Windows系統的用戶層發送網絡數據包的底層,不調用 send、sendTo、WSASend那一定會調用WEP函數