“黑客”深度學習之“遊戲外掛原理與實現”

“黑客”深度學習之“遊戲外掛原理與實現”

最近很多熱愛玩遊戲的朋友看了我文章後,經常私信問我,"你是黑客嗎?"我回答"我是一個白帽子黑客"。"那能不能幫我攻入遊戲系統做一款遊戲外掛,咱們一起賺錢?"我就只能呵呵了,肯定是不可以的,技術上雖然可以實現但是原則上一定不要那麼做。

首先大家可以學習如何做外掛,也可以自己在家用單機遊戲做外掛來測試,這樣既能提高自身技術又能滿足自己的好奇心,但是如果為了謀取利益攻擊網絡遊戲,做一款外掛這樣就是觸犯了法律。所以熱愛遊戲的朋友們,咱們可以學習,學習掌握後如果想賺錢可以去遊戲公司作安全技術維護人員,同樣可以賺取高薪。但是切忌不要通過學習獲得的知識做觸犯法律的事情。

“黑客”深度學習之“遊戲外掛原理與實現”

今天就以本篇文章內容,讓大家理解一款"遊戲外掛"原理、製作流程以及我們需要學習哪些知識才能掌握這項技術?

一、 認識外掛

外掛一般指通過修改遊戲而為玩家謀取利益的作弊程序,即利用技術針對一個或多個軟件,通過改變的部分程序製作而成的作弊程序。

遊戲外掛的歷史可以追溯到單機版遊戲時代,只不過當時它使用了另一個更通俗易懂的名字,遊戲修改器。它可以在遊戲中追蹤鎖定遊戲主人公的各項能力數值。這樣玩家在遊戲中可以達到主角不掉血、不耗費魔法、不消耗金錢等目的。這樣降低了遊戲的難度,使得玩家更容易通關。

隨著網絡遊戲的時代的來臨,遊戲外掛在原有的功能之上進行了新的發展,它變得更加多種多樣,功能更加強大,操作更加簡單,以至有些遊戲的外掛已經成為一個體系,比如《石器時代》,外掛品種達到了幾十種,自動戰鬥、自動行走、自動練級、自動補血、加速、不遇敵、原地遇敵、快速增加經驗值、按鍵精靈等幾乎無所不包。

二、 遊戲外掛的分類

合法性分類:

授權的外掛即(內掛)軟件在合理性、使用性、安全性上都是最優秀的,由於開發外掛需要考慮自身體積、人機功效及可靠性,所以好的外掛一般都是先由多個人或組織開發各式各樣的!由官方測試後認定某一單位開發的外掛可以安全、穩定的給用戶服務,這樣官方才會授權它可以公開出售、下載及使用!

未授權外掛並不是違法的,授權外掛的前身都是未授權外掛,它們需要在主體軟件上作全面的測試,不然很容易出現死機、毀數據或其他有害症狀!未授權外掛不可以隨意發放給用戶,更不能作為商業用品交易,所以法律為了軟件用戶的數據安全規定:出售未授權外掛是違法的的行為!另外如果未授權外掛被人利用來傳播病毒和木馬,那對用戶來說就是一場災難!

技術性分類:

1.脫機類外掛

在遊戲開發過程中,每款遊戲的客戶端與服務端都會有固定的通信格式,大部分遊戲通信協議位於TCP層之上,自定義的數據結構,外掛開發者們稱此為封包。下面簡單列舉一個簡單的打鬥封包,以方便說明脫機類外掛原理。

0000ABCD 0000DCBA 00001234 00001000

例如玩家1在與玩家2打鬥過程中,發送到服務器這樣一個16字節的數據包,其中游戲開發者定義此數據包含義如下:

0000ABCD:玩家1的ID。

0000DCBA:玩家2的ID。

00001234:玩家1所使用的技能編號。

00001000:玩家1對玩家2造成的傷害,轉換為十進制為:4096。

當服務器接收到此數據包時,則會將玩家2的血量減少4096點,如果玩家血量減少後小於等於0,則判定為玩家2已經陣亡。這時服務器會返回給玩家2的客戶端一個數據包,玩家2的客戶端則播放一個玩家2已經死亡的動畫。

