• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            道。道。道

            安全特性不等于安全的特性

               :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理

            常用鏈接

            搜索

            •  

            最新評(píng)論

            (8).編譯項(xiàng)目ActiveKey,生成ActiveKey.DLL和ActiveKey.lib。

              接著,我們還需要?jiǎng)?chuàng)建一個(gè)外殼程序?qū)⑷帚^子安裝了Windows系統(tǒng)中,這個(gè)外殼程序編寫步驟如下:

              (1).創(chuàng)建一個(gè)對(duì)話框模式的應(yīng)用程序,項(xiàng)目名為Simulate。

              (2).在主對(duì)話框中加入一個(gè)按鈕,使用ClassWizard為其創(chuàng)建CLICK事件。

              (3).將ActiveKey項(xiàng)目Debug目錄下的ActiveKey.DLL和ActiveKey.lib拷貝到Simulate項(xiàng)目目錄下。

              (4).從“工程”菜單中選擇“設(shè)置”,彈出Project Setting對(duì)話框,選擇Link標(biāo)簽,在“對(duì)象/庫模塊”中輸入

            ActiveKey.lib。

              (5).將ActiveKey項(xiàng)目中的ActiveKey.h頭文件加入到Simulate項(xiàng)目中,并在Stdafx.h中加入#include ActiveKey.h。

              (6).在按鈕單擊事件函數(shù)輸入如下代碼

               void CSimulateDlg::OnButton1()
               {
            // TODO: Add your control notification handler code here
            if( !bSetup )
            {
            m_hook.Start();//激活全局鉤子。
            }
            else
            {
            m_hook.Stop();//撤消全局鉤子。
            }
            bSetup = !bSetup;

               }?

              (7).編譯項(xiàng)目,并運(yùn)行程序,單擊按鈕激活外掛。

              (8).啟動(dòng)畫筆程序,選擇文本工具并將筆的顏色設(shè)置為紅色,將鼠標(biāo)放在任意位置后,按F10鍵,畫筆程序自動(dòng)移動(dòng)

            鼠標(biāo)并寫下一個(gè)紅色的大寫R。圖一展示了按F10鍵前的畫筆程序的狀態(tài),圖二展示了按F10鍵后的畫筆程序的狀態(tài)。


            圖一:按F10前狀態(tài)(001.jpg)


            圖二:按F10后狀態(tài)(002.jpg)


            ?

             五、封包技術(shù)

              通過對(duì)動(dòng)作模擬技術(shù)的介紹,我們對(duì)游戲外掛有了一定程度上的認(rèn)識(shí),也學(xué)會(huì)了使用動(dòng)作模擬技術(shù)來實(shí)現(xià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)鏈接庫提供的函數(shù)庫來完成的。

              由上說明可知,任何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)

            鏈接庫提供的一系列函數(shù),由這些函數(shù)實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)的訪問。有了這層的認(rèn)識(shí),問題就好辦多了,我們可以制作一個(gè)類似的

            動(dòng)態(tài)鏈接庫來代替原WinSock接口庫,在其中實(shí)現(xiàn)WinSock32.dll中實(shí)現(xiàn)的所有函數(shù),并保證所有函數(shù)的參數(shù)個(gè)數(shù)和順序、

            返回值類型都應(yīng)與原庫相同。在這個(gè)自制作的動(dòng)態(tài)庫中,可以對(duì)我們感興趣的函數(shù)(如發(fā)送、接收等函數(shù))進(jìn)行擋截,放

            入外掛控制代碼,最后還繼續(xù)調(diào)用原WinSock庫中提供的相應(yīng)功能函數(shù),這樣就可以實(shí)現(xiàn)對(duì)網(wǎng)絡(luò)數(shù)據(jù)包的擋截、修改和發(fā)

            送等封包功能。

              下面重點(diǎn)介紹創(chuàng)建擋截WinSock外掛程序的基本步驟:

              (1) 創(chuàng)建DLL項(xiàng)目,選擇Win32 Dynamic-Link Library,再選擇An empty DLL project。

              (2) 新建文件wsock32.h,按如下步驟輸入代碼

              ① 加入相關(guān)變量聲明:

               HMODULE hModule=NULL; //模塊句柄
               char buffer[1000]; //緩沖區(qū)
               FARPROC proc; //函數(shù)入口指針?

              ② 定義指向原WinSock庫中的所有函數(shù)地址的指針變量,因WinSock庫共提供70多個(gè)函數(shù),限于篇幅,在此就只選擇

            幾個(gè)常用的函數(shù)列出,有關(guān)這些庫函數(shù)的說明可參考MSDN相關(guān)內(nèi)容。

               //定義指向原WinSock庫函數(shù)地址的指針變量。
               SOCKET (__stdcall *socket1)(int ,int,int);//創(chuàng)建Sock函數(shù)。
               int (__stdcall *WSAStartup1)(WORD,LPWSADATA);//初始化WinSock庫函數(shù)。
               int (__stdcall *WSACleanup1)();//清除WinSock庫函數(shù)。
               int (__stdcall *recv1)(SOCKET ,char FAR * ,int ,int );//接收數(shù)據(jù)函數(shù)。
               int (__stdcall *send1)(SOCKET ,const char * ,int ,int);//發(fā)送數(shù)據(jù)函數(shù)。
               int (__stdcall *connect1)(SOCKET,const struct sockaddr *,int);//創(chuàng)建連接函數(shù)。
               int (__stdcall *bind1)(SOCKET ,const struct sockaddr *,int );//綁定函數(shù)。
               ......其它函數(shù)地址指針的定義略。?

              (3) 新建wsock32.cpp文件,按如下步驟輸入代碼

              ① 加入相關(guān)頭文件聲明:

               #include
               #include
               #include "wsock32.h"?

              ② 添加DllMain函數(shù),在此函數(shù)中首先需要加載原WinSock庫,并獲取此庫中所有函數(shù)的地址。代碼如下:

               BOOL WINAPI DllMain (HANDLE hInst,ULONG ul_reason_for_call,LPVOID lpReserved)
               {
                if(hModule==NULL){
                 //加載原WinSock庫,原WinSock庫已復(fù)制為wsock32.001。
               hModule=LoadLibrary("wsock32.001");
              }
                else return 1;
            //獲取原WinSock庫中的所有函數(shù)的地址并保存,下面僅列出部分代碼
            if(hModule!=NULL){
                 //獲取原WinSock庫初始化函數(shù)的地址,并保存到WSAStartup1中。
            proc=GetProcAddress(hModule,"WSAStartup");
               WSAStartup1=(int (_stdcall *)(WORD,LPWSADATA))proc;
                 //獲取原WinSock庫消除函數(shù)的地址,并保存到WSACleanup1中。
                proc=GetProcAddress(hModule i,"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 ,const struct sockaddr *,int ))proc;
                 //獲取原發(fā)送函數(shù)的地址,并保存到send1中。
                 proc=GetProcAddress(hModule,"send");
                 send1=(int (_stdcall *)(SOCKET ,const char * ,int ,int ))proc;
                 //獲取原接收函數(shù)的地址,并保存到recv1中。
                 proc=GetProcAddress(hModule,"recv");
                 recv1=(int (_stdcall *)(SOCKET ,char FAR * ,int ,int ))proc;
                 ......其它獲取函數(shù)地址代碼略。
               }
               else return 0;
               return 1;
            }

              ③ 定義庫輸出函數(shù),在此可以對(duì)我們感興趣的函數(shù)中添加外掛控制代碼,在所有的輸出函數(shù)的最后一步都調(diào)用原

            WinSock庫的同名函數(shù)。部分輸出函數(shù)定義代碼如下:

            //庫輸出函數(shù)定義。
            //WinSock初始化函數(shù)。
                int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData)
                {
                 //調(diào)用原WinSock庫初始化函數(shù)
                 return WSAStartup1(wVersionRequired,lpWSAData);
                }
                //WinSock結(jié)束清除函數(shù)。
                int PASCAL FAR WSACleanup(void)
                {
                 return WSACleanup1(); //調(diào)用原WinSock庫結(jié)束清除函數(shù)。
                }
                //創(chuàng)建Socket函數(shù)。
                SOCKET PASCAL FAR socket (int af, int type, int protocol)
                {
                 //調(diào)用原WinSock庫創(chuàng)建Socket函數(shù)。
                 return socket1(af,type,protocol);
                }
                //發(fā)送數(shù)據(jù)包函數(shù)
                int PASCAL FAR send(SOCKET s,const char * buf,int len,int flags)
                {
               //在此可以對(duì)發(fā)送的緩沖buf的內(nèi)容進(jìn)行修改,以實(shí)現(xiàn)欺騙服務(wù)器。
               外掛代碼......
               //調(diào)用原WinSock庫發(fā)送數(shù)據(jù)包函數(shù)。
                 return send1(s,buf,len,flags);
                }
            //接收數(shù)據(jù)包函數(shù)。
                int PASCAL FAR recv(SOCKET s, char FAR * buf, int len, int flags)
                {
               //在此可以擋截到服務(wù)器端發(fā)送到客戶端的數(shù)據(jù)包,先將其保存到buffer中。
               strcpy(buffer,buf);
               //對(duì)buffer數(shù)據(jù)包數(shù)據(jù)進(jìn)行分析后,對(duì)其按照玩家的指令進(jìn)行相關(guān)修改。
               外掛代碼......
               //最后調(diào)用原WinSock中的接收數(shù)據(jù)包函數(shù)。
                 return recv1(s, buffer, len, flags);
                 }
                .......其它函數(shù)定義代碼略。

            posted on 2006-11-18 16:54 獨(dú)孤九劍 閱讀(379) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Win32Visual C++ 8.0misc
            国产一区二区三区久久精品| 18禁黄久久久AAA片| 国产精品久久婷婷六月丁香| 久久综合综合久久97色| 欧美牲交A欧牲交aⅴ久久 | 久久99精品国产麻豆蜜芽| 久久99热只有频精品8| 亚洲AV无码久久精品蜜桃| 日本WV一本一道久久香蕉| 亚洲伊人久久成综合人影院 | 久久只这里是精品66| 欧洲性大片xxxxx久久久| 久久精品一区二区影院| 久久精品一区二区三区中文字幕| 国产精品无码久久综合网| 精品久久久久中文字| 欧美久久久久久精选9999| 久久经典免费视频| 亚洲国产精品无码久久久秋霞2| 亚洲精品无码专区久久久| 久久不见久久见免费视频7| 久久青青草原精品影院| 久久精品国产亚洲Aⅴ香蕉| 欧美亚洲国产精品久久高清| 中文字幕热久久久久久久| 久久香蕉超碰97国产精品| 国产欧美久久一区二区| 国产精品免费久久| 伊人久久大香线蕉av不变影院| 精品久久久久久成人AV| 久久国产成人亚洲精品影院| 最新久久免费视频| 久久99国产精品久久99果冻传媒| 精品久久久久久国产免费了| 色欲综合久久中文字幕网| www亚洲欲色成人久久精品| 精品国产乱码久久久久软件| 久久777国产线看观看精品| 久久久久亚洲AV成人网人人网站 | 久久成人影院精品777| 精品久久久久成人码免费动漫|