在幾年前我看到別人玩網(wǎng)絡(luò )游戲用上了外掛,做為程序員的我心里實(shí)在是不爽,想搞清楚這到底是怎么回事。就拿了一些來(lái)研究,小有心得,拿出來(lái)與大家共享,外掛無(wú)非就是分幾種罷了(依制作難度):1、動(dòng)作式,所謂動(dòng)作式,就是指用API發(fā)命令給窗口或API控制鼠標、鍵盤(pán)等,使游戲里的人物進(jìn)行流動(dòng)或者攻擊,最早以前的“石器”外掛就是這種方式。(這種外掛完全是垃圾,TMD,只要會(huì )一點(diǎn)點(diǎn)API的人都知道該怎么做,不過(guò)這種外掛也是入門(mén)級的好東東,雖然不能提高你的戰斗力,但是可以提高你的士氣)
2、本地修改式,這種外掛跟傳統上的一些游戲修改器沒(méi)有兩樣,做這種外掛在編程只需要對內存地址有一點(diǎn)認識并且掌握API就可以實(shí)現,“精靈”的外掛這是這種方式寫(xiě)成的,它的難點(diǎn)在于找到那些地址碼,找地址一般地要借助于別人的工具,有的游戲還有雙碼校驗,正正找起來(lái)會(huì )比較困難。(這種外掛,比上一種有一點(diǎn)點(diǎn)難度,但是這種外掛做起來(lái)能夠用,也是有一定難度的啦~~,這種外掛可以很快提升你對內存地址的理解及應用,是你編程技術(shù)提高的好東東)
3、木馬式,這種外掛的目的是幫外掛制作者偷到用戶(hù)的密碼(TMD,“爛”就一個(gè)字,不過(guò)要知已知彼所以還是要談一下啦~~),做這種外掛有一定的難度,需要HOOK或鍵盤(pán)監視技術(shù)做底子,才可以完成,它的原理是先首截了用戶(hù)的賬號或密碼,然后發(fā)到指定郵箱。(我以前寫(xiě)過(guò)這樣的東東,但是從來(lái)沒(méi)有用過(guò),我知道這種東東很不道德,所以以后千萬(wàn)別用呀?。?br>
4、加速式,這種外掛可以加快游戲的速度……(對不起大家,這種東東我沒(méi)有實(shí)際做過(guò),所以不能妄自評,慚愧)
這幾種外掛之中,前三種可以用VB,Delphi等語(yǔ)言比較好實(shí)現,后兩種則要用VC等底層支持比較好的編程工具才好實(shí)現。
動(dòng)作式外掛
首先,先來(lái)談一下動(dòng)作式的外掛,這也是我第一次寫(xiě)外掛時(shí)做的最簡(jiǎn)單的一種。
記得還在“石器”時(shí)代的時(shí)候,我看到別人掛著(zhù)一種軟件(外掛)人物就可以四外游走(當時(shí)我還不知道外掛怎么回事),于是找了這種軟件過(guò)來(lái)研究(拿來(lái)后才聽(tīng)別人說(shuō)這叫外掛),發(fā)現這種東東其實(shí)實(shí)現起來(lái)并不難,仔佃看其實(shí)人物的行走無(wú)非就是鼠標在不同的地方點(diǎn)來(lái)點(diǎn)去而已,看后就有實(shí)現這功能的沖動(dòng),隨后跑到MSDN上看了一些資料,發(fā)現這種實(shí)現這幾個(gè)功能,只需要幾個(gè)簡(jiǎn)單的API函數就可以搞定:
1、首先我們要知道現在鼠標的位置(為了好還原現在鼠標的位置)所以我們就要用到API函數GetCursorPos,它的使用方法如下:
BOOL GetCursorPos( LPPOINT lpPoint // address of structure for cursor position ); |
2、我們把鼠標的位置移到要到人物走到的地方,我們就要用到SetCursorPos函數來(lái)移動(dòng)鼠標位置,它的使用方法如下:
BOOL SetCursorPos(
int X, // horizontal position int Y // vertical position ); |
3、模擬鼠標發(fā)出按下和放開(kāi)的動(dòng)作,我們要用到mouse_event函數來(lái)實(shí)現,具休使用方法用下:
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處,可用的事件很多如移動(dòng)MOUSEEVENTF_MOVE,左鍵按下MOUSEEVENTF_LEFTDOWN,左鍵放開(kāi)MOUSEEVENTF_LEFTUP,具體的東東還是查一下MSDN吧~~~~~
好了,有了前面的知識,我們就可以來(lái)看看人物移走是怎么實(shí)現的了:
getcursorpos(point); setcursorpos(ranpoint(80,windowX),ranpoint(80,windowY));//ranpoint是個(gè)自制的隨機坐標函數 mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0); setcursorpos(point.x,point.y); |
看了以上的代碼,是不是覺(jué)得人物的游走很簡(jiǎn)單啦~~,舉一仿三,還有好多好東東可以用這個(gè)技巧實(shí)現(我早就說(shuō)過(guò),TMD,這是垃圾外掛的做法,相信了吧~~~),接下來(lái),再看看游戲里面自動(dòng)攻擊的做法吧(必需游戲中攻擊支持快捷鍵的),道理還是一樣的,只是用的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 ); |
好了,比說(shuō)此快接鍵是CTRL+A,接下來(lái)讓我們看看實(shí)際代碼是怎么寫(xiě)的:
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鍵,再模擬放開(kāi)A鍵,最后放開(kāi)CTRL鍵,這就是一個(gè)模擬按快捷鍵的周期。
?。吹竭@里,差不多對簡(jiǎn)易外掛有了一定的了解了吧~~~~做一個(gè)試試?如果你舉一仿三還能有更好的東東出來(lái),這就要看你的領(lǐng)悟能力了~~,不過(guò)不要高興太早這只是才開(kāi)始,以后還有更復雜的東東等著(zhù)你呢~~)