以上邏輯,其實存在著大量的漏洞,比如說,服務器應該判定玩家上一次釋放00001234號技能是否在冷卻時間內,再比如說,服務器應該判定玩家戰鬥過程中所造成的傷害是否與其裝備、法力值、攻擊力、暴擊等相吻合,是否超過了遊戲本身限制的最大傷害。類似這種漏洞,每一款遊戲都會存在,只不過不會這麼明顯。一些老遊戲在這方面做的相對較弱,所以漏洞更多。

另外,在遊戲開發過程中,數據通信的格式在遊戲開發商的公司中都有相關文檔明確定義的。而這些文檔非常機密。一些遊戲開發商公司的安全做的不夠好的情況下,可能會造成遊戲代碼以及文檔的洩露。這些資料,一旦流入外掛開發者手中,那麼這款遊戲就極有可能會出現脫機式外掛。

脫機外掛定義:在不開啟遊戲客戶端的情況下,第三方程序直接與遊戲服務器進行通信,模擬賬號登陸驗證、選擇角色、進入遊戲、進入場景、開始戰鬥、對怪物造成傷害等操作時的合法數據包,發送給服務器,而服務器是沒有能力判斷出這些包是否是客戶端發來的,即便有驗證手段,由於源碼已經洩露,外掛開發者可以輕而易舉的模擬出服務端的各種驗證機制。即便數據包傳送過程中是加密的,由於源碼外漏,外掛開發者一樣可以正確模擬出數據包的加密方式。

2.模擬發包類外掛

脫機類外掛多半依賴於遊戲開發商的資料外洩,而模擬發包類外掛與脫機類外掛很近似。原因是一些外掛開發者本身可能是遊戲開發者出身,對遊戲中的邏輯相當瞭解,他們可以用調試+抓包分析的方法,在沒有源碼以及通信格式資料的情況下,分析出一些遊戲中關鍵的數據包,並採用一定的模擬發包技術,完成遊戲中本身含有的功能。

此類外掛多半需要向遊戲中注入一個dll文件,並且用dll獲取到與服務器通信的socket句柄,在此socket句柄上,將自己組織好的、合法的數據包發送到服務器。部分比較老的遊戲中很常見此類的外掛,比如決戰OL中的掛機內掛中的喊話功能,自動喝藥功能,都是模擬發包方式完成的。

3、內存式外掛

在沒有遊戲客戶端源碼,並且沒有一定的遊戲開發經驗的情況下,依然是可以進行外掛開發的。而這些外掛開發者,一般熟練掌握操作系統的各種底層機制,如模塊、線程、內存、內核對象、內核機制等技術。這些技術,有助於他們去分析遊戲客戶端進程中的邏輯和重要數據,之後他們一般會注入dll到遊戲進程,去操作遊戲進程內數據,完成一些特殊功能。當遇到一些改動,服務器恰好沒有校驗時,他們的外掛功能便成功執行。

三、 遊戲外掛的基本原理

對於單機遊戲而言

:遊戲中絕大部分的參數(比如血、藍、能量亦或是金幣)都存儲在計算機的堆棧中,一些類似劇情進度的則加密後寫入本地的自定義配置文件中;所以單機外掛原理是修改本地配置文件

對於頁遊、網遊和手遊:遊戲外掛通常是修改內存數據、或者截獲網絡封包。

1、修改內存數據的原理:服務器保存了大量的重要的參數,但由於客戶端不可避免的需要進行大量的計算和資源的加載,本地內存種必定存有部分的臨時變量,通過判斷這些變量的變化規律和函數的破密尋到利於自身的參數,比如傷害值一類,繼而尋找該變量的內存地址,根據指針偏移分析獲得內存基址,再提升權限利用Windows API把自定義數值寫入該內存塊,就完成了修改某項數值的操作,一般來說,只要破解了一項數值,利用規律繼而破解其他數值就更加容易了。

