“黑客”深度学习之“游戏外挂原理实现”之美
最近很多熱愛玩游戲的朋友看了我文章后,經(jīng)常私信問我,“你是黑客嗎?”我回答“我是一個(gè)白帽子黑客”。“那能不能幫我攻入游戲系統(tǒng)做一款游戲外掛,咱們一起賺錢?”我就只能呵呵了,肯定是不可以的,技術(shù)上雖然可以實(shí)現(xiàn)但是原則上一定不要那么做。
首先大家可以學(xué)習(xí)如何做外掛,也可以自己在家用單機(jī)游戲做外掛來測試,這樣既能提高自身技術(shù)又能滿足自己的好奇心,但是如果為了謀取利益攻擊網(wǎng)絡(luò)游戲,做一款外掛這樣就是觸犯了法律。所以熱愛游戲的朋友們,咱們可以學(xué)習(xí),學(xué)習(xí)掌握后如果想賺錢可以去游戲公司作安全技術(shù)維護(hù)人員,同樣可以賺取高薪。但是切忌不要通過學(xué)習(xí)獲得的知識(shí)做觸犯法律的事情。
今天就以本篇文章內(nèi)容,讓大家理解一款“游戲外掛”原理、制作流程以及我們需要學(xué)習(xí)哪些知識(shí)才能掌握這項(xiàng)技術(shù)?
一、 認(rèn)識(shí)外掛
外掛一般指通過修改游戲而為玩家謀取利益的作弊程序,即利用電腦技術(shù)針對一個(gè)或多個(gè)軟件,通過改變軟件的部分程序制作而成的作弊程序。
游戲外掛的歷史可以追溯到單機(jī)版游戲時(shí)代,只不過當(dāng)時(shí)它使用了另一個(gè)更通俗易懂的名字,游戲修改器。它可以在游戲中追蹤鎖定游戲主人公的各項(xiàng)能力數(shù)值。這樣玩家在游戲中可以達(dá)到主角不掉血、不耗費(fèi)魔法、不消耗金錢等目的。這樣降低了游戲的難度,使得玩家更容易通關(guān)?!?/p>
隨著網(wǎng)絡(luò)游戲的時(shí)代的來臨,游戲外掛在原有的功能之上進(jìn)行了新的發(fā)展,它變得更加多種多樣,功能更加強(qiáng)大,操作更加簡單,以至有些游戲的外掛已經(jīng)成為一個(gè)體系,比如《石器時(shí)代》,外掛品種達(dá)到了幾十種,自動(dòng)戰(zhàn)斗、自動(dòng)行走、自動(dòng)練級、自動(dòng)補(bǔ)血、加速、不遇敵、原地遇敵、快速增加經(jīng)驗(yàn)值、按鍵精靈等幾乎無所不包。
二、 游戲外掛的分類
合法性分類:
1、授權(quán)外掛
授權(quán)的外掛即(內(nèi)掛)軟件在合理性、使用性、安全性上都是最優(yōu)秀的,由于開發(fā)外掛需要考慮自身體積、人機(jī)功效及可靠性,所以好的外掛一般都是先由多個(gè)人或組織開發(fā)各式各樣的!由官方測試后認(rèn)定某一單位開發(fā)的外掛可以安全、穩(wěn)定的給用戶服務(wù),這樣官方才會(huì)授權(quán)它可以公開出售、下載及使用!
2、未授權(quán)外掛
未授權(quán)外掛并不是違法的,授權(quán)外掛的前身都是未授權(quán)外掛,它們需要在主體軟件上作全面的測試,不然很容易出現(xiàn)死機(jī)、毀數(shù)據(jù)或其他有害癥狀!未授權(quán)外掛不可以隨意發(fā)放給用戶,更不能作為商業(yè)用品交易,所以法律為了軟件用戶的數(shù)據(jù)安全規(guī)定:出售未授權(quán)外掛是違法的的行為!另外如果未授權(quán)外掛被人利用來傳播病毒和木馬,那對用戶來說就是一場災(zāi)難!
技術(shù)性分類:
1.脫機(jī)類外掛
在游戲開發(fā)過程中,每款游戲的客戶端與服務(wù)端都會(huì)有固定的通信格式,大部分游戲通信協(xié)議位于TCP層之上,自定義的數(shù)據(jù)結(jié)構(gòu),外掛開發(fā)者們稱此為封包。下面簡單列舉一個(gè)簡單的打斗封包,以方便說明脫機(jī)類外掛原理。
0000ABCD 0000DCBA 00001234 00001000
例如玩家1在與玩家2打斗過程中,發(fā)送到服務(wù)器這樣一個(gè)16字節(jié)的數(shù)據(jù)包,其中游戲開發(fā)者定義此數(shù)據(jù)包含義如下:
0000ABCD:玩家1的ID。
0000DCBA:玩家2的ID。
00001234:玩家1所使用的技能編號(hào)。
00001000:玩家1對玩家2造成的傷害,轉(zhuǎn)換為十進(jìn)制為:4096。
當(dāng)服務(wù)器接收到此數(shù)據(jù)包時(shí),則會(huì)將玩家2的血量減少4096點(diǎn),如果玩家血量減少后小于等于0,則判定為玩家2已經(jīng)陣亡。這時(shí)服務(wù)器會(huì)返回給玩家2的客戶端一個(gè)數(shù)據(jù)包,玩家2的客戶端則播放一個(gè)玩家2已經(jīng)死亡的動(dòng)畫。
以上邏輯,其實(shí)存在著大量的漏洞,比如說,服務(wù)器應(yīng)該判定玩家上一次釋放00001234號(hào)技能是否在冷卻時(shí)間內(nèi),再比如說,服務(wù)器應(yīng)該判定玩家戰(zhàn)斗過程中所造成的傷害是否與其裝備、法力值、攻擊力、暴擊等相吻合,是否超過了游戲本身限制的最大傷害。類似這種漏洞,每一款游戲都會(huì)存在,只不過不會(huì)這么明顯。一些老游戲在這方面做的相對較弱,所以漏洞更多。
另外,在游戲開發(fā)過程中,數(shù)據(jù)通信的格式在游戲開發(fā)商的公司中都有相關(guān)文檔明確定義的。而這些文檔非常機(jī)密。一些游戲開發(fā)商公司的安全做的不夠好的情況下,可能會(huì)造成游戲代碼以及文檔的泄露。這些資料,一旦流入外掛開發(fā)者手中,那么這款游戲就極有可能會(huì)出現(xiàn)脫機(jī)式外掛。
脫機(jī)外掛定義:在不開啟游戲客戶端的情況下,第三方程序直接與游戲服務(wù)器進(jìn)行通信,模擬賬號(hào)登陸驗(yàn)證、選擇角色、進(jìn)入游戲、進(jìn)入場景、開始戰(zhàn)斗、對怪物造成傷害等操作時(shí)的合法數(shù)據(jù)包,發(fā)送給服務(wù)器,而服務(wù)器是沒有能力判斷出這些包是否是客戶端發(fā)來的,即便有驗(yàn)證手段,由于源碼已經(jīng)泄露,外掛開發(fā)者可以輕而易舉的模擬出服務(wù)端的各種驗(yàn)證機(jī)制。即便數(shù)據(jù)包傳送過程中是加密的,由于源碼外漏,外掛開發(fā)者一樣可以正確模擬出數(shù)據(jù)包的加密方式。
2.模擬發(fā)包類外掛
脫機(jī)類外掛多半依賴于游戲開發(fā)商的資料外泄,而模擬發(fā)包類外掛與脫機(jī)類外掛很近似。原因是一些外掛開發(fā)者本身可能是游戲開發(fā)者出身,對游戲中的邏輯相當(dāng)了解,他們可以用調(diào)試+抓包分析的方法,在沒有源碼以及通信格式資料的情況下,分析出一些游戲中關(guān)鍵的數(shù)據(jù)包,并采用一定的模擬發(fā)包技術(shù),完成游戲中本身含有的功能。
此類外掛多半需要向游戲中注入一個(gè)dll文件,并且用dll獲取到與服務(wù)器通信的socket句柄,在此socket句柄上,將自己組織好的、合法的數(shù)據(jù)包發(fā)送到服務(wù)器。部分比較老的游戲中很常見此類的外掛,比如決戰(zhàn)OL中的掛機(jī)內(nèi)掛中的喊話功能,自動(dòng)喝藥功能,都是模擬發(fā)包方式完成的。
3、內(nèi)存式外掛
在沒有游戲客戶端源碼,并且沒有一定的游戲開發(fā)經(jīng)驗(yàn)的情況下,依然是可以進(jìn)行外掛開發(fā)的。而這些外掛開發(fā)者,一般熟練掌握操作系統(tǒng)的各種底層機(jī)制,如模塊、線程、內(nèi)存、內(nèi)核對象、內(nèi)核機(jī)制等技術(shù)。這些技術(shù),有助于他們?nèi)シ治鲇螒蚩蛻舳诉M(jìn)程中的邏輯和重要數(shù)據(jù),之后他們一般會(huì)注入dll到游戲進(jìn)程,去操作游戲進(jìn)程內(nèi)數(shù)據(jù),完成一些特殊功能。當(dāng)遇到一些改動(dòng),服務(wù)器恰好沒有校驗(yàn)時(shí),他們的外掛功能便成功執(zhí)行。
三、 游戲外掛的基本原理
對于單機(jī)游戲而言:游戲中絕大部分的參數(shù)(比如血、藍(lán)、能量亦或是金幣)都存儲(chǔ)在計(jì)算機(jī)的堆棧中,一些類似劇情進(jìn)度的則加密后寫入本地的自定義配置文件中;所以單機(jī)外掛原理是修改本地配置文件
對于頁游、網(wǎng)游和手游:游戲外掛通常是修改內(nèi)存數(shù)據(jù)、或者截獲網(wǎng)絡(luò)封包。
1、修改內(nèi)存數(shù)據(jù)的原理:服務(wù)器保存了大量的重要的參數(shù),但由于客戶端不可避免的需要進(jìn)行大量的計(jì)算和資源的加載,本地內(nèi)存種必定存有部分的臨時(shí)變量,通過判斷這些變量的變化規(guī)律和函數(shù)的破密尋到利于自身的參數(shù),比如傷害值一類,繼而尋找該變量的內(nèi)存地址,根據(jù)指針偏移分析獲得內(nèi)存基址,再提升權(quán)限利用Windows API把自定義數(shù)值寫入該內(nèi)存塊,就完成了修改某項(xiàng)數(shù)值的操作,一般來說,只要破解了一項(xiàng)數(shù)值,利用規(guī)律繼而破解其他數(shù)值就更加容易了。
2、截獲網(wǎng)絡(luò)封包的基本原理:Internet客戶/服務(wù)器模式的通訊一般采用TCP/IP通信協(xié)議,數(shù)據(jù)交換是通過IP數(shù)據(jù)包的傳輸來實(shí)現(xiàn)的,一般來說客戶端向服務(wù)器發(fā)出某些請求,比如移動(dòng)、戰(zhàn)斗等指令都是通過封包的形式和服務(wù)器交換數(shù)據(jù)。那么我們把本地發(fā)出消息稱為SEND,意思就是發(fā)送數(shù)據(jù),服務(wù)器收到我們SEND的消息后,會(huì)按照既定的程序把有關(guān)的信息反饋給客戶端,比如,移動(dòng)的坐標(biāo),戰(zhàn)斗的類型。把客戶端收到服務(wù)器發(fā)來的有關(guān)消息稱為RECV。接下來要做的工作就是分析客戶端和服務(wù)器之間往來的數(shù)據(jù)(也就是封包),這樣就可以提取到對我們有用的數(shù)據(jù)進(jìn)行修改,然后模擬服務(wù)器發(fā)給客戶端,或者模擬客戶端發(fā)送給服務(wù)器,這樣就可以實(shí)現(xiàn)修改游戲的目的。
四、 游戲外掛制作流程解析
以網(wǎng)游外掛為例,總體上分為兩個(gè)過程,一是游戲分析調(diào)試過程,二是使用編程工具進(jìn)行外掛功能開發(fā),具體流程如下:
1、選擇要制作的網(wǎng)游外掛類型
首先要做的第一件事就是確定你要制作的網(wǎng)游外掛類型。是想做修改內(nèi)存數(shù)據(jù)的外掛和還是不依賴于客戶端,能獨(dú)立模擬客戶端和游戲服務(wù)器進(jìn)行通訊的網(wǎng)游脫機(jī)外掛。內(nèi)存外掛的整體制作難度比脫機(jī)外掛要簡單一些,但脫機(jī)外掛制作要比內(nèi)掛更有趣,而且用起來也更方便,不必啟動(dòng)龐大的客戶端程序。那我們選擇比較難的以脫機(jī)外掛的制作流程為主進(jìn)行講解。
2、網(wǎng)絡(luò)截包工具的使用
目標(biāo)網(wǎng)游的初步分析最主要的工作是分析游戲初始階段網(wǎng)游客戶端和服務(wù)器之間的數(shù)據(jù)通訊。這一階段主要是指從輸入用戶名和密碼開始登錄游戲到玩家人物出現(xiàn)在游戲場景中這個(gè)階段。這是開始階段最關(guān)鍵的一個(gè)步驟,如果你能夠成功破解網(wǎng)游數(shù)據(jù)通訊部分的加密,并用DEMO程序成功模擬整個(gè)登錄過程,那你幾乎就已經(jīng)成功了一半了。關(guān)于初步分析,首先要確定網(wǎng)游客戶端和服務(wù)器之間的大致通訊過程,最起碼你要知道客戶端連接的是哪一個(gè)服務(wù)器,連接的端口是多少,在登錄的過程中發(fā)送和接受了幾個(gè)包?而要了解這些東西,你就要使用到網(wǎng)絡(luò)截包工具了。
?
可以使用Wireshark,簡單好用。
3、分析初始階段C/S網(wǎng)絡(luò)數(shù)據(jù)通訊
在這篇文章里,引用高手們破解某款網(wǎng)絡(luò)游戲的過程作為分享。
首先在Microsoft Network Monitor抓包工具【aliases】窗口中將本地客戶端和游戲服務(wù)器分別命名為:MyComputer和GameServer。注意不要忘了點(diǎn)擊【apply】按鈕
然后在【Display Filter】中輸入如下語句,僅顯示游戲客戶端和服務(wù)器之間的數(shù)據(jù)包。數(shù)據(jù)包類型為TCP是因?yàn)榫W(wǎng)游通訊的協(xié)議是TCP協(xié)議。
下圖中的數(shù)據(jù)包列表就是目標(biāo)網(wǎng)游從輸入用戶名和密碼登錄游戲到人物出現(xiàn)在游戲中(然后立即退出。)這一階段客戶端和服務(wù)器之間的所有往來的數(shù)據(jù)包。
圖中紅線標(biāo)識(shí)的三個(gè)包代表了一個(gè)連接的過程。注意它的TCP Flags的變化。 MyComputer è GameServer .S…… 客戶端請求建立連接 MyComputer GameServer .S.A…… 服務(wù)器同意建立連接 MyComputer è GameServer ……A…… 連接建立 以上三個(gè)包稱為建立TCP連接的三段式握手。當(dāng)你調(diào)用Socket類的Connect方法時(shí)就會(huì)產(chǎn)生上面的三個(gè)TCP包。 圖中藍(lán)線標(biāo)識(shí)的是連接斷開的過程。 MyComputer è GameServer F……A…… 客戶端請求斷開連接 MyComputer GameServer ……A…… 服務(wù)器同意斷開請求 MyComputer GameServer F……A…… 服務(wù)器請求斷開連接 MyComputer è GameServer ……A…… 客戶端同意斷開請求 調(diào)用Socket類的Disconnect方法時(shí)就會(huì)產(chǎn)生上面的四個(gè)TCP包。 從上圖中我們不難看出在驗(yàn)證用戶名和密碼的過程中,客戶端和服務(wù)器之間總共連接了二次,所以在之后的外掛程序編寫過程中,我們同樣也要連接二次。
TCP Flag為...PA...表示該TCP包內(nèi)帶有數(shù)據(jù),而....A...則是回應(yīng)包,用于回應(yīng)上一個(gè)包的發(fā)送方:我已經(jīng)收到你上一個(gè)包了,它本身不帶數(shù)據(jù)。所以一般一個(gè)...PA...包都有一個(gè)對應(yīng)的....A...包(例如編號(hào)為266和269),但如果回應(yīng)的時(shí)候,發(fā)現(xiàn)正好有數(shù)據(jù)要發(fā)送,則可以將回應(yīng)包摻雜在發(fā)送包中發(fā)送過去(例如編號(hào)為273的回應(yīng)包就摻雜在275這個(gè)包內(nèi))。下面觀察客戶端和服務(wù)器之間的實(shí)際數(shù)據(jù)往來。 客戶端連接到服務(wù)器 MyComputer GameServer 服務(wù)器給客戶端發(fā)送7字節(jié)的數(shù)據(jù) MyComputer è GameServer 客戶端給服務(wù)器發(fā)送90字節(jié)的數(shù)據(jù) MyComputer GameServer 服務(wù)器給客戶端發(fā)送65字節(jié)的數(shù)據(jù) MyComputer GameServer 服務(wù)器給客戶端發(fā)送48字節(jié)的數(shù)據(jù) MyComputer è GameServer 客戶端給服務(wù)器發(fā)送48字節(jié)的數(shù)據(jù) MyComputer GameServer 服務(wù)器給客戶端發(fā)送208字節(jié)的數(shù)據(jù) 服務(wù)器斷開連接 以上就是第一次連接的大致過程。觀察每個(gè)包內(nèi)的具體傳輸數(shù)據(jù)是沒有意義的,因?yàn)榫W(wǎng)游之間的通訊肯定是加密的,你每次攔截下來的數(shù)據(jù)都會(huì)不一樣。通常游戲服務(wù)器給客戶端發(fā)送的第一個(gè)包都是KEY包(例如上面的7字節(jié)的包),客戶端在接收到KEY包之后執(zhí)行相應(yīng)的數(shù)據(jù)加密初始化。所以接下來的任務(wù)就是根據(jù)已掌握的數(shù)據(jù)通訊規(guī)律,對游戲客戶端的加密算法進(jìn)行破解了。
4、游戲加密算法破解
網(wǎng)絡(luò)游戲所使用的網(wǎng)絡(luò)通訊函數(shù)肯定也是微軟操作系統(tǒng)所提供的標(biāo)準(zhǔn)API函數(shù),所以通常在接受網(wǎng)絡(luò)數(shù)據(jù)的API函數(shù)中下一個(gè)斷點(diǎn),當(dāng)接收到第一個(gè)7字節(jié)包時(shí),斷點(diǎn)激活,然后逐漸跟進(jìn)去,查看游戲客戶端是如何處理該段數(shù)據(jù)的,然后我們在外掛中依樣畫葫蘆,進(jìn)行同樣的處理。
5、網(wǎng)游基本指令分析
監(jiān)控網(wǎng)游客戶端的發(fā)送包和接受包,得到網(wǎng)游指令的數(shù)據(jù)樣本。那么如何得到網(wǎng)游指令的數(shù)據(jù)樣本呢?首先想到的是使用網(wǎng)絡(luò)截包工具,這種方式在網(wǎng)游發(fā)展早期的話還有一定的可行性,因?yàn)槟菚r(shí)候網(wǎng)游大部分采用明文通訊,而現(xiàn)在的網(wǎng)游數(shù)據(jù)通訊肯定是加密的,所以使用網(wǎng)絡(luò)截包工具截獲到的數(shù)據(jù)毫無意義。既然無法使用通用的工具,那我們只能把目光移向游戲客戶端了,因?yàn)樵谟螒蚩蛻舳藘?nèi)處理的肯定是未加密的數(shù)據(jù)。像之前的加密破解一樣,跟蹤游戲?qū)W(wǎng)絡(luò)數(shù)據(jù)的處理過程,分別找到游戲中對解密后的指令包的處理函數(shù)入口和游戲?qū)σl(fā)送指令包進(jìn)行加密的函數(shù)入口這二個(gè)地方,然后修改這二處地方入口點(diǎn)的匯編指令,使之先調(diào)用我們編寫的函數(shù),然后再調(diào)用原始的過程。在我們自己編寫的函數(shù)內(nèi)部,分別記錄下接收到的指令包和要發(fā)送的指令包(如下圖)。這樣,網(wǎng)游客戶端的發(fā)送包和接受包的監(jiān)控就完成了。
分析網(wǎng)游指令的通用方法:能夠獲得網(wǎng)游指令樣本數(shù)據(jù)之后,接下去就是實(shí)際的分析過程了。一般而言,根據(jù)指令包所起的不同作用,可以將游戲指令包分為不同類別:
連接相關(guān)指令包 用于與游戲建立連接以及退出游戲時(shí)的指令包玩家屬性相關(guān)指令包 與玩家本身狀態(tài)相關(guān)的指令包,在剛進(jìn)入游戲系統(tǒng)時(shí),服務(wù)器會(huì)發(fā)送過來大量的關(guān)于玩家角色基本信息的指令包。 環(huán)境相關(guān)指令包 由于告知玩家周圍怪物/NPC/其他玩家狀況的指令包 移動(dòng)相關(guān)指令包 與走路相關(guān)的指令包 戰(zhàn)斗相關(guān)指令包 與戰(zhàn)斗相關(guān)的指令包 交易相關(guān)指令包 與交易相關(guān)的指令包 制作一款外掛,如果只要求基本功能的話,分析20,30個(gè)指令包應(yīng)該就差不多了,如果要求功能比較完善的話,至多50個(gè)指令包也就差不多了。具體分析的方法也很簡單,無非是排除干擾因素,逐個(gè)擊破,以及重復(fù)試驗(yàn),確保分析結(jié)果正確。 下圖是針對某一款游戲的28個(gè)指令包的具體分析:
6、網(wǎng)游資源解析
游戲資源主要是指包含在網(wǎng)游客戶端內(nèi)的與游戲相關(guān)的數(shù)據(jù)資源:其中最重要的是地圖資源,其他的資源包括NPC的位置坐標(biāo)啊,地圖傳送點(diǎn)的坐標(biāo)啊,等等。
第一地圖資源解析:地圖資源的解析是外掛制作中很重要的一個(gè)方面,尋路算法以及地圖間的自動(dòng)移動(dòng)等都要依賴于地圖資源。 外掛中所使用的地圖資源不完全等同于游戲中使用的地圖資源。游戲中使用的地圖資源包含有更多的信息,而外掛所使用的地圖稱之為BOOL地圖,它僅僅包含一項(xiàng)信息:指定的某一點(diǎn)是可移動(dòng)點(diǎn)還是障礙點(diǎn)。
例如上圖就是某個(gè)游戲地圖所對應(yīng)的BOOL地圖,其中藍(lán)色部分代表不可移動(dòng)區(qū)域,白色部分代表可移動(dòng)區(qū)域。(另外綠色的點(diǎn)是通過解析其他的資源文件獲得的NPC的坐標(biāo)點(diǎn),紅色點(diǎn)是傳送點(diǎn)。) 那么如何獲得游戲地圖所對應(yīng)的地圖資源呢?通常在網(wǎng)游客戶端的程序安裝目錄內(nèi)會(huì)存在一個(gè)類似map或者res之類的目錄。地圖資源處在其中的可能性很大,而且地圖資源本身的文件格式也比較明顯,通常它都是以如下的格式存在的:
前面N個(gè)字節(jié)的地圖頭信息中肯定包含了地圖的寬度信息和高度信息,設(shè)寬度和高度分別為W和H。后面的部分通常都是地圖點(diǎn)信息。地圖上的一個(gè)點(diǎn)通常由n個(gè)字節(jié)所構(gòu)成,整個(gè)地圖文件的大小由此計(jì)算而得: N + (W*H*n)。
所以判斷是否是地圖文件很簡單,只要看一下文件的頭,然后查看一下文件的大小。如果有一組文件滿足上面的規(guī)律的話,那基本上可以肯定是地圖資源文件了。接下來就是要把游戲地圖轉(zhuǎn)化為BOOL地圖。前面提到地圖文件中地圖上的一個(gè)點(diǎn)通常有n個(gè)字節(jié)所構(gòu)成,里面含有很多豐富的信息,而BOOL地圖所關(guān)心的是否是可移動(dòng)點(diǎn)的信息通常僅需要用1位即可表示。(注意是位,1個(gè)字節(jié)有8位,所以n個(gè)字節(jié)總共有8n位)將一張游戲地圖中所有點(diǎn)的該位信息收集起來組成的新的地圖就是BOOL地圖。它標(biāo)示了地圖中那些區(qū)域玩家是可移動(dòng)的,那些區(qū)域是不可移動(dòng)的,為后面的尋路算法提供了基礎(chǔ)數(shù)據(jù)。原理明白了,接下去就是寫一個(gè)程序解析地圖資源。大致步驟如下: 首先打開一個(gè)地圖文件 然后讀入地圖文件的頭信息,解析出地圖寬度和高度
最后讀入地圖點(diǎn)信息,對每一個(gè)點(diǎn)所代表的n字節(jié)數(shù)據(jù)執(zhí)行位操作,提煉出其中某一位的信息,保存到自己的結(jié)構(gòu)中。(此處我建議大家采用BMP格式的數(shù)據(jù)來保存提煉出來的位信息,好處有三點(diǎn):一是保存完之后,直接可以用圖片瀏覽工具查看結(jié)果,不必自己再寫一個(gè)繪制的程序,二是使用BMP格式保存的話,保存的數(shù)據(jù)容量也小,三是在外掛中顯示地圖時(shí)可以將BMP圖片直接作為背景圖片貼在窗口上。)由于之前你尚無法確定n字節(jié)中的哪一位代表了點(diǎn)的是否可移動(dòng)屬性,所以每一位你都要取一遍組成一幅地圖,然后查看哪一幅和游戲地圖最接近。多讀幾個(gè)地圖文件做實(shí)驗(yàn),很容易就可以確認(rèn)下來的。
第二其他資源的解析:地圖資源的解析是通過了解物理磁盤上地圖文件的保存格式,然后自己寫程序解析出來的,使用這種方法還可以解析其他很多資源信息。大家可以仔細(xì)觀察游戲的安裝目錄,根據(jù)子目錄和文件的名字可以分析出很多有用的信息。 但目前游戲廠商將保存在磁盤上的資源文件通常進(jìn)行了變形(壓縮或者加密),使你無法通過簡單的分析獲得你所需要的信息。 一種解決辦法就是觀察游戲是如何處理變型的資源文件的。因?yàn)樵谟螒蛑匈Y源肯定是以原始形式存在的,通常都是在游戲初始化的時(shí)候,從磁盤上讀入變形的資源文件,然后將其恢復(fù)為原始狀態(tài)的資源形式,我們就跟蹤該段的處理過程,然后自己模仿寫一段程序?qū)⒆冃钨Y源恢復(fù)為原始資源形式。 另外一種方法就是直接從游戲的內(nèi)存中讀取有用的資源信息。該方法的理論依據(jù)就是:資源信息在游戲中肯定是明文形態(tài),而且是被有序組織的。比如,如果你想要獲得所有游戲物品的信息列表,你可以隨意選擇一個(gè)物品名稱,然后在游戲的內(nèi)存中查找他的位置。所有的物品在游戲內(nèi)存中肯定是以某種鏈表的形式存在的,你只要找到了一個(gè),就可以順藤摸瓜,找到該鏈表的頭,然后自己寫一個(gè)程序,讀寫游戲的內(nèi)存空間,將整個(gè)游戲的物品列表全部讀取出來。
7、網(wǎng)游中的算法
尋路算法:外掛中最有名的,也最重要的一個(gè)算法就是尋路算法了。所謂尋路算法就是指給定一張地圖數(shù)據(jù),以及起始點(diǎn)和目標(biāo)點(diǎn),然后利用算法計(jì)算出一條路徑來。它所依賴的數(shù)據(jù)基礎(chǔ)是BOOL地圖,這個(gè)我們在之前的講述中已經(jīng)成功獲得了。
具體算法如下:常用的尋路算法實(shí)現(xiàn)有二種,一種是A*算法,還有一種等高線算法。還記得在大學(xué)里面學(xué)過遍歷圖的二種算法嗎,一種是深度優(yōu)先,一種是廣度優(yōu)先。A*算法就對應(yīng)了深度優(yōu)先算法,而等高線算法則對應(yīng)了廣度優(yōu)先算法。 A*算法是最常用的尋路算法了,不過它也有個(gè)很大的缺陷,那就是計(jì)算出來的路徑通常是貼邊的,所以如果你在游戲中觀察用外掛控制的人物的走動(dòng)的話,你會(huì)發(fā)現(xiàn)他通常是沿著障礙物的邊走動(dòng)的,走動(dòng)起來顯得很不自然。 A*算法和等高線算法在網(wǎng)上都有很多例子,在我的站點(diǎn)上也提供了這二個(gè)算法的實(shí)現(xiàn)(C++版)。下面這張圖顯示的是A*算法和等高算法的具體應(yīng)用。
其他算法:外掛中除了尋路算法之外,還有其他的一些算法應(yīng)用,比如地圖間移動(dòng)算法:在已知各個(gè)地圖間傳送點(diǎn)的情況下,計(jì)算出從地圖A移動(dòng)到地圖B所要經(jīng)過的所有地圖,這同樣是一個(gè)經(jīng)典的圖論算法問題。 此外還有打怪時(shí)如何搜索最近怪物的算法,以及最有效的自動(dòng)戰(zhàn)斗的算法,這些算法要根據(jù)每款游戲的實(shí)際情況而進(jìn)行相應(yīng)的變動(dòng)。
8、使用編程工具進(jìn)行外掛功能開發(fā)
選擇何種編程語言和工具制作外掛則沒有限定,常用的如VC,Delphi,VB…等都可以,具體的編程過程再以后的文章里會(huì)詳述。
五、學(xué)習(xí)編寫游戲外掛我們需要掌握哪些基礎(chǔ)知識(shí)?
1、要學(xué)會(huì)編程
至少要掌握可視化編程,如學(xué)習(xí)VC,Delphi,VB等編程語言
2、學(xué)會(huì)簡單分析游戲
需要會(huì)使用一些工具,分析游戲的窗口,控件,進(jìn)程,線程,DLL模塊,內(nèi)存..因?yàn)樽鐾鈷炀褪且刂朴螒虺绦?所以需要學(xué)會(huì)分析游戲的這些表面特征與內(nèi)在數(shù)據(jù).了解了游戲的基本構(gòu)造才能針對性的編寫外掛功能.
3、學(xué)會(huì)API
學(xué)習(xí)一下基本的Win32 API調(diào)用很有必要,主要是那些進(jìn)程線程操作,內(nèi)存讀寫,DC設(shè)備對象,鼠標(biāo)鍵盤模擬等。
4、學(xué)會(huì)用CE查找動(dòng)態(tài)內(nèi)存基址
CE可是個(gè)利器,對于查找解決游戲中的動(dòng)態(tài)內(nèi)存等有奇效,用法上也不難,花個(gè)幾天時(shí)間就能學(xué)會(huì)基本的操作了,對于簡單的人物信息數(shù)據(jù)等很容易找到,但對于地圖物品,怪物數(shù)組的內(nèi)存稍復(fù)雜.
5、學(xué)會(huì)OD調(diào)試游戲找關(guān)鍵CALL
游戲也是編出來的,里面也是有一個(gè)一個(gè)的功能函數(shù)組合起來.找到一些關(guān)鍵的功能函數(shù)入口地址,并分析出該函數(shù)的參數(shù),就可以編寫CALL代碼,來直接調(diào)用游戲中的函數(shù),讓其實(shí)現(xiàn)自動(dòng)化.
6、學(xué)會(huì)寫CALL代碼
對于C語言來說,本身就支持匯編指令編寫,但是易語言不支持,幸好網(wǎng)上也有人做出過一些匯編模塊,可以使用這些匯編來編寫CALL調(diào)用代碼,也可以使用外掛作坊模塊里的 調(diào)用函數(shù)() CALL() 調(diào)用機(jī)器碼() 等命令.
7、加解密封包
用OD調(diào)試游戲中收發(fā)封包的API上下層函數(shù),這里的函數(shù)循環(huán)體基本上都是游戲的數(shù)據(jù)包加解密功能了.可以分析之后自已編寫出這兩個(gè)函數(shù)代碼,也可以直接CALL游戲中現(xiàn)成的加解密函數(shù)體.還要分析封包的封裝的消息格式.
8、分析游戲地圖與尋路
有些游戲里本身就有自動(dòng)點(diǎn)擊行走或?qū)ぢ返墓δ?可以很方便的利用之,若沒有這些的話,就得分析了,這個(gè)有相當(dāng)?shù)碾y度.是做掛機(jī)掛的必經(jīng)之路.
?
總結(jié)
以上是生活随笔為你收集整理的“黑客”深度学习之“游戏外挂原理实现”之美的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中什么是运行异常_在java中最
- 下一篇: 实例17:python