網上有很多外掛程式製作的教程,大多是講針對大型網路遊戲的,主要包含一些抓包、反彙編、c++的知識綜合。事實也如此,常見的外掛程式都是使用vc++寫的,從來沒有過c#或者其他.net語言編寫的外掛程式。
作為微軟.net技術的忠實粉絲,這難免是一種遺憾。不過不要緊,下面流牛木馬就教大家兩招,包教包會,免收學費。 :)
其實作為遊戲外掛程式來說,主要就是三個功能:模擬鍵盤操作、模擬滑鼠操作、修改記憶體資料。修改記憶體資料比較難,但模擬滑鼠鍵盤的操作卻很簡單。很多流行遊戲的外掛程式,都可以只通過模擬滑鼠鍵盤來實現,例如:勁舞團、qq音速、連連看、各類網頁遊戲,以及各類大型網遊中的自動打怪、自動吃藥等等。
warcraft ⅲ,學名魔獸爭霸之冰封王座,俗稱魔獸,簡稱war3,在最近六七年風靡全球。最近兩年,war3在中國又掀起了玩dota的新高潮。
本文製作dota遊戲中的顯血、改鍵外掛程式為例,簡單地介紹如何使用c#語言製作遊戲外掛程式。
最終介面如下:
首先簡單介紹一下,外掛程式模擬鍵盤的原理。
了解了這個過程之後,我們就可以開始整理思路了。完成外掛程式一共需要以下四個步驟:
一、宣告windows api 中的函式和常量
//鍵盤hook結構函式[structlayout(layoutkind.sequential)]
public class
keyboardhookstruct
#region dllimport
//設定鉤子
[dllimport("user32.dll", charset = charset.auto, callingconvention = callingconvention.stdcall)]
public static extern int setwindowshookex(int idhook, hookproc lpfn, intptr hinstance, int threadid);
[dllimport("user32.dll", charset = charset.auto, callingconvention = callingconvention.stdcall)]
//抽掉鉤子
public static extern bool unhookwindowshookex(int idhook);
[dllimport("user32.dll", charset = charset.auto, callingconvention = callingconvention.stdcall)]
//呼叫下乙個鉤子
public static extern int callnexthookex(int idhook, int ncode, intptr wparam, intptr lparam);
//取得模組控制代碼
[dllimport("kernel32.dll", charset = charset.auto, callingconvention = callingconvention.stdcall)]
private static extern
intptr getmodulehandle(string lpmodulename);
//尋找目標程序視窗
[dllimport("user32.dll")]public static extern
intptr findwindow(string lpclassname,
string lpwindowname);
//設定程序視窗到最前
[dllimport("user32.dll")]public static extern bool setforegroundwindow(intptr hwnd);
//模擬鍵盤事件
[dllimport("user32.dll")]public static extern void keybd_event(byte bvk, byte bscan, int32 dwflags, int32 dwextrainfo);
//釋放按鍵的常量private const int keyeventf_keyup =2;
這些函式的命名規範合理,幾乎只根據函式名就能知道其功能。
如果讀者對於其中的某些函式不熟悉,請自行搜尋msdn。二、使用windows api設定鉤子有了以上windows api函式的宣告,下一步就是設定鉤子了。
寥寥兩行**,但包含了相當豐富的內容。
//委託public delegate int
hookproc(int ncode, intptr wparam, intptr lparam);
public void hook_start()}
先介紹一下設定鉤子的明星函式:setwindowshookex 。它的引數說明如下。setwindowshookex(
idhook: integer;
lpfn: tfnhookproc;
hmod: hinst;
dwthreadid: dword
): hhook;
請注意lpfn這個引數。上面的解釋是「函式指標」。在c#中,是不能直接使用指標的,更不要說函式指標了。我們可以採用c#中的委託(delegate)來實現函式指標的功能。
於是乎,在上面的**中,我們定義了乙個處理鍵盤訊息函式的委託keyboardhookprocedure = new
hookproc(keyboardhookproc),並將它作為引數傳入setwindowshookex 內。keyboardhookproc就是被委託的具體函式。
三、監控使用者操作
設定好鉤子後,我們可以在被委託的函式中寫入監控使用者操作與模擬鍵盤的**。
public static int keyboardhookproc(int ncode, intptr wparam, intptr lparam)四、根據使用者需要模擬鍵盤操作顯血功能:玩war3的都知道,war3自帶的顯血快捷鍵有3個。alt鍵是顯示所有單位生命,[ 鍵顯示友方單位生命,] 鍵顯示地方單位生命。外掛程式需要做的事情僅僅是模擬一直按著某個鍵不鬆手而已。由於alt鍵與其他很多鍵構成組合鍵,故我們不能模擬長按alt,否則會影響正常遊戲。我們的解決方案應該是模擬長按 [ 鍵和 ] 鍵。**如下:// 繼續執行下乙個鉤子程式
return callnexthookex(hhook, ncode, wparam, lparam);
}
//獲得魔獸程式的控制代碼改鍵:小鍵盤(numpad)上的快捷鍵很不方便按,所以很多玩家喜歡把小鍵盤上的鍵改到左邊的字母鍵盤。玩dota的同學都知道,沒有任何英雄的技能使用"q」這個快捷鍵(召喚師有一種球是"q"(不是技能))。於是我們把小鍵盤上的7鍵改到q上,也不會造成任何衝突。方法也很簡單:如果監控到使用者按"q」鍵,則像遊戲程序傳送小鍵盤上的"7"鍵。**如下:intptr wchandle = findwindow(null, "warcraft iii");
//如果鉤子有效
if (wchandle != intptr.zero)
//如果使用者按了q鍵好了,到這裡就把模擬鍵盤的外掛程式介紹完了。if (input.vkcode == (int)keys.q)
return 1;
}
C 簡單遊戲外掛程式製作 以Warcraft 為例
一 宣告windows api 中的函式和常量 鍵盤hook結構函式 structlayout layoutkind.sequential public class keyboardhookstruct region dllimport 設定鉤子 dllimport user32.dll chars...
C 簡單遊戲外掛程式製作 以Warcraft 為例
網上有很多外掛程式製作的教程,大多是講針對大型網路遊戲的,主要包含一些抓包 反彙編 c 的知識綜合。事實也如此,常見的外掛程式都是使用vc 寫的,從來沒有過c 或者其他.net語言編寫的外掛程式。其實作為遊戲外掛程式來說,主要就是三個功能 模擬鍵盤操作 模擬滑鼠操作 修改記憶體資料。修改記憶體資料比...
C 簡單遊戲外掛程式製作 以Warcraft 為例
網上有很多外掛程式製作的教程,大多是講針對大型網路遊戲的,主要包含一些抓包 反彙編 c 的知識綜合。事實也如此,常見的外掛程式都是使用vc 寫的,從來沒有過c 或者其他.net語言編寫的外掛程式。其實作為遊戲外掛程式來說,主要就是三個功能 模擬鍵盤操作 模擬滑鼠操作 修改記憶體資料。修改記憶體資料比...