2、截獲網絡封包的基本原理:Internet客戶/服務器模式的通訊一般採用通信協議,數據交換是通過IP數據包的傳輸來實現的,一般來說客戶端向服務器發出某些請求,比如移動、戰鬥等指令都是通過封包的形式和服務器交換數據。那麼我們把本地發出消息稱為SEND,意思就是發送數據,服務器收到我們SEND的消息後,會按照既定的程序把有關的信息反饋給客戶端,比如,移動的座標,戰鬥的類型。把客戶端收到服務器發來的有關消息稱為RECV。接下來要做的工作就是分析客戶端和服務器之間往來的數據(也就是封包),這樣就可以提取到對我們有用的數據進行修改,然後模擬服務器發給客戶端,或者模擬客戶端發送給服務器,這樣就可以實現修改遊戲的目的。

四、 遊戲外掛製作流程解析

以網遊外掛為例,總體上分為兩個過程,一是遊戲分析調試過程,二是使用編程工具進行外掛功能開發,具體流程如下:

1、選擇要製作的網遊外掛類型

首先要做的第一件事就是確定你要製作的網遊外掛類型。是想做修改內存數據的外掛和還是不依賴於客戶端,能獨立模擬客戶端和遊戲服務器進行通訊的網遊脫機外掛。內存外掛的整體制作難度比脫機外掛要簡單一些,但脫機外掛製作要比內掛更有趣,而且用起來也更方便,不必啟動龐大的客戶端程序。那我們選擇比較難的以脫機外掛的製作流程為主進行講解。

2、網絡截包工具的使用

目標網遊的初步分析最主要的工作是分析遊戲初始階段網遊客戶端和服務器之間的數據通訊。這一階段主要是指從輸入用戶名和密碼開始登錄遊戲到玩家人物出現在遊戲場景中這個階段。這是開始階段最關鍵的一個步驟,如果你能夠成功破解網遊數據通訊部分的加密,並用DEMO程序成功模擬整個登錄過程,那你幾乎就已經成功了一半了。關於初步分析,首先要確定網遊客戶端和服務器之間的大致通訊過程,最起碼你要知道客戶端連接的是哪一個服務器,連接的端口是多少,在登錄的過程中發送和接受了幾個包?而要了解這些東西,你就要使用到網絡截包工具了。

“黑客”深度學習之“遊戲外掛原理與實現”

可以使用Wireshark,簡單好用。而且我之前寫過一篇文章有相關教程,大家如果不理解可以去頭條鏈接上學習。

3、分析初始階段C/S網絡數據通訊

在這篇文章裡,引用高手們破解某款網絡遊戲的過程作為分享。

首先在Microsoft Network Monitor抓包工具【aliases】窗口中將本地客戶端和遊戲服務器分別命名為:MyComputer和GameServer。注意不要忘了點擊【apply】按鈕。

“黑客”深度學習之“遊戲外掛原理與實現”

然後在【Display Filter】中輸入如下語句,僅顯示遊戲客戶端和服務器之間的數據包。數據包類型為TCP是因為網遊通訊的協議是TCP協議。

“黑客”深度學習之“遊戲外掛原理與實現”

下圖中的數據包列表就是目標網遊從輸入用戶名和密碼登錄遊戲到人物出現在遊戲中(然後立即退出。)這一階段客戶端和服務器之間的所有往來的數據包。

“黑客”深度學習之“遊戲外掛原理與實現”

圖中紅線標識的三個包代表了一個連接的過程。注意它的TCP Flags的變化。 MyComputer è GameServer .S...... 客戶端請求建立連接 MyComputer ç GameServer .S..A... 服務器同意建立連接 MyComputer è GameServer ....A... 連接建立 以上三個包稱為建立TCP連接的三段式握手。當你調用Socket類的Connect方法時就會產生上面的三個TCP包。 圖中藍線標識的是連接斷開的過程。 MyComputer è GameServer F...A... 客戶端請求斷開連接 MyComputer ç GameServer ....A... 服務器同意斷開請求 MyComputer ç GameServer F...A... 服務器請求斷開連接 MyComputer è GameServer ....A... 客戶端同意斷開請求 調用Socket類的Disconnect方法時就會產生上面的四個TCP包。 從上圖中我們不難看出在驗證用戶名和密碼的過程中,客戶端和服務器之間總共連接了二次,所以在之後的外掛程序編寫過程中,我們同樣也要連接二次。

