內容參考于:易道云信息技術研究院VIP課
上一個內容:模擬游戲登陸器啟動游戲并且完成注入
首先正常分析軟件程序有沒有漏洞,需要通過它的操作侵入,比如買東西,就通過買東西的按鈕它背后有源代碼就看源代碼,沒有源代碼就逆向分析,然后嘗試性的去修改它的參數,然后看看有沒有什么不合理的地方有沒有漏洞,對于網絡游戲來講前面說的東西就沒必要了,因為網絡游戲里不管你是吃藥也好、走路也好,所有操作最后它一定是通過數據包的形式反映給服務器的,所以就直接觀察它的數據包,或者說我們模擬數據包的發送,直接就進行測試,這樣它有什么限制不嚴格的地方就可以看出來了。
游戲客戶端與服務端協作形式:有兩種
1.
????????發送結果型,比如我們吃藥,它的做法是,首先在界面里按了一個吃藥的操作,按下之后生命值就會增加,這個時候在客戶端就會看有沒有藥、有沒有cd、能不能吃,能吃就增加了,本來還有1點生命值吃藥之后100點,這時就要寫到服務器,把100發送給服務器,這個操作存在漏洞,在發送之前這個100我們是可以更改的,這種操作它往往會有加密的技術,防止被修改,但是不管怎樣這種結構就決定了是可以更改的,防止不了,大部分游戲不會采用這種結果,但是也有(某勇士)。
2.
????????這一種由UI的操作吃藥,還是檢測有沒有藥,有沒有cd、能不能吃(這里檢測是為了讓服務端壓力變小),這個時候發送請求吃藥(告訴服務器我要吃藥了),服務器收到吃藥請求就去看服務器上的數據(就是服務器再去判斷能不能吃藥、有沒有cd、能不能吃),服務器驗證完成得出可以吃藥就把數據寫到數據庫里(完成吃藥),然后就給客戶端說吃藥完成了,這樣的過程可以攻擊的點就很少。
????????大部分游戲都是第一種和第二種相互結合的,要明白一個道理,安全的本質不是技術的對決,而是經濟的對決,比如走路這樣的操作,如果服務還是頻繁驗證的話是比較浪廢性能的,走路這種請求會頻發觸發如果服務器還驗證會導致很卡,所以服務器會不得不放棄一些驗證的操作,改用第一種結果式,就是把結果給服務器比如走路的坐標,這就造成了漏洞、
還有本質上用的是第二種,但是第二種它是連續性的,比如要三個第二種操作才能完成一件事,其中一個被人為修改掉也會造成漏洞,不管怎樣說核心的點都在網絡通信的地方。
現在主線任務:
通過逆向分析,找到游戲發送數據,接收數據的過程,這個是很好找的,找到這個過程利用起來是不方便的,因為游戲往往都有加密的過程,所以要找它明文發送數據的位置,因為只有找到這種地方才能很好的利用,找到這種地方之后就可以接收數據發送數據了,這樣就可以既可以欺騙客戶端又可以欺騙服務端,這樣測試漏洞就很方便了,找到漏洞之后要給出修改的建議,就是我們很清楚攻擊什么位置,面對這種地方的攻擊我們應該怎樣防護,現在搞是跟安全有關的事情,然后這樣的測試是很有必要的大量的網絡游戲或者大量的游戲都有這樣的漏洞,比如以前的吃雞(絕地求生)飛天遁地瞬移秒殺千里萬里子彈都是這種情況
游戲數據包的處理流程:
客戶端發送數據:
????????首先ui操作,比如吃藥操作,就會根據吃藥組織一個數據包給服務器,一般組織數據包的地方就是明文,為什么是明文,如果不是明文搞的很復雜,在開發的時候也是費勁,所以組織數據包的位置就是明文,比如01代表吃藥02代表使用技能,然后組織的數據包就是 01 23,這個23就是代表吃的什么藥,然后01代表吃藥,然后02 01,02是使用技能01代表的技能,如果說可以用wpe一類的軟件可以截取到這個數據直接改,就是不去動游戲而是在網卡這個階段,就能把這個東西給截取到,所以游戲往往在組織完數據之后會有一個加密的操作,加密完才發送,然后現在可以看出攻擊的點就在組織數據的位置。
客戶端接收數據:
? ? ? ? 接收數據之后,然后解密數據,然后根據包的內容調用對應的函數(分發數據),然后使用數據(函數執行中),然后現在看攻擊的點就是分發數據這里,然后解讀雖然是明文,但也不是很容易,但是真的可以全部解讀出來以后會發現,大部分逆向工作都不需要做了
游戲網絡通信架構模型:
單線程:
直接看發送數據的這里,首先我們寫代碼是一行一行的,然后調用一個函數之后,這個函數執行完返回之后再繼續往下,然后假設這個函數是發送數據的,如果數據特別大,沒發送完它就會卡住(阻塞),所以這種單線程模式用的比較少,這種模型,通過發送數據往回找可以找到組織數據,從ui操作往后找可以找到組織數據,接收數據時就是通過接收數據往后找可以找到解密數據之后分發數據之前,然后通過使用數據往后找也能找到分發數據前,只要它是這種模型就能找到。
然后使用數據,比如血量增加了,通過血量的變化就能找到分發數據之前
多線程:
它與單線程的不同是加密完數據之后寫到一個緩存里,然后線程b去讀取緩存然后發送數據,這種的從發送數據的位置就找不到組織數據的位置了,然后從ui操作找后面的東西也是找不到,這樣的要找那塊緩存空間,通過緩存空間的讀寫來找
接收數據也是通樣的道理
一般就這兩種架構
游戲網絡通信常見函數:
send、recv 一般用于tcp通信,默認為阻塞型通信。
sento、recvfrom 一般用于UDP通信,它可以直接根據指定ip和端口進行訪問,不行創建socket,微信和qq應該用的就是這個
WSASend、WSARecv 天生異步操作,配合完成端口使用(看這里:iocp完成端口,詳細簡單的完成端口使用)
recv:
recv之后就是處理數據
?WSARecv:
要去找?GetQueuedCompletionStatus 函數,詳情看?iocp完成端口?這里。