一、 前言
所謂游戲外掛,其實(shí)是一種游戲外輔程序,它可以協(xié)助玩家自動產(chǎn)生游戲動作、修改游戲網(wǎng)絡(luò)數(shù)據(jù)包以及修改游戲內(nèi)存數(shù)據(jù)等,以實(shí)現(xiàn)玩家用最少的時(shí)間和金錢去完成功力升級和過關(guān)斬將。雖然,現(xiàn)在對游戲外掛程序的“合法”身份眾說紛紜,在這里我不想對此發(fā)表任何個(gè)人意見,讓時(shí)間去說明一切吧。
不管游戲外掛程序是不是“合法”身份,但是它卻是具有一定的技術(shù)含量的,在這些小小程序中使用了許多高端技術(shù),如攔截Sock技術(shù)、攔截API技術(shù)、模擬鍵盤與鼠標(biāo)技術(shù)、直接修改程序內(nèi)存技術(shù)等等。本文將對常見的游戲外掛中使用的技術(shù)進(jìn)行全面剖析。
二、認(rèn)識外掛
游戲外掛的歷史可以追溯到單機(jī)版游戲時(shí)代,只不過當(dāng)時(shí)它使用了另一個(gè)更通俗易懂的名字??游戲修改器。它可以在游戲中追蹤鎖定游戲主人公的各項(xiàng)能力數(shù)值。這樣玩家在游戲中可以達(dá)到主角不掉血、不耗費(fèi)魔法、不消耗金錢等目的。這樣降低了游戲的難度,使得玩家更容易通關(guān)。
隨著網(wǎng)絡(luò)游戲的時(shí)代的來臨,游戲外掛在原有的功能之上進(jìn)行了新的發(fā)展,它變得更加多種多樣,功能更加強(qiáng)大,操作更加簡單,以至有些游戲的外掛已經(jīng)成為一個(gè)體系,比如《石器時(shí)代》,外掛品種達(dá)到了幾十種,自動戰(zhàn)斗、自動行走、自動練級、自動補(bǔ)血、加速、不遇敵、原地遇敵、快速增加經(jīng)驗(yàn)值、按鍵精靈……幾乎無所不包。
游戲外掛的設(shè)計(jì)主要是針對于某個(gè)游戲開發(fā)的,我們可以根據(jù)它針對的游戲的類型可大致可將外掛分為兩種大類。
一類是將游戲中大量繁瑣和無聊的攻擊動作使用外掛自動完成,以幫助玩家輕松搞定攻擊對象并可以快速的增加玩家的經(jīng)驗(yàn)值。比如在《龍族》中有一種工作的設(shè)定,玩家的工作等級越高,就可以駕馭越好的裝備。但是增加工作等級卻不是一件有趣的事情,毋寧說是重復(fù)枯燥的機(jī)械勞動。如果你想做法師用的杖,首先需要做基本工作--?砍樹。砍樹的方法很簡單,在一棵大樹前不停的點(diǎn)鼠標(biāo)就可以了,每10000的經(jīng)驗(yàn)升一級。這就意味著玩家要在大樹前不停的點(diǎn)擊鼠標(biāo),這種無聊的事情通過"按鍵精靈"就可以解決。外掛的"按鍵精靈"功能可以讓玩家擺脫無趣的點(diǎn)擊鼠標(biāo)的工作。
另一類是由外掛程序產(chǎn)生欺騙性的網(wǎng)絡(luò)游戲封包,并將這些封包發(fā)送到網(wǎng)絡(luò)游戲服務(wù)器,利用這些虛假信息欺騙服務(wù)器進(jìn)行游戲數(shù)值的修改,達(dá)到修改角色能力數(shù)值的目的。這類外掛程序針對性很強(qiáng),一般在設(shè)計(jì)時(shí)都是針對某個(gè)游戲某個(gè)版本來做的,因?yàn)槊總€(gè)網(wǎng)絡(luò)游戲服務(wù)器與客戶端交流的數(shù)據(jù)包各不相同,外掛程序必須要對欺騙的網(wǎng)絡(luò)游戲服務(wù)器的數(shù)據(jù)包進(jìn)行分析,才能產(chǎn)生服務(wù)器識別的數(shù)據(jù)包。這類外掛程序也是當(dāng)前最流利的一類游戲外掛程序。
另外,現(xiàn)在很多外掛程序功能強(qiáng)大,不僅實(shí)現(xiàn)了自動動作代理和封包功能,而且還提供了對網(wǎng)絡(luò)游戲的客戶端程序的數(shù)據(jù)進(jìn)行修改,以達(dá)到欺騙網(wǎng)絡(luò)游戲服務(wù)器的目的。我相信,隨著網(wǎng)絡(luò)游戲商家的反外掛技術(shù)的進(jìn)展,游戲外掛將會產(chǎn)生更多更優(yōu)秀的技術(shù),讓我們期待著看場技術(shù)大戰(zhàn)吧......
三、外掛技術(shù)綜述
可以將開發(fā)游戲外掛程序的過程大體上劃分為兩個(gè)部分:
前期部分工作是對外掛的主體游戲進(jìn)行分析,不同類型的外掛分析主體游戲的內(nèi)容也不相同。如外掛為上述談到的外掛類型中的第一類時(shí),其分析過程常是針對游戲的場景中的攻擊對象的位置和分布情況進(jìn)行分析,以實(shí)現(xiàn)外掛自動進(jìn)行攻擊以及位置移動。如外掛為外掛類型中的第二類時(shí),其分析過程常是針對游戲服務(wù)器與客戶端之間通訊包數(shù)據(jù)的結(jié)構(gòu)、內(nèi)容以及加密算法的分析。因網(wǎng)絡(luò)游戲公司一般都不會公布其游戲產(chǎn)品的通訊包數(shù)據(jù)的結(jié)構(gòu)、內(nèi)容和加密算法的信息,所以對于開發(fā)第二類外掛成功的關(guān)鍵在于是否能正確分析游戲包數(shù)據(jù)的結(jié)構(gòu)、內(nèi)容以及加密算法,雖然可以使用一些工具輔助分析,但是這還是一種堅(jiān)苦而復(fù)雜的工作。
后期部分工作主要是根據(jù)前期對游戲的分析結(jié)果,使用大量的程序開發(fā)技術(shù)編寫外掛程序以實(shí)現(xiàn)對游戲的控制或修改。如外掛程序?yàn)榈谝活愅鈷鞎r(shí),通常會使用到鼠標(biāo)模擬技術(shù)來實(shí)現(xiàn)游戲角色的自動位置移動,使用鍵盤模擬技術(shù)來實(shí)現(xiàn)游戲角色的自動攻擊。如外掛程序?yàn)榈诙愅鈷鞎r(shí),通常會使用到擋截Sock和擋截API函數(shù)技術(shù),以擋截游戲服務(wù)器傳來的網(wǎng)絡(luò)數(shù)據(jù)包并將數(shù)據(jù)包修改后封包后傳給游戲服務(wù)器。另外,還有許多外掛使用對游戲客戶端程序內(nèi)存數(shù)據(jù)修改技術(shù)以及游戲加速技術(shù)。
本文主要是針對開發(fā)游戲外掛程序后期使用的程序開發(fā)技術(shù)進(jìn)行探討,重點(diǎn)介紹的如下幾種在游戲外掛中常使用的程序開發(fā)技術(shù):
● 動作模擬技術(shù):主要包括鍵盤模擬技術(shù)和鼠標(biāo)模擬技術(shù)。
● 封包技術(shù):主要包括擋截Sock技術(shù)和擋截API技術(shù)。 四、動作模擬技術(shù)
我們在前面介紹過,幾乎所有的游戲都有大量繁瑣和無聊的攻擊動作以增加玩家的功力,還有那些數(shù)不完的迷宮,這些好像已經(jīng)成為了角色游戲的代名詞。現(xiàn)在,外掛可以幫助玩家從這些繁瑣而無聊的工作中擺脫出來,專注于游戲情節(jié)的進(jìn)展。外掛程序?yàn)榱藢?shí)現(xiàn)自動角色位置移動和自動攻擊等功能,需要使用到鍵盤模擬技術(shù)和鼠標(biāo)模擬技術(shù)。下面我們將重點(diǎn)介紹這些技術(shù)并編寫一個(gè)簡單的實(shí)例幫助讀者理解動作模擬技術(shù)的實(shí)現(xiàn)過程。
1. 鼠標(biāo)模擬技術(shù) 幾乎所有的游戲中都使用了鼠標(biāo)來改變角色的位置和方向,玩家僅用一個(gè)小小的鼠標(biāo),就可以使角色暢游天下。那么,我們?nèi)绾螌?shí)現(xiàn)在沒有玩家的參與下角色也可以自動行走呢。其實(shí)實(shí)現(xiàn)這個(gè)并不難,僅僅幾個(gè)Windows API函數(shù)就可以搞定,讓我們先來認(rèn)識認(rèn)識這些API函數(shù)。
(1) 模擬鼠標(biāo)動作API函數(shù)mouse_event,它可以實(shí)現(xiàn)模擬鼠標(biāo)按下和放開等動作。
VOID mouse_event( DWORD dwFlags, // 鼠標(biāo)動作標(biāo)識。 DWORD dx, // 鼠標(biāo)水平方向位置。 DWORD dy, // 鼠標(biāo)垂直方向位置。 DWORD dwData, // 鼠標(biāo)輪子轉(zhuǎn)動的數(shù)量。 DWORD dwExtraInfo // 一個(gè)關(guān)聯(lián)鼠標(biāo)動作輔加信息。 );
其中,dwFlags表示了各種各樣的鼠標(biāo)動作和點(diǎn)擊活動,它的常用取值如下:
MOUSEEVENTF_MOVE 表示模擬鼠標(biāo)移動事件。
MOUSEEVENTF_LEFTDOWN 表示模擬按下鼠標(biāo)左鍵。
MOUSEEVENTF_LEFTUP 表示模擬放開鼠標(biāo)左鍵。
MOUSEEVENTF_RIGHTDOWN 表示模擬按下鼠標(biāo)右鍵。
MOUSEEVENTF_RIGHTUP 表示模擬放開鼠標(biāo)右鍵。
MOUSEEVENTF_MIDDLEDOWN 表示模擬按下鼠標(biāo)中鍵。
MOUSEEVENTF_MIDDLEUP 表示模擬放開鼠標(biāo)中鍵。
(2)、設(shè)置和獲取當(dāng)前鼠標(biāo)位置的API函數(shù)。獲取當(dāng)前鼠標(biāo)位置使用GetCursorPos()函數(shù),設(shè)置當(dāng)前鼠標(biāo)位置使用SetCursorPos()函數(shù)。
BOOL GetCursorPos( LPPOINT lpPoint // 返回鼠標(biāo)的當(dāng)前位置。 ); BOOL SetCursorPos( int X, // 鼠標(biāo)的水平方向位置。 int Y //鼠標(biāo)的垂直方向位置。 );??
通常游戲角色的行走都是通過鼠標(biāo)移動至目的地,然后按一下鼠標(biāo)的按鈕就搞定了。下面我們使用上面介紹的API函數(shù)來模擬角色行走過程。
CPoint oldPoint,newPoint; GetCursorPos(&oldPoint); //保存當(dāng)前鼠標(biāo)位置。 newPoint.x = oldPoint.x+40; newPoint.y = oldPoint.y+10; SetCursorPos(newPoint.x,newPoint.y); //設(shè)置目的地位置。 mouse_event(MOUSEEVENTF_RIGHTDOWN,0,0,0,0);//模擬按下鼠標(biāo)右鍵。 mouse_event(MOUSEEVENTF_RIGHTUP,0,0,0,0);//模擬放開鼠標(biāo)右鍵。??
2. 鍵盤模擬技術(shù)
在很多游戲中,不僅提供了鼠標(biāo)的操作,而且還提供了鍵盤的操作,在對攻擊對象進(jìn)行攻擊時(shí)還可以使用快捷鍵。為了使這些攻擊過程能夠自動進(jìn)行,外掛程序需要使用鍵盤模擬技術(shù)。像鼠標(biāo)模擬技術(shù)一樣,Windows API也提供了一系列API函數(shù)來完成對鍵盤動作的模擬。
模擬鍵盤動作API函數(shù)keydb_event,它可以模擬對鍵盤上的某個(gè)或某些鍵進(jìn)行按下或放開的動作。
VOID keybd_event( BYTE bVk, // 虛擬鍵值。 BYTE bScan, // 硬件掃描碼。 DWORD dwFlags, // 動作標(biāo)識。 DWORD dwExtraInfo // 與鍵盤動作關(guān)聯(lián)的輔加信息。 );
其中,bVk表示虛擬鍵值,其實(shí)它是一個(gè)BYTE類型值的宏,其取值范圍為1-254。有關(guān)虛擬鍵值表請?jiān)?span lang="EN-US">MSDN上使用關(guān)鍵字“Virtual-Key Codes”查找相關(guān)資料。bScan表示當(dāng)鍵盤上某鍵被按下和放開時(shí),鍵盤系統(tǒng)硬件產(chǎn)生的掃描碼,我們可以MapVirtualKey()函數(shù)在虛擬鍵值與掃描碼之間進(jìn)行轉(zhuǎn)換。dwFlags表示各種各樣的鍵盤動作,它有兩種取值:KEYEVENTF_EXTENDEDKEY和KEYEVENTF_KEYUP。
下面我們使用一段代碼實(shí)現(xiàn)在游戲中按下Shift+R快捷鍵對攻擊對象進(jìn)行攻擊。
keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0),0,0); //按下CTRL鍵。 keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//鍵下R鍵。 keybd_event(0x52,MapVirtualKey(0x52,0), KEYEVENTF_KEYUP,0);//放開R鍵。 keybd_event(VK_CONTROL,MapVirtualKey(VK_CONTROL,0), KEYEVENTF_KEYUP,0);//放開CTRL鍵。
3. 激活外掛
上面介紹的鼠標(biāo)和鍵盤模擬技術(shù)實(shí)現(xiàn)了對游戲角色的動作部分的模擬,但要想外掛能工作于游戲之上,還需要將其與游戲的場景窗口聯(lián)系起來或者使用一個(gè)激活鍵,就象按鍵精靈的那個(gè)激活鍵一樣。我們可以用GetWindow函數(shù)來枚舉窗口,也可以用Findwindow函數(shù)來查找特定的窗口。另外還有一個(gè)FindWindowEx函數(shù)可以找到窗口的子窗口,當(dāng)游戲切換場景的時(shí)候我們可以用FindWindowEx來確定一些當(dāng)前窗口的特征,從而判斷是否還在這個(gè)場景,方法很多了,比如可以GetWindowInfo來確定一些東西,比如當(dāng)查找不到某個(gè)按鈕的時(shí)候就說明游戲場景已經(jīng)切換了等等辦法。當(dāng)使用激活鍵進(jìn)行關(guān)聯(lián),需要使用Hook技術(shù)開發(fā)一個(gè)全局鍵盤鉤子,在這里就不具體介紹全局鉤子的開發(fā)過程了,在后面的實(shí)例中我們將會使用到全局鉤子,到時(shí)將學(xué)習(xí)到全局鉤子的相關(guān)知識。
|