TCP Flag為...PA...表示該TCP包內帶有數據,而....A...則是回應包,用於回應上一個包的發送方:我已經收到你上一個包了,它本身不帶數據。所以一般一個...PA...包都有一個對應的....A...包(例如編號為266和269),但如果回應的時候,發現正好有數據要發送,則可以將回應包摻雜在發送包中發送過去(例如編號為273的回應包就摻雜在275這個包內)。 下面觀察客戶端和服務器之間的實際數據往來。客戶端連接到服務器MyComputer ç GameServer 服務器給客戶端發送7字節的數據MyComputer è GameServer 客戶端給服務器發送90字節的數據MyComputer ç GameServer 服務器給客戶端發送65字節的數據MyComputer ç GameServer 服務器給客戶端發送48字節的數據MyComputer è GameServer 客戶端給服務器發送48字節的數據MyComputer ç GameServer 服務器給客戶端發送208字節的數據服務器斷開連接以上就是第一次連接的大致過程。觀察每個包內的具體傳輸數據是沒有意義的,因為網遊之間的通訊肯定是加密的,你每次攔截下來的數據都會不一樣。通常遊戲服務器給客戶端發送的第一個包都是KEY包(例如上面的7字節的包),客戶端在接收到KEY包之後執行相應的數據加密初始化。所以接下來的任務就是根據已掌握的數據通訊規律,對遊戲客戶端的加密算法進行破解了。

4、遊戲加密算法破解

網絡遊戲所使用的網絡通訊函數肯定也是微軟操作系統所提供的標準API函數,所以通常在接受網絡數據的API函數中下一個斷點,當接收到第一個7字節包時,斷點激活,然後逐漸跟進去,查看遊戲客戶端是如何處理該段數據的,然後我們在外掛中依樣畫葫蘆,進行同樣的處理。

5、網遊基本指令分析

監控網遊客戶端的發送包和接受包,得到網遊指令的數據樣本。那麼如何得到網遊指令的數據樣本呢?首先想到的是使用網絡截包工具,這種方式在網遊發展早期的話還有一定的可行性,因為那時候網遊大部分採用明文通訊,而現在的網遊數據通訊肯定是加密的,所以使用網絡截包工具截獲到的數據毫無意義。既然無法使用通用的工具,那我們只能把目光移向遊戲客戶端了,因為在遊戲客戶端內處理的肯定是未加密的數據。像之前的加密破解一樣,跟蹤遊戲對網絡數據的處理過程,分別找到遊戲中對解密後的指令包的處理函數入口和遊戲對要發送指令包進行加密的函數入口這二個地方,然後修改這二處地方入口點的彙編指令,使之先調用我們編寫的函數,然後再調用原始的過程。在我們自己編寫的函數內部,分別記錄下接收到的指令包和要發送的指令包(如下圖)。這樣,網遊客戶端的發送包和接受包的監控就完成了。

“黑客”深度學習之“遊戲外掛原理與實現”

分析網遊指令的通用方法:能夠獲得網遊指令樣本數據之後,接下去就是實際的分析過程了。一般而言,根據指令包所起的不同作用,可以將遊戲指令包分為不同類別:

連接相關指令包 用於與遊戲建立連接以及退出遊戲時的指令包玩家屬性相關指令包 與玩家本身狀態相關的指令包,在剛進入遊戲系統時,服務器會發送過來大量的關於玩家角色基本信息的指令包。環境相關指令包 由於告知玩家周圍怪物/NPC/其他玩家狀況的指令包移動相關指令包 與走路相關的指令包戰鬥相關指令包 與戰鬥相關的指令包交易相關指令包 與交易相關的指令包製作一款外掛,如果只要求基本功能的話,分析20,30個指令包應該就差不多了,如果要求功能比較完善的話,至多50個指令包也就差不多了。具體分析的方法也很簡單,無非是排除干擾因素,逐個擊破,以及重複試驗,確保分析結果正確。下圖是針對某一款遊戲的28個指令包的具體分析:

“黑客”深度學習之“遊戲外掛原理與實現”

6、網遊資源解析

遊戲資源主要是指包含在網遊客戶端內的與遊戲相關的數據資源:其中最重要的是地圖資源,其他的資源包括NPC的位置座標啊,地圖傳送點的座標啊,等等。

