網絡遊戲外掛製作(1)_按鍵型外掛

1、動作式,所謂動作式,就是指用API發命令給窗口或API控制鼠標、鍵盤等,使遊戲裏的人物進行流動或者攻擊,最早以前的“石器”外掛就是這種方式。

2、本地修改式,這種外掛跟傳統上的一些遊戲修改器沒有兩樣,做這種外掛在編程只需要對內存地址有一點認識並且掌握API就可以實現,“精靈”的外掛這是這種方式寫成的,它的難點在於找到那些地址碼,找地址一般地要藉助於別人的工具,有的遊戲還有雙碼校驗,正正找起來會比較困難。

3、木馬式,這種外掛的目的是幫外掛製作者偷到用戶的密碼,做這種外掛有一定的難度,需要HOOK或鍵盤監視技術做底子,纔可以完成,它的原理是先首截了用戶的帳號或密碼,然後發到指定郵箱。

4、加速式,這種外掛可以加快遊戲的速度。原本我一直以爲加速外掛是針對某個遊戲而寫的,後來發現我這種概念是不對的,所謂加速外掛其實是修改時鐘頻率達到加速的目的。

5、封包式,這種外掛是高難度外掛,需要有很強的編程功力纔可以寫得出來。它的原理是先截取封包,後修改,再轉發。這種外掛適用於大多數網絡遊戲,像WPE及一些網絡遊戲外掛都是用這種方式寫成的,編寫這種外掛需要apihook技術,winsock2技術…………

首先,先來談一下動作式的外掛,這也是我第一次寫外掛時做的最簡單的一種。
記得還在“石器”時代的時候,我看到別人掛着一種軟件(外掛)人物就可以四外遊走(當時我還不知道外掛怎麼回事^_^),於是找了這種軟件過來研究(拿來後才聽別人說這叫外掛),發現這種東東其實實現起來並不難,仔佃看其實人物的行走無非就是鼠標在不同的地方點來點去而已,看後就有實現這功能的衝動,隨後跑到MSDN上看了一些資料,發現這種實現這幾個功能,只需要幾個簡單的API函數就可以搞定:


1、首先我們要知道現在鼠標的位置(爲了好還原現在鼠標的位置)所以我們就要用到API函數GetCursorPos,它的使用方法如下:

BOOL GetCursorPos(
LPPOINT lpPoint  // address of structure for cursor position  
   );



2、我們把鼠標的位置移到要到人物走到的地方,我們就要用到SetCursorPos函數來移動鼠標位置,它的使用方法如下:

BOOL SetCursorPos(
    int X, // horizontal position  
    int Y  // vertical position
   );


3、模擬鼠標發出按下和放開的動作,我們要用到mouse_event函數來實現,具休使用方法用下:
 

 

VOID mouse_event(
    DWORD dwFlags, 			// flags specifying various motion/click variants
    DWORD dx, 					// horizontal mouse position or position change
    DWORD dy, 					// vertical mouse position or position change
    DWORD dwData, 			// amount of wheel movement
    DWORD dwExtraInfo; 	// 32 bits of application-defined information
   );

在它的dwFlags處,可用的事件很多如移動MOUSEEVENTF_MOVE,左鍵按下MOUSEEVENTF_LEFTDOWN,左鍵放開MOUSEEVENTF_LEFTUP,具體的東東還是查一下MSDN吧~~~~~
好了,有了以前的知識,我們就可以來看看人物移走是怎麼實現的了:

getcursorpos(point);
setcursorpos(ranpoint(80,windowX),ranpoint(80,windowY));//ranpoint是個自制的隨機座標函數
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
setcursorpos(point.x,point.y);

看了以上的代碼,是不是覺得人物的遊走很簡單啦~~,舉一仿三,還有好多好東東可以用這個技巧實現(我早就說過,TMD,這是垃圾外掛的做法,相信了吧~~~),接下來,再看看遊戲裏面自動攻擊的做法吧(必需遊戲中攻擊支持快捷鍵的),道理還是一樣的,只是用的API不同罷了~~~,這回我們要用到的是keybd_event函數,其用法如下:

VOID keybd_event(
    BYTE bVk, // virtual-key code
    BYTE bScan, // hardware scan code
    DWORD dwFlags, // flags specifying various function options
    DWORD dwExtraInfo  // additional data associated with keystroke
   );
我們還要知道掃描碼不可以直接使用,要用函數MapVirtualKey把鍵值轉成掃描碼,MapVirtualKey的具體使用方法如下:
UINT MapVirtualKey(
    UINT uCode, // virtual-key code or scan code
    UINT uMapType  // translation to perform
   );
好了,比說此快接鍵是CTRL+A,接下來讓我們看看實際代碼是怎麼寫的:

  keybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),0,0);
  keybd_event(65,mapvirtualkey(65,0),0,0);
  keybd_event(65,mapvirtualkey(65,0),keyeventf_keyup,0);
  keybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),keyeventf_keyup,0);

首先模擬按下了CTRL鍵,再模擬按下A鍵,再模擬放開A鍵,最後放開CTRL鍵,這就是一個模擬按快捷鍵的週期。



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章