★33°空間‰


                                 ----★七彩服飾  【最潮拜☆日單精品】【Esprit】【Hotwind】滿150包郵-女裝-流行女裝    www.7color.hb.cn

                                 ----智力比知識重要,素質(zhì)比智力重要,覺悟比素質(zhì)更重要
          posts - 110,comments - 35,trackbacks - 0





          一、 前言

            所謂游戲外掛,其實(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_EXTENDEDKEYKEYEVENTF_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)知識。


          網(wǎng)絡(luò)游戲外掛編寫基礎(chǔ)


          作者 未知


          要想在修改游戲中做到百戰(zhàn)百勝,是需要相當(dāng)豐富的計(jì)算機(jī)知識的。有很多計(jì)算機(jī)高手就是從玩游戲,修改游戲中,逐步對計(jì)算機(jī)產(chǎn)生濃厚的興趣,逐步成長起來的。不要在羨慕別人能夠做到的,因?yàn)閯e人能夠做的你也能夠!我相信你們看了本教程后,會對游戲有一個(gè)全新的認(rèn)識,呵呵,因?yàn)槲沂莻€(gè)好老師!(別拿雞蛋砸我呀,救命啊!#%……*)   不過要想從修改游戲中學(xué)到知識,增加自己的計(jì)算機(jī)水平,可不能只是靠修改游戲呀! 要知道,修改游戲只是一個(gè)驗(yàn)證你對你所了解的某些計(jì)算機(jī)知識的理解程度的場所,只能給你一些發(fā)現(xiàn)問題、解決問題的機(jī)會,只能起到幫助你提高學(xué)習(xí)計(jì)算機(jī)的興趣的作用,而決不是學(xué)習(xí)計(jì)算機(jī)的捷徑。

            一:什么叫外掛?

            現(xiàn)在的網(wǎng)絡(luò)游戲多是基于Internet上客戶/服務(wù)器模式,服務(wù)端程序運(yùn)行在游戲服務(wù)器上,游戲的設(shè)計(jì)者在其中創(chuàng)造一個(gè)龐大的游戲空間,各地的玩家可以通過運(yùn)行客戶端程序同時(shí)登錄到游戲中。簡單地說,網(wǎng)絡(luò)游戲?qū)嶋H上就是由游戲開發(fā)商提供一個(gè)游戲環(huán)境,而玩家們就是在這個(gè)環(huán)境中相對自由和開放地進(jìn)行游戲操作。那么既然在網(wǎng)絡(luò)游戲中有了服務(wù)器這個(gè)概念,我們以前傳統(tǒng)的修改游戲方法就顯得無能為力了。記得我們在單機(jī)版的游戲中,隨心所欲地通過內(nèi)存搜索來修改角色的各種屬性,這在網(wǎng)絡(luò)游戲中就沒有任何用處了。因?yàn)槲覀冊诰W(wǎng)絡(luò)游戲中所扮演角色的各種屬性及各種重要資料都存放在服務(wù)器上,在我們自己機(jī)器上(客戶端)只是顯示角色的狀態(tài),所以通過修改客戶端內(nèi)存里有關(guān)角色的各種屬性是不切實(shí)際的。那么是否我們就沒有辦法在網(wǎng)絡(luò)游戲中達(dá)到我們修改的目的?回答是""

            我們知道Internet客戶/服務(wù)器模式的通訊一般采用TCP/IP通信協(xié)議,數(shù)據(jù)交換是通過IP數(shù)據(jù)包的傳輸來實(shí)現(xiàn)的,一般來說我們客戶端向服務(wù)器發(fā)出某些請求,比如移動、戰(zhàn)斗等指令都是通過封包的形式和服務(wù)器交換數(shù)據(jù)。那么我們把本地發(fā)出消息稱為SEND,意思就是發(fā)送數(shù)據(jù),服務(wù)器收到我們SEND的消息后,會按照既定的程序把有關(guān)的信息反饋給客戶端,比如,移動的坐標(biāo),戰(zhàn)斗的類型。那么我們把客戶端收到服務(wù)器發(fā)來的有關(guān)消息稱為RECV。知道了這個(gè)道理,接下來我們要做的工作就是分析客戶端和服務(wù)器之間往來的數(shù)據(jù)(也就是封包),這樣我們就可以提取到對我們有用的數(shù)據(jù)進(jìn)行修改,然后模擬服務(wù)器發(fā)給客戶端,或者模擬客戶端發(fā)送給服務(wù)器,這樣就可以實(shí)現(xiàn)我們修改游戲的目的了。

            目前除了修改游戲封包來實(shí)現(xiàn)修改游戲的目的,我們也可以修改客戶端的有關(guān)程序來達(dá)到我們的要求。我們知道目前各個(gè)服務(wù)器的運(yùn)算能力是有限的,特別在游戲中,游戲服務(wù)器要計(jì)算游戲中所有玩家的狀況幾乎是不可能的,所以有一些運(yùn)算還是要依靠我們客戶端來完成,這樣又給了我們修改游戲提供了一些便利。比如我們可以通過將客戶端程序脫殼來發(fā)現(xiàn)一些程序的判斷分支,通過跟蹤調(diào)試我們可以把一些對我們不利的判斷去掉,以此來滿足我們修改游戲的需求。 在下幾個(gè)章節(jié)中,我們將給大家講述封包的概念,和修改跟蹤客戶端的有關(guān)知識。大家準(zhǔn)備好了嗎?

            游戲數(shù)據(jù)格式和存儲:

            在進(jìn)行我們的工作之前,我們需要掌握一些關(guān)于計(jì)算機(jī)中儲存數(shù)據(jù)方式的知識和游戲中儲存數(shù)據(jù)的特點(diǎn)。本章節(jié)是提供給菜鳥級的玩家看的,如果你是高手就可以跳過了,如果,你想成為無堅(jiān)不摧的劍客,那么,這些東西就會花掉你一些時(shí)間;如果,你只想作個(gè)江湖的游客的話,那么這些東西,了解與否無關(guān)緊要。是作劍客,還是作游客,你選擇吧!

            現(xiàn)在我們開始!首先,你要知道游戲中儲存數(shù)據(jù)的幾種格式,這幾種格式是:字節(jié)(BYTE)、字(WORD)和雙字(DOUBLE WORD),或者說是8位、16位和32位儲存方式。字節(jié)也就是8位方式能儲存0~255的數(shù)字;字或說是16位儲存方式能儲存0~65535的數(shù);雙字即32位方式能儲存0~4294967295的數(shù)。

            為何要了解這些知識呢?在游戲中各種參數(shù)的最大值是不同的,有些可能100左右就夠了,比如,金庸群俠傳中的角色的等級、隨機(jī)遇敵個(gè)數(shù)等等。而有些卻需要大于255甚至大于65535,象金庸群俠傳中角色的金錢值可達(dá)到數(shù)百萬。所以,在游戲中各種不同的數(shù)據(jù)的類型是不一樣的。在我們修改游戲時(shí)需要尋找準(zhǔn)備修改的數(shù)據(jù)的封包,在這種時(shí)候,正確判斷數(shù)據(jù)的類型是迅速找到正確地址的重要條件。

            在計(jì)算機(jī)中數(shù)據(jù)以字節(jié)為基本的儲存單位,每個(gè)字節(jié)被賦予一個(gè)編號,以確定各自的位置。這個(gè)編號我們就稱為地址。

            在需要用到字或雙字時(shí),計(jì)算機(jī)用連續(xù)的兩個(gè)字節(jié)來組成一個(gè)字,連續(xù)的兩個(gè)字組成一個(gè)雙字。而一個(gè)字或雙字的地址就是它們的低位字節(jié)的地址。 現(xiàn)在我們常用的Windows 9x操作系統(tǒng)中,地址是用一個(gè)32位的二進(jìn)制數(shù)表示的。而在平時(shí)我們用到內(nèi)存地址時(shí),總是用一個(gè)8位的16進(jìn)制數(shù)來表示它。

            二進(jìn)制和十六進(jìn)制又是怎樣一回事呢?

            簡單說來,二進(jìn)制數(shù)就是一種只有01兩個(gè)數(shù)碼,每滿2則進(jìn)一位的計(jì)數(shù)進(jìn)位法。同樣,16進(jìn)制就是每滿十六就進(jìn)一位的計(jì)數(shù)進(jìn)位法。16進(jìn)制有0--F十六個(gè)數(shù)字,它為表示十到十五的數(shù)字采用了ABCDEF六個(gè)數(shù)字,它們和十進(jìn)制的對應(yīng)關(guān)系是:A對應(yīng)于10B對應(yīng)于11C對應(yīng)于12D對應(yīng)于13E對應(yīng)于14F對應(yīng)于15。而且,16進(jìn)制數(shù)和二進(jìn)制數(shù)間有一個(gè)簡單的對應(yīng)關(guān)系,那就是;四位二進(jìn)制數(shù)相當(dāng)于一位16進(jìn)制數(shù)。比如,一個(gè)四位的二進(jìn)制數(shù)1111就相當(dāng)于16進(jìn)制的F1010就相當(dāng)于A

            了解這些基礎(chǔ)知識對修改游戲有著很大的幫助,下面我就要談到這個(gè)問題。由于在計(jì)算機(jī)中數(shù)據(jù)是以二進(jìn)制的方式儲存的,同時(shí)16進(jìn)制數(shù)和二進(jìn)制間的轉(zhuǎn)換關(guān)系十分簡單,所以大部分的修改工具在顯示計(jì)算機(jī)中的數(shù)據(jù)時(shí)會顯示16進(jìn)制的代碼,而且在你修改時(shí)也需要輸入16進(jìn)制的數(shù)字。你清楚了吧?

            在游戲中看到的數(shù)據(jù)可都是十進(jìn)制的,在要尋找并修改參數(shù)的值時(shí),可以使用Windows提供的計(jì)算器來進(jìn)行十進(jìn)制和16進(jìn)制的換算,我們可以在開始菜單里的程序組中的附件中找到它。

            現(xiàn)在要了解的知識也差不多了!不過,有個(gè)問題在游戲修改中是需要注意的。在計(jì)算機(jī)中數(shù)據(jù)的儲存方式一般是低位數(shù)儲存在低位字節(jié),高位數(shù)儲存在高位字節(jié)。比如,十進(jìn)制數(shù)41715轉(zhuǎn)換為16進(jìn)制的數(shù)為A2F3,但在計(jì)算機(jī)中這個(gè)數(shù)被存為F3A2

            看了以上內(nèi)容大家對數(shù)據(jù)的存貯和數(shù)據(jù)的對應(yīng)關(guān)系都了解了嗎? 好了,接下來我們要告訴大家在游戲中,封包到底是怎么一回事了,來!大家把袖口卷起來,讓我們來干活吧!
            二:什么是封包?

            怎么截獲一個(gè)游戲的封包?怎么去檢查游戲服務(wù)器的ip地址和端口號? Internet用戶使用的各種信息服務(wù),其通訊的信息最終均可以歸結(jié)為以IP包為單位的信息傳送,IP包除了包括要傳送的數(shù)據(jù)信息外,還包含有信息要發(fā)送到的目的IP地址、信息發(fā)送的源IP地址、以及一些相關(guān)的控制信息。當(dāng)一臺路由器收到一個(gè)IP數(shù)據(jù)包時(shí),它將根據(jù)數(shù)據(jù)包中的目的IP地址項(xiàng)查找路由表,根據(jù)查找的結(jié)果將此IP數(shù)據(jù)包送往對應(yīng)端口。下一臺IP路由器收到此數(shù)據(jù)包后繼續(xù)轉(zhuǎn)發(fā),直至發(fā)到目的地。路由器之間可以通過路由協(xié)議來進(jìn)行路由信息的交換,從而更新路由表。

            那么我們所關(guān)心的內(nèi)容只是IP包中的數(shù)據(jù)信息,我們可以使用許多監(jiān)聽網(wǎng)絡(luò)的工具來截獲客戶端與服務(wù)器之間的交換數(shù)據(jù),下面就向你介紹其中的一種工具:WPE

            WPE使用方法:執(zhí)行WPE會有下列幾項(xiàng)功能可選擇:

            SELECT GAME選擇目前在記憶體中您想攔截的程式,您只需雙擊該程式名稱即可。

            TRACE追蹤功能。用來追蹤擷取程式送收的封包。WPE必須先完成點(diǎn)選欲追蹤的程式名稱,才可以使用此項(xiàng)目。 按下Play鍵開始擷取程式收送的封包。您可以隨時(shí)按下 | | 暫停追蹤,想繼續(xù)時(shí)請?jiān)侔聪?span lang="EN-US"> | |
          。按下正方形可以停止擷取封包并且顯示所有已擷取封包內(nèi)容。若您沒按下正方形停止鍵,追蹤的動作將依照OPTION里的設(shè)定值自動停止。如果您沒有擷取到資料,試試將OPTION里調(diào)整為Winsock Version 2WPE Trainers 是設(shè)定在顯示至少16 bits 顏色下才可執(zhí)行。

            FILTER過濾功能。用來分析所擷取到的封包,并且予以修改。

            SEND PACKET送出封包功能。能夠讓您送出假造的封包。

            TRAINER MAKER制作修改器。

            OPTIONS設(shè)定功能。讓您調(diào)整WPE的一些設(shè)定值。

            FILTER的詳細(xì)教學(xué)

            - 當(dāng)FILTER在啟動狀態(tài)時(shí) ,ON的按鈕會呈現(xiàn)紅色。- 當(dāng)您啟動FILTER時(shí),您隨時(shí)可以關(guān)閉這個(gè)視窗。FILTER將會保留在原來的狀態(tài),直到您再按一次 on / off 鈕。- 只有FILTER啟用鈕在OFF的狀態(tài)下,才可以勾選Filter前的方框來編輯修改。- 當(dāng)您想編輯某個(gè)Filter,只要雙擊該Filter的名字即可。

            NORMAL MODE

            范例:

            當(dāng)您在 Street Fighter Online ﹝快打旋風(fēng)線上版﹞游戲中,您使用了兩次火球而且擊中了對方,這時(shí)您會擷取到以下的封包:SEND-> 0000 08 14 21 06 01 04 SEND-> 0000 02 09 87 00 67 FF A4 AA 11 22 00 00 00 00 SEND-> 0000 03 84 11 09 11 09 SEND-> 0000 0A09 C1 10 00 00 FF 52 44 SEND-> 0000 0A09 C1 10 00 00 66 52 44

            您的第一個(gè)火球讓對方減了16滴﹝16 = 10h﹞的生命值,而您觀察到第4跟第5個(gè)封包的位置410h的值出現(xiàn),應(yīng)該就是這里了。

            您觀察10h前的0A09 C1在兩個(gè)封包中都沒改變,可見得這3個(gè)數(shù)值是發(fā)出火球的關(guān)鍵。

            因此您將0A09 C1 10填在搜尋列﹝SEARCH﹞,然后在修改列﹝MODIFY﹞的位置4填上FF。如此一來,當(dāng)您再度發(fā)出火球時(shí),FF會取代之前的10,也就是攻擊力為255的火球了!

            ADVANCED MODE

            范例: 當(dāng)您在一個(gè)游戲中,您不想要用真實(shí)姓名,您想用修改過的假名傳送給對方。在您使用TRACE后,您會發(fā)現(xiàn)有些封包里面有您的名字出現(xiàn)。假設(shè)您的名字是Shadow,換算成16進(jìn)位則是﹝53 68 61 64 6F 77﹞;而您打算用moon6D 6F6F 6E 20 20﹞來取代他。1) SEND-> 0000 08 14 21 06 01 042) SEND-> 0000 01 06 99 53 68 61 64 6F 77 00 01 05 3) SEND-> 0000 03 84 11 09 11 094) SEND-> 0000 0A09 C1 10 00 53 68 61 64 6F 77 00 11 5) SEND-> 0000 0A09 C1 10 00 00 66 52 44

            但是您仔細(xì)看,您的名字在每個(gè)封包中并不是出現(xiàn)在相同的位置上

            - 在第2個(gè)封包里,名字是出現(xiàn)在第4個(gè)位置上- 在第4個(gè)封包里,名字是出現(xiàn)在第6個(gè)位置上

            在這種情況下,您就需要使用ADVANCED MODE- 您在搜尋列﹝SEARCH﹞填上:53 68 61 64 6F 77 ﹝請務(wù)必從位置1開始填﹞- 您想要從原來名字Shadow的第一個(gè)字母開始置換新名字,因此您要選擇從數(shù)值被發(fā)現(xiàn)的位置開始替代連續(xù)數(shù)值﹝from the position of the chain found﹞。- 現(xiàn)在,在修改列﹝MODIFY000的位置填上:6D 6F6F 6E 20 20 ﹝此為相對應(yīng)位置,也就是從原來搜尋欄的+001位置開始遞換﹞- 如果您想從封包的第一個(gè)位置就修改數(shù)值,請選擇﹝from the beginning of the packet

            了解一點(diǎn)TCP/IP協(xié)議常識的人都知道,互聯(lián)網(wǎng)是將信息數(shù)據(jù)打包之后再傳送出去的。每個(gè)數(shù)據(jù)包分為頭部信息和數(shù)據(jù)信息兩部分。頭部信息包括數(shù)據(jù)包的發(fā)送地址和到達(dá)地址等。數(shù)據(jù)信息包括我們在游戲中相關(guān)操作的各項(xiàng)信息。那么在做截獲封包的過程之前我們先要知道游戲服務(wù)器的IP地址和端口號等各種信息,實(shí)際上最簡單的是看看我們游戲目錄下,是否有一個(gè)SERVER.INI的配置文件,這個(gè)文件里你可以查看到個(gè)游戲服務(wù)器的IP地址,比如金庸群俠傳就是如此,那么除了這個(gè)我們還可以在DOS下使用NETSTAT這個(gè)命令,

            NETSTAT命令的功能是顯示網(wǎng)絡(luò)連接、路由表和網(wǎng)絡(luò)接口信息,可以讓用戶得知目前都有哪些網(wǎng)絡(luò)連接正在運(yùn)作。或者你可以使用木馬客星等工具來查看網(wǎng)絡(luò)連接。工具是很多的,看你喜歡用哪一種了。

            NETSTAT命令的一般格式為:NETSTAT [選項(xiàng)]

            命令中各選項(xiàng)的含義如下:-a 顯示所有socket,包括正在監(jiān)聽的。-c 每隔1秒就重新顯示一遍,直到用戶中斷它。-i 顯示所有網(wǎng)絡(luò)接口的信息。-n 以網(wǎng)絡(luò)IP地址代替名稱,顯示出網(wǎng)絡(luò)連接情形。-r 顯示核心路由表,格式同"route -e"-t 顯示TCP協(xié)議的連接情況。-u 顯示UDP協(xié)議的連接情況。-v 顯示正在進(jìn)行的工作。


          ?


          ?











          網(wǎng)絡(luò)游戲外掛編寫基礎(chǔ)


          作者 未知


          三:怎么來分析我們截獲的封包?

            首先我們將WPE截獲的封包保存為文本文件,然后打開它,這時(shí)會看到如下的數(shù)據(jù)(這里我們以金庸群俠傳里PK店小二客戶端發(fā)送的數(shù)據(jù)為例來講解):

            第一個(gè)文件:SEND-> 0000 E6 56 0D 22 7E 6B E4 17 13 13 12 13 12 13 67 1BSEND-> 0010 17 12 DD 34 12 12 12 12 17 12 0E 12 12 12 9BSEND-> 0000 E6 56 1E F1 29 06 17 12 3B 0E 17 1ASEND-> 0000 E6 56 1B C0 68 12 12 12 5ASEND-> 0000 E6 56 02 C8 13 C9 7E 6B E4 17 10 35 27 13 12 12SEND-> 0000 E6 56 17 C9 12

            第二個(gè)文件:SEND-> 0000 83 33 68 47 1B 0E 81 72 76 76 77 76 77 76 02 7ESEND-> 0010 72 77 07 1C 77 77 77 77 72 77 72 77 77 77 6DSEND-> 0000 83 33 7B 94 4C 63 72 77 5E 6B 72 F3SEND-> 0000 83 33 7E A5 21 77 77 77 3FSEND-> 0000 83 33 67 AD 76 CF 1B 0E 81 72 75 50 42 76 77 77SEND-> 0000 83 33 72 AC 77

            我們發(fā)現(xiàn)兩次PK店小二的數(shù)據(jù)格式一樣,但是內(nèi)容卻不相同,我們是PK的同一個(gè)NPC,為什么會不同呢? 原來金庸群俠傳的封包是經(jīng)過了加密運(yùn)算才在網(wǎng)路上傳輸?shù)模敲次覀兠媾R的問題就是如何將密文解密成明文再分析了。

            因?yàn)橐话愕臄?shù)據(jù)包加密都是異或運(yùn)算,所以這里先講一下什么是異或。 簡單的說,異或就是"相同為0,不同為1"(這是針對二進(jìn)制按位來講的),舉個(gè)例子,00010010異或,我們按位對比,得到異或結(jié)果是0011,計(jì)算的方法是:0001的第4位為00010的第4位為0,它們相同,則異或結(jié)果的第4位按照"相同為0,不同為1"的原則得到00001的第3位為00010的第3位為0,則異或結(jié)果的第3位得到00001的第2位為00010的第2位為1,則異或結(jié)果的第2位得到10001的第1位為10010的第1位為0,則異或結(jié)果的第1位得到1,組合起來就是0011。異或運(yùn)算今后會遇到很多,大家可以先熟悉熟悉,熟練了對分析很有幫助的。

            下面我們繼續(xù)看看上面的兩個(gè)文件,按照常理,數(shù)據(jù)包的數(shù)據(jù)不會全部都有值的,游戲開發(fā)時(shí)會預(yù)留一些字節(jié)空間來便于日后的擴(kuò)充,也就是說數(shù)據(jù)包里會存在一些"00"的字節(jié),觀察上面的文件,我們會發(fā)現(xiàn)文件一里很多"12",文件二里很多"77",那么這是不是代表我們說的"00"呢?推理到這里,我們就開始行動吧!

            我們把文件一與"12"異或,文件二與"77"異或,當(dāng)然用手算很費(fèi)事,我們使用"M2M 1.0 加密封包分析工具"來計(jì)算就方便多了。得到下面的結(jié)果:

            第一個(gè)文件:1 SEND-> 0000 F4 44 1F 30 6C79 F6 05 01 01 00 01 00 01 75 09SEND-> 0010 05 00 CF 26 00 00 00 00 05 00 1C 00 00 00 892 SEND-> 0000 F4 44 0C E3 3B 13 05 00 29 1C 05 083 SEND-> 0000 F4 44 09 D2 7A 00 00 00 484 SEND-> 0000 F4 44 10 DA 01 DB 6C79 F6 05 02 27 35 01 00 005 SEND-> 0000 F4 44 05 DB 00

            第二個(gè)文件:1 SEND-> 0000 F4 44 1F 30 6C79 F6 05 01 01 00 01 00 01 75 09SEND-> 0010 05 00 70 6B 00 00 00 00 05 00 05 00 00 00 1A2 SEND-> 0000 F4 44 0C E3 3B 13 05 00 29 1C 05 843 SEND-> 0000 F4 44 09 D2 56 00 00 00 484 SEND-> 0000 F4 44 10 DA 01 B8 6C79 F6 05 02 27 35 01 00 005 SEND-> 0000 F4 44 05 DB 00

            哈,這一下兩個(gè)文件大部分都一樣啦,說明我們的推理是正確的,上面就是我們需要的明文!

            接下來就是搞清楚一些關(guān)鍵的字節(jié)所代表的含義,這就需要截獲大量的數(shù)據(jù)來分析。

            首先我們會發(fā)現(xiàn)每個(gè)數(shù)據(jù)包都是"F4 44"開頭,第3個(gè)字節(jié)是變化的,但是變化很有規(guī)律。我們來看看各個(gè)包的長度,發(fā)現(xiàn)什么沒有?對了,第3個(gè)字節(jié)就是包的長度! 通過截獲大量的數(shù)據(jù)包,我們判斷第4個(gè)字節(jié)代表指令,也就是說客戶端告訴服務(wù)器進(jìn)行的是什么操作。例如向服務(wù)器請求戰(zhàn)斗指令為"30",戰(zhàn)斗中移動指令為"D4"等。 接下來,我們就需要分析一下上面第一個(gè)包"F4 44 1F 30 6C79 F6 05 01 01 00 01 00 01 75 09 05 00 CF 26 00 00 00 00 05 00 1C 00 00 00 89",在這個(gè)包里包含什么信息呢?應(yīng)該有通知服務(wù)器你PK的哪個(gè)NPC吧,我們就先來找找這個(gè)店小二的代碼在什么地方。 我們再PK一個(gè)小嘍羅(就是大理客棧外的那個(gè)咯):SEND-> 0000 F4 44 1F 30 D4 75 F6 05 01 01 00 01 00 01 75 09SEND-> 0010 05 00 8A 19 00 00 00 00 11 00 02 00 00 00 C0 我們根據(jù)常理分析,游戲里的NPC種類雖然不會超過65535FFFF),但開發(fā)時(shí)不會把自己限制在字的范圍,那樣不利于游戲的擴(kuò)充,所以我們在雙字里看看。通過"店小二""小嘍羅"兩個(gè)包的對比,我們把目標(biāo)放在"6C79 F6 05""CF 26 00 00"上。(對比一下很容易的,但你不能太遲鈍咯,呵呵)我們再看看后面的包,在后面的包里應(yīng)該還會出現(xiàn)NPC的代碼,比如移動的包,游戲允許觀戰(zhàn),服務(wù)器必然需要知道NPC的移動坐標(biāo),再廣播給觀戰(zhàn)的其他玩家。在后面第4個(gè)包"SEND-> 0000 F4 44 10 DA 01 DB 6C79 F6 05 02 27 35 01 00 00"里我們又看到了"6C79 F6 05",初步斷定店小二的代碼就是它了!(這分析里邊包含了很多工作的,大家可以用WPE截下數(shù)據(jù)來自己分析分析)

            第一個(gè)包的分析暫時(shí)就到這里(里面還有的信息我們暫時(shí)不需要完全清楚了)

            我們看看第4個(gè)包"SEND-> 0000 F4 44 10 DA 01 DB 6C79 F6 05 02 27 35 01 00 00",再截獲PK黃狗的包,(狗會出來2只哦)看看包的格式:SEND-> 0000 F4 44 1A DA 02 0B 4B 7D F6 05 02 27 35 01 00 00SEND-> 0010 EB 03 F8 05 02 27 36 01 00 00

            根據(jù)上面的分析,黃狗的代碼為"4B 7D F6 05"100040011),不過兩只黃狗服務(wù)器怎樣分辨呢?看看"EB 03 F8 05"100140011),是上一個(gè)代碼加上100000,呵呵,這樣服務(wù)器就可以認(rèn)出兩只黃狗了。我們再通過野外遇敵截獲的數(shù)據(jù)包來證實(shí),果然如此。

            那么,這個(gè)包的格式應(yīng)該比較清楚了:第3個(gè)字節(jié)為包的長度,"DA"為指令,第5個(gè)字節(jié)為NPC個(gè)數(shù),從第7個(gè)字節(jié)開始的10個(gè)字節(jié)代表一個(gè)NPC的信息,多一個(gè)NPC就多10個(gè)字節(jié)來表示。

            大家如果玩過網(wǎng)金,必然知道隨機(jī)遇敵有時(shí)會出現(xiàn)增援,我們就利用游戲這個(gè)增援來讓每次戰(zhàn)斗都會出現(xiàn)增援的NPC吧。

            通過在戰(zhàn)斗中出現(xiàn)增援截獲的數(shù)據(jù)包,我們會發(fā)現(xiàn)服務(wù)器端發(fā)送了這樣一個(gè)包:F4 44 12 E9 EB 03 F8 05 02 00 00 03 00 00 00 00 00 00 5-8個(gè)字節(jié)為增援NPC的代碼(這里我們就簡單的以黃狗的代碼來舉例)。 那么,我們就利用單機(jī)代理技術(shù)來同時(shí)欺騙客戶端和服務(wù)器吧!

            好了,呼叫NPC的工作到這里算是完成了一小半,接下來的事情,怎樣修改封包和發(fā)送封包,我們下節(jié)繼續(xù)講解吧。
            四:怎么冒充"客戶端""服務(wù)器"發(fā)我們需要的封包?

            這里我們需要使用一個(gè)工具,它位于客戶端和服務(wù)器端之間,它的工作就是進(jìn)行數(shù)據(jù)包的接收和轉(zhuǎn)發(fā),這個(gè)工具我們稱為代理。如果代理的工作單純就是接收和轉(zhuǎn)發(fā)的話,這就毫無意義了,但是請注意:所有的數(shù)據(jù)包都要通過它來傳輸,這里的意義就重大了。我們可以分析接收到的數(shù)據(jù)包,或者直接轉(zhuǎn)發(fā),或者修改后轉(zhuǎn)發(fā),或者壓住不轉(zhuǎn)發(fā),甚至偽造我們需要的封包來發(fā)送。

            下面我們繼續(xù)講怎樣來同時(shí)欺騙服務(wù)器和客戶端,也就是修改封包和偽造封包。 通過我們上節(jié)的分析,我們已經(jīng)知道了打多個(gè)NPC的封包格式,那么我們就動手吧!

            首先我們要查找客戶端發(fā)送的包,找到戰(zhàn)斗的特征,就是請求戰(zhàn)斗的第1個(gè)包,我們找"F4 44 1F 30"這個(gè)特征,這是不會改變的,當(dāng)然是要解密后來查找哦。 找到后,表示客戶端在向服務(wù)器請求戰(zhàn)斗,我們不動這個(gè)包,轉(zhuǎn)發(fā)。 繼續(xù)向下查找,這時(shí)需要查找的特征碼不太好辦,我們先查找"DA",這是客戶端發(fā)送NPC信息的數(shù)據(jù)包的指令,那么可能其他包也有"DA",沒關(guān)系,我們看前3個(gè)字節(jié)有沒有"F4 44"就行了。找到后,我們的工作就開始了!

            我們確定要打的NPC數(shù)量。這個(gè)數(shù)量不能很大,原因在于網(wǎng)金的封包長度用一個(gè)字節(jié)表示,那么一個(gè)包可以有255個(gè)字節(jié),我們上面分析過,增加一個(gè)NPC要增加10個(gè)字節(jié),所以大家算算就知道,打20個(gè)NPC比較合適。

            然后我們要把客戶端原來的NPC代碼分析計(jì)算出來,因?yàn)樵黾拥?span lang="EN-US">NPC
          代碼要加上100000哦。再把我們增加的NPC代碼計(jì)算出來,并且組合成新的封包,注意代表包長度的字節(jié)要修改啊,然后轉(zhuǎn)發(fā)到服務(wù)器,這一步在編寫程序的時(shí)候要注意算法,不要造成較大延遲。

            上面我們欺騙服務(wù)器端完成了,欺騙客戶端就簡單了。

            發(fā)送了上面的封包后,我們根據(jù)新增NPC代碼構(gòu)造封包馬上發(fā)給客戶端,格式就是"F4 44 12 E9 NPC代碼 02 00 00 03 00 00 00 00 00 00",把每個(gè)新增的NPC都構(gòu)造這樣一個(gè)包,按順序連在一起發(fā)送給客戶端,客戶端也就被我們騙過了,很簡單吧。

            以后戰(zhàn)斗中其他的事我們就不管了,盡情地開打吧。

          posted on 2006-09-28 14:28 圣域飛俠 閱讀(453) 評論(1)  編輯  收藏 所屬分類: 轉(zhuǎn)載

          FeedBack:
          # re: 游戲外掛設(shè)計(jì)技術(shù)探討
          2006-10-03 23:43 | 跑跑卡丁車外掛下載
          支持外掛!!!!!!  回復(fù)  更多評論
            
          主站蜘蛛池模板: 顺义区| 阳山县| 福贡县| 凤城市| 文化| 通州市| 女性| 厦门市| 措勤县| 灵川县| 遂宁市| 延津县| 泉州市| 陇南市| 德化县| 灯塔市| 察雅县| 盖州市| 蒲江县| 革吉县| 松江区| 靖西县| 石景山区| 当涂县| 惠来县| 陆良县| 乌苏市| 沭阳县| 克东县| 石狮市| 泰宁县| 凌海市| 邮箱| 维西| 都兰县| 屏山县| 安乡县| 宝清县| 区。| 太和县| 元氏县|