第一地圖資源解析:地圖資源的解析是外掛製作中很重要的一個方面,尋路算法以及地圖間的自動移動等都要依賴於地圖資源。外掛中所使用的地圖資源不完全等同於遊戲中使用的地圖資源。遊戲中使用的地圖資源包含有更多的信息,而外掛所使用的地圖稱之為BOOL地圖,它僅僅包含一項信息:指定的某一點是可移動點還是障礙點。

“黑客”深度學習之“遊戲外掛原理與實現”

例如上圖就是某個遊戲地圖所對應的BOOL地圖,其中藍色部分代表不可移動區域,白色部分代表可移動區域。(另外綠色的點是通過解析其他的資源文件獲得的NPC的座標點,紅色點是傳送點。)那麼如何獲得遊戲地圖所對應的地圖資源呢?通常在網遊客戶端的程序安裝目錄內會存在一個類似map或者res之類的目錄。地圖資源處在其中的可能性很大,而且地圖資源本身的文件格式也比較明顯,通常它都是以如下的格式存在的:

“黑客”深度學習之“遊戲外掛原理與實現”

前面N個字節的地圖頭信息中肯定包含了地圖的寬度信息和高度信息,設寬度和高度分別為W和H。後面的部分通常都是地圖點信息。地圖上的一個點通常由n個字節所構成,整個地圖文件的大小由此計算而得: N + (W*H*n)。

“黑客”深度學習之“遊戲外掛原理與實現”

所以判斷是否是地圖文件很簡單,只要看一下文件的頭,然後查看一下文件的大小。如果有一組文件滿足上面的規律的話,那基本上可以肯定是地圖資源文件了。接下來就是要把遊戲地圖轉化為BOOL地圖。前面提到地圖文件中地圖上的一個點通常有n個字節所構成,裡面含有很多豐富的信息,而BOOL地圖所關心的是否是可移動點的信息通常僅需要用1位即可表示。(注意是位,1個字節有8位,所以n個字節總共有8n位)將一張遊戲地圖中所有點的該位信息收集起來組成的新的地圖就是BOOL地圖。它標示了地圖中那些區域玩家是可移動的,那些區域是不可移動的,為後面的尋路算法提供了基礎數據。原理明白了,接下去就是寫一個程序解析地圖資源。大致步驟如下:首先打開一個地圖文件然後讀入地圖文件的頭信息,解析出地圖寬度和高度

最後讀入地圖點信息,對每一個點所代表的n字節數據執行位操作,提煉出其中某一位的信息,保存到自己的結構中。(此處我建議大家採用BMP格式的數據來保存提煉出來的位信息,好處有三點:一是保存完之後,直接可以用圖片瀏覽工具查看結果,不必自己再寫一個繪製的程序,二是使用BMP格式保存的話,保存的數據容量也小,三是在外掛中顯示地圖時可以將BMP圖片直接作為背景圖片貼在窗口上。)由於之前你尚無法確定n字節中的哪一位代表了點的是否可移動屬性,所以每一位你都要取一遍組成一幅地圖,然後查看哪一幅和遊戲地圖最接近。多讀幾個地圖文件做實驗,很容易就可以確認下來的。

第二其他資源的解析:地圖資源的解析是通過了解物理磁盤上地圖文件的保存格式,然後自己寫程序解析出來的,使用這種方法還可以解析其他很多資源信息。大家可以仔細觀察遊戲的安裝目錄,根據子目錄和文件的名字可以分析出很多有用的信息。但目前遊戲廠商將保存在磁盤上的資源文件通常進行了變形(壓縮或者加密),使你無法通過簡單的分析獲得你所需要的信息。一種解決辦法就是觀察遊戲是如何處理變型的資源文件的。因為在遊戲中資源肯定是以原始形式存在的,通常都是在遊戲初始化的時候,從磁盤上讀入變形的資源文件,然後將其恢復為原始狀態的資源形式,我們就跟蹤該段的處理過程,然後自己模仿寫一段程序將變形資源恢復為原始資源形式。另外一種方法就是直接從遊戲的內存中讀取有用的資源信息。該方法的理論依據就是:資源信息在遊戲中肯定是明文形態,而且是被有序組織的。比如,如果你想要獲得所有遊戲物品的信息列表,你可以隨意選擇一個物品名稱,然後在遊戲的內存中查找他的位置。所有的物品在遊戲內存中肯定是以某種鏈表的形式存在的,你只要找到了一個,就可以順藤摸瓜,找到該鏈表的頭,然後自己寫一個程序,讀寫遊戲的內存空間,將整個遊戲的物品列表全部讀取出來。

