版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
游戲輔助制作原理目錄TOC\o"1-5"\h\z一、 前言 1\o"CurrentDocument"二、 認(rèn)識(shí)輔助 1\o"CurrentDocument"三、 輔助技術(shù)綜述 3\o"CurrentDocument"動(dòng)作模擬技術(shù) 4\o"CurrentDocument"封包技術(shù) 16\o"CurrentDocument"結(jié)束語 25、前言游戲外輔程序,可以協(xié)助玩家自動(dòng)產(chǎn)生游戲動(dòng)作、修改游戲網(wǎng)絡(luò)數(shù)據(jù)包以及修改游戲內(nèi)存數(shù)據(jù)等,以實(shí)現(xiàn)玩家用最少的時(shí)間和金錢去完成功力升級(jí)和過關(guān)斬將。雖然,現(xiàn)在對(duì)游戲輔助程序的“合法”身份眾說紛紜,在這里我不想對(duì)此發(fā)表任何個(gè)人意見,讓時(shí)間去說明一切吧。不管游戲輔助程序是不是“合法”身份,但是它卻是具有一定的技術(shù)含量的,在這些小小程序中使用了許多高端技術(shù),如攔截Sock技術(shù)、攔截API技術(shù)、模擬鍵盤與鼠標(biāo)技術(shù)、直接修改程序內(nèi)存技術(shù)等等。本文將對(duì)常見的游戲輔助中使用的技術(shù)進(jìn)行全面剖析。二、認(rèn)識(shí)輔助游戲輔助的歷史可以追溯到單機(jī)版游戲時(shí)代,只不過當(dāng)時(shí)它使用了另一個(gè)更通俗易懂的名字一一游戲修改器。它可以在游戲中追蹤鎖定游戲主人公的各項(xiàng)能力數(shù)值。這樣玩家在游戲中可以達(dá)到主角不掉血、不耗費(fèi)魔法、不消耗金錢等目的。這樣降低了游戲的難度,使得玩家更容易通關(guān)。隨著網(wǎng)絡(luò)游戲的時(shí)代的來臨,游戲輔助在原有的功能之上進(jìn)行了新的發(fā)展,它變得更加多種多樣,功能更加強(qiáng)大,操作更加簡(jiǎn)單,以至有些游戲的輔助已經(jīng)成為一個(gè)體系,比如《石器時(shí)代》,輔助品種達(dá)到了幾十種,自動(dòng)戰(zhàn)斗、自動(dòng)行走、自動(dòng)練級(jí)、自動(dòng)補(bǔ)血、加速、不遇敵、原地遇敵、快速增加經(jīng)驗(yàn)值、按鍵精靈……幾乎無所不包。游戲輔助的設(shè)計(jì)主要是針對(duì)于某個(gè)游戲開發(fā)的,我們可以根據(jù)它針對(duì)的游戲的類型可大致可將輔助分為兩種大類。一類是將游戲中大量繁瑣和無聊的攻擊動(dòng)作使用輔助自動(dòng)完成,以幫助玩家輕松搞定攻擊對(duì)象并可以快速的增加玩家的經(jīng)驗(yàn)值。比如在《龍族》中有一種工作的設(shè)定,玩家的工作等級(jí)越高,就可以駕馭越好的裝備。但是增加工作等級(jí)卻不是一件有趣的事情,毋寧說是重復(fù)枯燥的機(jī)械勞動(dòng)。如果你想做法師用的杖,首先需要做基本工作--?砍樹??硺涞姆椒ê芎?jiǎn)單,在一棵大樹前不停的點(diǎn)鼠標(biāo)就可以了,每10000的經(jīng)驗(yàn)升一級(jí)。這就意味著玩家要在大樹前不停的點(diǎn)擊鼠標(biāo),這種無聊的事情通過〃按鍵精靈〃就可以解決。輔助的〃按鍵精靈〃功能可以讓玩家擺脫無趣的點(diǎn)擊鼠標(biāo)的工作。另一類是由輔助程序產(chǎn)生欺騙性的網(wǎng)絡(luò)游戲封包,并將這些封包發(fā)送到網(wǎng)絡(luò)游戲服器,利用這些虛假信息欺騙服務(wù)器進(jìn)行游戲數(shù)值的修改,達(dá)到修改角色能力數(shù)值的目的。這類輔助程序針對(duì)性很強(qiáng),一般在設(shè)計(jì)時(shí)都是針對(duì)某個(gè)游戲某個(gè)版本來做的,因?yàn)槊總€(gè)網(wǎng)絡(luò)游戲服務(wù)器與客戶端交流的數(shù)據(jù)包各不相同,輔助程序必須要對(duì)欺騙的網(wǎng)絡(luò)游戲服務(wù)器的數(shù)據(jù)包進(jìn)行分析,才能產(chǎn)生服務(wù)器識(shí)別的數(shù)據(jù)包。這類輔助程序也是當(dāng)前最流利的一類游戲輔助程序。另外,現(xiàn)在很多輔助程序功能強(qiáng)大,不僅實(shí)現(xiàn)了自動(dòng)動(dòng)作代理和封包功能,而且還提供了對(duì)網(wǎng)絡(luò)游戲的客戶端程序的數(shù)據(jù)進(jìn)行修改,以達(dá)到欺騙網(wǎng)絡(luò)游戲服務(wù)器的目的。我相信,隨著網(wǎng)絡(luò)游戲商家的反輔助技術(shù)的進(jìn)展,游戲輔助將會(huì)產(chǎn)生更多更優(yōu)秀的技術(shù),讓我們期待著看場(chǎng)技術(shù)大戰(zhàn)吧 三、輔助技術(shù)綜述可以將開發(fā)游戲輔助程序的過程大體上劃分為兩個(gè)部分:前期部分工作是對(duì)輔助的主體游戲進(jìn)行分析,不同類型的輔助分析主體游戲的內(nèi)容也不相同。如輔助為上述談到的輔助類型中的第一類時(shí),其分析過程常是針對(duì)游戲的場(chǎng)景中的攻擊對(duì)象的位置和分布情況進(jìn)行分析,以實(shí)現(xiàn)輔助自動(dòng)進(jìn)行攻擊以及位置移動(dòng)。如輔助為輔助類型中的第二類時(shí),其分析過程常是針對(duì)游戲服務(wù)器與客戶端之間通訊包數(shù)據(jù)的結(jié)構(gòu)、內(nèi)容以及加密算法的分析。因網(wǎng)絡(luò)游戲公司一般都不會(huì)公布其游戲產(chǎn)品的通訊包數(shù)據(jù)的結(jié)構(gòu)、內(nèi)容和加密算法的信息,所以對(duì)于開發(fā)第二類輔助成功的關(guān)鍵在于是否能正確分析游戲包數(shù)據(jù)的結(jié)構(gòu)、內(nèi)容以及加密算法,雖然可以使用一些工具輔助分析,但是這還是一種堅(jiān)苦而復(fù)雜的工作。后期部分工作主要是根據(jù)前期對(duì)游戲的分析結(jié)果,使用大量的程序開發(fā)技術(shù)編寫輔助程序以實(shí)現(xiàn)對(duì)游戲的控制或修改。如輔助程序?yàn)榈谝活愝o助時(shí),通常會(huì)使用到鼠標(biāo)模擬技術(shù)來實(shí)現(xiàn)游戲角色的自動(dòng)位置移動(dòng),使用鍵盤模擬技術(shù)來實(shí)現(xiàn)游戲角色的自動(dòng)攻擊。如輔助程序?yàn)榈诙愝o助時(shí),通常會(huì)使用到擋截Sock和擋截API函數(shù)技術(shù),以擋截游戲服務(wù)器傳來的網(wǎng)絡(luò)數(shù)據(jù)包并將數(shù)據(jù)包修改后封包后傳給游戲服務(wù)器。另外,還有許多輔助使用對(duì)游戲客戶端程序內(nèi)存數(shù)據(jù)修改技術(shù)以及游戲加速技術(shù)。本文主要是針對(duì)開發(fā)游戲輔助程序后期使用的程序開發(fā)技術(shù)進(jìn)行探討,重點(diǎn)介紹的如下幾種在游戲輔助中常使用的程序開發(fā)技術(shù):?動(dòng)作模擬技術(shù):主要包括鍵盤模擬技術(shù)和鼠標(biāo)模擬技術(shù)。?封包技術(shù):主要包括擋截Sock技術(shù)和擋截API技術(shù)。動(dòng)作模擬技術(shù)我們?cè)谇懊娼榻B過,幾乎所有的游戲都有大量繁瑣和無聊的攻擊動(dòng)作以增加玩家的功力,還有那些數(shù)不完的迷宮,這些好像已經(jīng)成為了角色游戲的代名詞。現(xiàn)在,輔助可以幫助玩家從這些繁瑣而無聊的工作中擺脫出來,專注于游戲情節(jié)的進(jìn)展。輔助程序?yàn)榱藢?shí)現(xiàn)自動(dòng)角色位置移動(dòng)和自動(dòng)攻擊等功能,需要使用到鍵盤模擬技術(shù)和鼠標(biāo)模擬技術(shù)。下面我們將重點(diǎn)介紹這些技術(shù)并編寫一個(gè)簡(jiǎn)單的實(shí)例幫助讀者理解動(dòng)作模擬技術(shù)的實(shí)現(xiàn)過程。鼠標(biāo)模擬技術(shù)幾乎所有的游戲中都使用了鼠標(biāo)來改變角色的位置和方向,玩家僅用一個(gè)小小的鼠標(biāo),就可以使角色暢游天下。那么,我們?nèi)绾螌?shí)現(xiàn)在沒有玩家的參與下角色也可以自動(dòng)行走呢。其實(shí)實(shí)現(xiàn)這個(gè)并不難,僅僅幾個(gè)WindowsAPI函數(shù)就可以搞定,讓我們先來認(rèn)識(shí)認(rèn)識(shí)這些API函數(shù)。模擬鼠標(biāo)動(dòng)作API函數(shù)mouse_event,它可以實(shí)現(xiàn)模擬鼠標(biāo)按下和放開等動(dòng)作。VOIDmouse_event(DWORDdwFlags,//鼠標(biāo)動(dòng)作標(biāo)識(shí)。DWORDdx,//鼠標(biāo)水平方向位置。DWORDdy,//鼠標(biāo)垂直方向位置。DWORDdwData,//鼠標(biāo)輪子轉(zhuǎn)動(dòng)的數(shù)量。DWORDdwExtraInfo//一個(gè)關(guān)聯(lián)鼠標(biāo)動(dòng)作輔加信息。);其中,dwFlags表示了各種各樣的鼠標(biāo)動(dòng)作和點(diǎn)擊活動(dòng),它的常用取值如下:MOUSEEVENTF_MOVE表示模擬鼠標(biāo)移動(dòng)事件。MOUSEEVENTF_LEFTDOWN表示模擬按下鼠標(biāo)左鍵。MOUSEEVENTF_LEFTUP表示模擬放開鼠標(biāo)左鍵。MOUSEEVENTF_RIGHTDOWN表示模擬按下鼠標(biāo)右鍵。MOUSEEVENTF_RIGHTUP表示模擬放開鼠標(biāo)右鍵。MOUSEEVENTF_MIDDLEDOWN表示模擬按下鼠標(biāo)中鍵。MOUSEEVENTF_MIDDLEUP表示模擬放開鼠標(biāo)中鍵。、設(shè)置和獲取當(dāng)前鼠標(biāo)位置的API函數(shù)。獲取當(dāng)前鼠標(biāo)位置使用GetCursorPos()函數(shù),設(shè)置當(dāng)前鼠標(biāo)位置使用SetCursorPos()函數(shù)。BOOLGetCursorPos(LPPOINTlpPoint//返回鼠標(biāo)的當(dāng)前位置。);BOOLSetCursorPos(intX,//鼠標(biāo)的水平方向位置。intY〃鼠標(biāo)的垂直方向位置。);通常游戲角色的行走都是通過鼠標(biāo)移動(dòng)至目的地,然后按一下鼠標(biāo)的按鈕就搞定了。下面我們使用上面介紹的API函數(shù)來模擬角色行走過程。CPointoldPoint,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(M0USEEVENTF_RIGHTD0WN,0,0,0,0);//模擬按下鼠標(biāo)右鍵。mouse_event(M0USEEVENTF_RIGHTUP,0,0,0,0);//模擬放開鼠標(biāo)右鍵。鍵盤模擬技術(shù)在很多游戲中,不僅提供了鼠標(biāo)的操作,而且還提供了鍵盤的操作,在對(duì)攻擊對(duì)象進(jìn)行攻擊時(shí)還可以使用快捷鍵。為了使這些攻擊過程能夠自動(dòng)進(jìn)行,輔助程序需要使用鍵盤模擬技術(shù)。像鼠標(biāo)模擬技術(shù)一樣,WindowsAPI也提供了一系列API函數(shù)來完成對(duì)鍵盤動(dòng)作的模擬。模擬鍵盤動(dòng)作API函數(shù)keydb_event,它可以模擬對(duì)鍵盤上的某個(gè)或某些鍵進(jìn)行按下或放開的動(dòng)作。VOIDkeybd_event(BYTEbVk,//虛擬鍵值。BYTEbScan,//硬件掃描碼。DWORDdwFlags,//動(dòng)作標(biāo)識(shí)。DWORDdwExtraInfo//與鍵盤動(dòng)作關(guān)聯(lián)的輔加信息。);其中,bVk表示虛擬鍵值,其實(shí)它是一個(gè)BYTE類型值的宏,其取值范圍為1-254。有關(guān)虛擬鍵值表請(qǐng)?jiān)贛SDN上使用關(guān)鍵字“Virtual-KeyCodes”查找相關(guān)資料。bScan表示當(dāng)鍵盤上某鍵被按下和放開時(shí),鍵盤系統(tǒng)硬件產(chǎn)生的掃描碼,我們可以MapVirtualKey()函數(shù)在虛擬鍵值與掃描碼之間進(jìn)行轉(zhuǎn)換。dwFlags表示各種樣的鍵盤動(dòng)作,它有兩種取值:KEYEVENTF_EXTENDEDKEY和KEYEVENTF_KEYUP。責(zé)任編輯:下面我們使用一段代碼實(shí)現(xiàn)在游戲中按下Shift+R快捷鍵對(duì)攻擊對(duì)象進(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鍵。激活輔助上面介紹的鼠標(biāo)和鍵盤模擬技術(shù)實(shí)現(xiàn)了對(duì)游戲角色的動(dòng)作部分的模擬,但要想輔助能工作于游戲之上,還需要將其與游戲的場(chǎng)景窗口聯(lián)系起來或者使用一個(gè)激活鍵,就象按鍵精靈的那個(gè)激活鍵一樣。我們可以用GetWindow函數(shù)來枚舉窗口,也可以用Findwindow函數(shù)來查找特定的窗口。另外還有個(gè)FindWindowEx函數(shù)可以找到窗口的子窗口,當(dāng)游戲切換場(chǎng)景的時(shí)候我們可以用FindWindowEx來確定些當(dāng)前窗口的特征,從而判斷是否還在這個(gè)場(chǎng)景,方法很多了,比如可以GetWindowInfo來確定一些東,比如當(dāng)查找不到某個(gè)按鈕的時(shí)候就說明游戲場(chǎng)景已經(jīng)切換了等等辦法。當(dāng)使用激活鍵進(jìn)行關(guān)聯(lián),需要使用Hook技術(shù)開發(fā)一個(gè)全局鍵盤鉤子,在這里就不具體介紹全局鉤子的開發(fā)過程了,在后面的實(shí)例中我們將會(huì)使用到全局鉤子,到時(shí)將學(xué)習(xí)到全局鉤子的相關(guān)知識(shí)。實(shí)例實(shí)現(xiàn)通過上面的學(xué)習(xí),我們已經(jīng)基本具備了編寫動(dòng)作式游戲輔助的能力了。下面我們將創(chuàng)建一個(gè)畫筆程序輔助,它實(shí)現(xiàn)自動(dòng)移動(dòng)畫筆字光標(biāo)的位置并寫下一個(gè)紅色的“R”字。以這個(gè)實(shí)例為基礎(chǔ),加入相應(yīng)的游戲動(dòng)作規(guī)則,就可以實(shí)現(xiàn)一個(gè)完整的游戲輔助。這里作者不想使用某個(gè)游戲作為例子來開發(fā)輔助(因沒有游戲商家的授權(quán)?。。?,如讀者感興趣的話可以找一個(gè)游戲試試,最好僅做測(cè)試技術(shù)用。首先,我們需要編寫一個(gè)全局鉤子,使用它來激活輔助,激活鍵為F10。創(chuàng)建全局鉤子步驟如下:(1).選擇MFCAppWizard(DLL)創(chuàng)建項(xiàng)目ActiveKey,并選擇MFCExtensionDLL(共享MFC拷貝)類型。.插入新文件ActiveKey.h,在其中輸入如下代碼:#ifndef_KEYDLL_H#define_KEYDLL_HclassAFX_EXT_CLASSCKeyHook:publicCObject(public:CKeyHook();~CKeyHook();HHOOKStart();//安裝鉤子BOOLStop();〃卸載鉤子};#endif.在ActiveKey.cpp文件中加入聲明"#includeActiveKey.h".在ActiveKey.cpp文件中加入共享數(shù)據(jù)段,代碼如下://Shareddatasection#pragmadata_seg("sharedata")HHOOKglhHook=NULL;//鉤子句柄。HINSTANCEglhInstance二NULL;//DLL實(shí)例句柄。#pragmadata_seg().在ActiveKey.def文件中設(shè)置共享數(shù)據(jù)段屬性,代碼如下:SETCTIONSshareddataREADWRITESHARED.在ActiveKey.cpp文件中加入CkeyHook類的實(shí)現(xiàn)代碼和鉤子函數(shù)代碼://鍵盤鉤子處理函數(shù)。extern"C"LRESULTWINAPIKeyboardProc(intnCode,WPARAMwParam,LPARAMlParam)(if(nCode>=0)(if(wParam==0X79)//當(dāng)按下F10鍵時(shí),激活輔助。〃輔助實(shí)現(xiàn)代碼。CPointnewPoint,oldPoint;GetCursorPos(&oldPoint);newPoint.x=oldPoint.x+40;newPoint.y=oldPoint.y+10;SetCursorPos(newPoint.x,newPoint.y);mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);//模擬按下鼠標(biāo)左鍵。mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);//模擬放開鼠標(biāo)左鍵。keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),0,0);〃按下SHIFT鍵。keybd_event(0x52,MapVirtualKey(0x52,0),0,0);//按下R鍵。keybd_event(0x52,MapVirtualKey(0x52,0),KEYEVENTF_KEYUP,0);//放開R鍵。keybd_event(VK_SHIFT,MapVirtualKey(VK_SHIFT,0),KEYEVENTF_KEYUP,0);//放開SHIFT鍵。SetCursorPos(oldPoint.x,oldPoint.y);}}returnCallNextHookEx(glhHook,nCode,wParam,lParam);CKeyHook::CKeyHook(){}CKeyHook::~CKeyHook()(if(glhHook)Stop();}//安裝全局鉤子。HHOOKCKeyHook::Start()(glhHook=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,glhInstance,0);//設(shè)置鍵盤鉤子。returnglhHook;}〃卸載全局鉤子。BOOLCKeyHook::Stop()(BOOLbResult=TRUE;if(glhHook)bResult=UnhookWindowsHookEx(glhHook);//卸載鍵盤鉤子。returnbResult;}.修改DllMain函數(shù),代碼如下:extern"C"intAPIENTRYDllMain(HINSTANCEhInstance,DWORDdwReason,LPVOIDlpReserved)(〃如果使用lpReserved參數(shù)則刪除下面這行UNREFERENCED_PARAMETER(lpReserved);if(dwReason==DLL_PROCESS_ATTACH)(TRACEO("NOtePadHOOK.DLLInitializing!");〃擴(kuò)展DLL僅初始化一次if(!AfxInitExtensionModule(ActiveKeyDLL,hInstance))returnO;newCDynLinkLibrary(ActiveKeyDLL);//把DLL加入動(dòng)態(tài)MFC類庫(kù)中g(shù)lhInstance=hInstance;//插入保存DLL實(shí)例句柄}elseif(dwReason==DLL_PROCESS_DETACH)(TRACE0("NotePadHOOK.DLLTerminating!");〃終止這個(gè)鏈接庫(kù)前調(diào)用它AfxTermExtensionModule(ActiveKeyDLL);}return1;}.編譯項(xiàng)目ActiveKey,生成ActiveKey.DLL和ActiveKey.lib。接著,我們還需要?jiǎng)?chuàng)建一個(gè)外殼程序?qū)⑷帚^子安裝了Windows系統(tǒng)中,這個(gè)外殼程序編寫步驟如下:.創(chuàng)建一個(gè)對(duì)話框模式的應(yīng)用程序,項(xiàng)目名為Simulate。.在主對(duì)話框中加入一個(gè)按鈕,使用ClassWizard為其創(chuàng)建CLICK事件。.將ActiveKey項(xiàng)目Debug目錄下的ActiveKey.DLL和ActiveKey.lib拷貝到Simulate項(xiàng)目目錄下。.從“工程”菜單中選擇“設(shè)置”,彈出ProjectSetting對(duì)話框,選擇Link標(biāo)簽,在“對(duì)象/庫(kù)模塊”中輸入ActiveKey.lib。.將ActiveKey項(xiàng)目中的ActiveKey.h頭文件加入到Simulate項(xiàng)目中,并在Stdafx.h中加入#includeativeKey.h。.在按鈕單擊事件函數(shù)輸入如下代碼:voidCSimulateDlg::OnButton1()(//TODO:Addyourcontrolnotificationhandlercodehereif(!bSetup)(m_hook.Start();//激活全局鉤子。}elsem_hook.Stop();//撤消全局鉤子。}bSetup=!bSetup;}.編譯項(xiàng)目,并運(yùn)行程序,單擊按鈕激活輔助。責(zé)任編輯:.啟動(dòng)畫筆程序,選擇文本工具并將筆的顏色設(shè)置為紅色,將鼠標(biāo)放在任意位置后,按F10鍵,畫筆程序自動(dòng)移動(dòng)鼠標(biāo)并寫下一個(gè)紅色的大寫R。圖一展示了按F10鍵前的畫筆程序的狀態(tài),圖二展示了按F10鍵后的畫筆程序的狀態(tài)。封包技術(shù)通過對(duì)動(dòng)作模擬技術(shù)的介紹,我們對(duì)游戲輔助有了一定程度上的認(rèn)識(shí),也學(xué)會(huì)了使用動(dòng)作模擬技術(shù)來實(shí)現(xiàn)簡(jiǎn)單的動(dòng)作模擬型游戲輔助的制作。這種動(dòng)作模擬型游戲輔助有一定的局限性,它僅僅只能解決使用計(jì)算機(jī)代替人力完成那么有規(guī)律、繁瑣而無聊的游戲動(dòng)作。但是,隨著網(wǎng)絡(luò)游戲的盛行和復(fù)雜度的增加,很多游戲要求將客戶端動(dòng)作信息及時(shí)反饋回服務(wù)器,通過服務(wù)器對(duì)這些動(dòng)作信息進(jìn)行有效認(rèn)證后,再向客戶端發(fā)送下一步游戲動(dòng)作信息,這樣動(dòng)作模擬技術(shù)將失去原有的效應(yīng)。為了更好地“輔助”這些游戲,游戲輔助程序也進(jìn)行了升級(jí)換代,它們將以前針對(duì)游戲用戶界面層的模擬推進(jìn)到數(shù)據(jù)通訊層,通過封包技術(shù)在客戶端擋截游戲服務(wù)器發(fā)送來的游戲控制數(shù)據(jù)包,分析數(shù)據(jù)包并修改數(shù)據(jù)包;同時(shí)還需按照游戲數(shù)據(jù)包結(jié)構(gòu)創(chuàng)建數(shù)據(jù),再模擬客戶端發(fā)送給游戲服務(wù)器,這個(gè)過程其實(shí)就是一個(gè)封包的過程。封包的技術(shù)是實(shí)現(xiàn)第二類游戲輔助的最核心的技術(shù)。封包技術(shù)涉及的知識(shí)很廣泛,實(shí)現(xiàn)方法也很多,如擋截WinSock、擋截API函數(shù)、擋截消息、VxD驅(qū)動(dòng)程序等。在此我們也不可能在此文中將所有的封包技術(shù)都進(jìn)行詳細(xì)介紹,故選擇兩種在游戲輔助程序中最常用的兩種方法:擋截WinSock和擋截API函數(shù)。1.擋截WinSock眾所周知,Winsock是Windows網(wǎng)絡(luò)編程接口,它工作于Windows應(yīng)用層,它提供與底層傳輸協(xié)議無關(guān)的高層數(shù)據(jù)傳輸編程接口。在Windows系統(tǒng)中,使用WinSock接口為應(yīng)用程序提供基于TCP/IP協(xié)議的網(wǎng)絡(luò)訪問服務(wù),這些服務(wù)是由Wsock32.DLL動(dòng)態(tài)鏈接庫(kù)提供的函數(shù)庫(kù)來完成的。由上說明可知,任何Windows基于TCP/IP的應(yīng)用程序都必須通過WinSock接口訪問網(wǎng)絡(luò),當(dāng)然網(wǎng)絡(luò)游戲程序也不例外。由此我們可以想象一下,如果我們可以控制WinSock接口的話,那么控制游戲客戶端程序與服務(wù)器之間的數(shù)據(jù)包也將易如反掌。按著這個(gè)思路,下面的工作就是如何完成控制WinSock接口了。由上面的介紹可知,WinSock接口其實(shí)是由一個(gè)動(dòng)態(tài)鏈接庫(kù)提供的一系列函數(shù),由這些函數(shù)實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)的訪問。有了這層的認(rèn)識(shí),問題就好辦多了,我們可以制作一個(gè)類似的動(dòng)態(tài)鏈接庫(kù)來代替原WinSock接口庫(kù),在其中實(shí)現(xiàn)WinSock32.dll中實(shí)現(xiàn)的所有函數(shù),并保證所有函數(shù)的參數(shù)個(gè)數(shù)和順序、返回值類型都應(yīng)與原庫(kù)相同。在這個(gè)自制作的動(dòng)態(tài)庫(kù)中,可以對(duì)我們感興趣的函數(shù)(如發(fā)送、接收等函數(shù))進(jìn)行擋截,放入輔助控制代碼,最后還繼續(xù)調(diào)用原WinSock庫(kù)中提供的相應(yīng)功能函數(shù),這樣就可以實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)數(shù)據(jù)包的擋截、修改和發(fā)送等封包功能。下面重點(diǎn)介紹創(chuàng)建擋截WinSock輔助程序的基本步驟:(1)創(chuàng)建DLL項(xiàng)目,選擇Win32Dynamic-LinkLibrary,再選擇AnemptyDLLproject。新建文件wsock32.h,按如下步驟輸入代碼:加入相關(guān)變量聲明:HMODULEhModule=NULL;//模塊句柄charbuffer[1000];//緩沖區(qū)FARPROCproc;//函數(shù)入口指針定義指向原WinSock庫(kù)中的所有函數(shù)地址的指針變量,因WinSock庫(kù)共提供70多個(gè)函數(shù),限于篇,在此就只選擇幾個(gè)常用的函數(shù)列出,有關(guān)這些庫(kù)函數(shù)的說明可參考MSDN相關(guān)內(nèi)容。//定義指向原WinSock庫(kù)函數(shù)地址的指針變量。SOCKET(__stdcall*socket1)(int,int,int);//創(chuàng)建Sock函數(shù)。int(__stdcall*WSAStartup1)(WORD,LPWSADATA);//初始化WinSock庫(kù)函數(shù)。int(__stdcall*WSACleanup1)();//清除WinSock庫(kù)函數(shù)。int(__stdcall*recv1)(SOCKET,charFAR*,int,int);//接收數(shù)據(jù)函數(shù)。int(__stdcall*send1)(SOCKET,constchar*,int,int);//發(fā)送數(shù)據(jù)函數(shù)。int(__stdcall*connect1)(SOCKET,conststructsockaddr*,int);//創(chuàng)建連接函數(shù)。int(__stdcall*bind1)(SOCKET,conststructsockaddr*,int);//綁定函數(shù)。 其它函數(shù)地址指針的定義略。新建wsock32.cpp文件,按如下步驟輸入代碼:加入相關(guān)頭文件聲明:#include#include#include"wsock32.h"添加DllMain函數(shù),在此函數(shù)中首先需要加載原WinSock庫(kù),并獲取此庫(kù)中所有函數(shù)的地址。代碼如下:BOOLWINAPIDllMain(HANDLEhInst,ULONGul_reason_for_call,LPVOIDlpReserved)(if(hModule==NULL)(//加載原WinSock庫(kù),原WinSock庫(kù)已復(fù)制為wsock32.001。hModule二LoadLibrary(〃wsock32.001〃);}elsereturn1;if(hModule!=NULL)(//獲取原WinSock庫(kù)初始化函數(shù)的地址,并保存到WSAStartupl中。proc二GetProcAddress(hModule,〃WSAStartup〃);WSAStartup1=(int(_stdcall*)(WORD,LPWSADATA))proc;//獲取原WinSock庫(kù)消除函數(shù)的地址,并保存到WSACleanup1中。proc=GetProcAddress(hModulei,"WSACleanup");WSACleanup1=(int(_stdcall*)())proc;〃獲取原創(chuàng)建Sock函數(shù)的地址,并保存到socket1中。proc=GetProcAddress(hModule,"socket");socket1=(SOCKET(_stdcall*)(int,int,int))proc;//獲取原創(chuàng)建連接函數(shù)的地址,并保存到connect1中。proc=GetProcAddress(hModule,"connect");connect1=(int(_stdcall*)(SOCKET,conststructsockaddr*,int))proc;〃獲取原發(fā)送函數(shù)的地址,并保存到send1中。proc=GetProcAddress(hModule,"send");send1=(int(_stdcall*)(SOCKET,constchar*,int,int))proc;〃獲取原接收函數(shù)的地址,并保存到recv1中。proc=GetProcAddress(hModule,"recv");recv1=(int(_stdcall*)(SOCKET,charFAR*,int,int))proc; 其它獲取函數(shù)地址代碼略。}elsereturn0;return1;}定義庫(kù)輸出函數(shù),在此可以對(duì)我們感興趣的函數(shù)中添加輔助控制代碼,在所有的輸出函數(shù)的最后一步都調(diào)用原WinSock庫(kù)的同名函數(shù)。部分輸出函數(shù)定義代碼如下:〃庫(kù)輸出函數(shù)定義。//WinSock初始化函數(shù)。intPASCALFARWSAStartup(WORDwVersionRequired,LPWSADATAlpWSAData)//調(diào)用原WinSock庫(kù)初始化函數(shù)returnWSAStartup1(wVersionRequired,lpWSAData);}//WinSock結(jié)束清除函數(shù)。intPASCALFARWSACleanup(void)(returnWSACleanup1();//調(diào)用原WinSock庫(kù)結(jié)束清除函數(shù)。}//創(chuàng)建Socket函數(shù)。SOCKETPASCALFARsocket(intaf,inttype,intprotocol)(//調(diào)用原WinSock庫(kù)創(chuàng)建Socket函數(shù)。returnsocket1(af,type,protocol);}〃發(fā)送數(shù)據(jù)包函數(shù)intPASCALFARsend(SOCKETs,constchar*buf,intlen,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年南京客運(yùn)急救考試題及答案
- 2024年貴州客運(yùn)從業(yè)資格證2024年考試題
- 2024年紹興客運(yùn)資格證考試題目
- 2024年遼陽道路客運(yùn)輸從業(yè)資格證理論考題
- 2024年黑龍江駕??荚嚳瓦\(yùn)從業(yè)資格證考試
- 2024年度物業(yè)服務(wù)合同管理與維修責(zé)任規(guī)定
- 2024年度城市園林綠化工程合同
- 232分子間的作用力分子的手性-2021-2022學(xué)年高二化學(xué)課后分層練(人教版2019選擇性必修2)(原卷版)
- 電子銷售工程師招聘筆試題及解答(某世界500強(qiáng)集團(tuán))2025年
- 教師資格考試高中化學(xué)學(xué)科知識(shí)與教學(xué)能力試卷及解答參考
- 新生適應(yīng)性成長(zhǎng)小組計(jì)劃書
- 08SS523建筑小區(qū)塑料排水檢查井
- 教學(xué)評(píng)一體化的教學(xué)案例 課件
- 父親去世訃告范文(通用12篇)
- 人教版八年級(jí)上Unit 2How often do you exercise Section A(Grammar Focus-3c)
- 導(dǎo)讀工作總結(jié)優(yōu)秀范文5篇
- SB/T 10851-2012會(huì)議中心運(yùn)營(yíng)服務(wù)規(guī)范
- JJF 1916-2021掃描電子顯微鏡校準(zhǔn)規(guī)范
- GB/T 6587-2012電子測(cè)量?jī)x器通用規(guī)范
- GB/T 4162-2008鍛軋鋼棒超聲檢測(cè)方法
- GB/T 12244-2006減壓閥一般要求
評(píng)論
0/150
提交評(píng)論