7、網遊中的算法

尋路算法: 外掛中最有名的,也最重要的一個算法就是尋路算法了。所謂尋路算法就是指給定一張地圖數據,以及起始點和目標點,然後利用算法計算出一條路徑來。它所依賴的數據基礎是BOOL地圖,這個我們在之前的講述中已經成功獲得了。

具體算法如下: 常用的尋路算法實現有二種,一種是A*算法,還有一種等高線算法。還記得在大學裡面學過遍歷圖的二種算法嗎,一種是深度優先,一種是廣度優先。A*算法就對應了深度優先算法,而等高線算法則對應了廣度優先算法。 A*算法是最常用的尋路算法了,不過它也有個很大的缺陷,那就是計算出來的路徑通常是貼邊的,所以如果你在遊戲中觀察用外掛控制的人物的走動的話,你會發現他通常是沿著障礙物的邊走動的,走動起來顯得很不自然。 A*算法和等高線算法在網上都有很多例子,在我的站點上也提供了這二個算法的實現(C++版)。下面這張圖顯示的是A*算法和等高算法的具體應用。

“黑客”深度學習之“遊戲外掛原理與實現”

其他算法: 外掛中除了尋路算法之外,還有其他的一些算法應用,比如地圖間移動算法:在已知各個地圖間傳送點的情況下,計算出從地圖A移動到地圖B所要經過的所有地圖,這同樣是一個經典的圖論算法問題。 此外還有打怪時如何搜索最近怪物的算法,以及最有效的自動戰鬥的算法,這些算法要根據每款遊戲的實際情況而進行相應的變動。

8、使用編程工具進行外掛功能開發

選擇何種編程語言和工具製作外掛則沒有限定,常用的如VC,Delphi,VB…等都可以,具體的編程過程再以後的文章裡會詳述。

五、學習編寫遊戲外掛我們需要掌握哪些基礎知識?

1、要學會編程

至少要掌握可視化編程,如學習VC,Delphi,VB等編程語言

2、學會簡單分析遊戲

需要會使用一些工具,分析遊戲的窗口,控件,進程,線程,DLL模塊,內存..因為做外掛就是要控制遊戲程序,所以需要學會分析遊戲的這些表面特徵與內在數據.瞭解了遊戲的基本構造才能針對性的編寫外掛功能。

3、學會API

學習一下基本的Win32 API調用很有必要,主要是那些進程線程操作,內存讀寫,DC設備對象,鼠標鍵盤模擬等。

4、學會用CE查找動態內存基址

CE可是個利器,對於查找解決遊戲中的動態內存等有奇效,用法上也不難,花個幾天時間就能學會基本的操作了,對於簡單的人物信息數據等很容易找到,但對於地圖物品,怪物數組的內存稍複雜。

5、學會OD調試遊戲找關鍵CALL

遊戲也是編出來的,裡面也是有一個一個的功能函數組合起來.找到一些關鍵的功能函數入口地址,並分析出該函數的參數,就可以編寫CALL代碼,來直接調用遊戲中的函數,讓其實現自動化。

6、學會寫CALL代碼

對於C語言來說,本身就支持彙編指令編寫,但是易語言不支持,幸好網上也有人做出過一些彙編模塊,可以使用這些彙編來編寫CALL調用代碼,也可以使用外掛作坊模塊裡的 調用函數() CALL() 調用機器碼() 等命令。

7、加解密封包

用OD調試遊戲中收發封包的API上下層函數,這裡的函數循環體基本上都是遊戲的數據包加解密功能了.可以分析之後自已編寫出這兩個函數代碼,也可以直接CALL遊戲中現成的加解密函數體.還要分析封包的封裝的消息格式。

8、分析遊戲地圖與尋路

有些遊戲裡本身就有自動點擊行走或尋路的功能,可以很方便的利用之,若沒有這些的話,就得分析了,這個有相當的難度.是做掛機掛的必經之路。


分享到:


相關文章: