C 簡單遊戲外掛程式製作 以Warcraft 為例

2022-02-15 22:03:49 字數 3368 閱讀 1583

網上有很多外掛程式製作的教程,大多是講針對大型網路遊戲的,主要包含一些抓包、反彙編、c++的知識綜合。事實也如此,常見的外掛程式都是使用vc++寫的,從來沒有過c#或者其他.net語言編寫的外掛程式。

其實作為遊戲外掛程式來說,主要就是三個功能:模擬鍵盤操作、模擬滑鼠操作、修改記憶體資料。修改記憶體資料比較難,但模擬滑鼠鍵盤的操作卻很簡單。很多流行遊戲

的外掛程式,都可以只通過模擬滑鼠鍵盤來實現,例如:勁舞團、qq音速、連連看、各類網頁遊戲,以及各類大型網遊中的自動打怪、自動吃藥等等。

warcraft ⅲ,學名魔獸爭霸之冰封王座,俗稱魔獸,簡稱war3,在最近六七年風靡全球。最近兩年,war3在中國又掀起了玩dota的新高潮。

本文製作dota遊戲中的顯血、改鍵外掛程式為例,簡單地介紹如何使用c#語言製作遊戲外掛程式。

最終介面如下:

本示例包含兩個功能:顯血;將q鍵改為小鍵盤的7鍵。玩war3的同學都知道,這兩個功能對於war3(尤其是dota)相當重要。

首先簡單介紹一下,外掛程式模擬鍵盤的原理。

一、宣告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; 本例所使用的函式比較少,它們都在系統的user32.dll裡,包括:設定和取消鉤子、呼叫下乙個鉤子、匯入程序、模擬鍵盤等等。我們依次匯入它們。 這些函式的命名規範合理,幾乎只根據函式名就能知道其功能。 如果讀者對於其中的某些函式不熟悉,請自行搜尋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) // 繼續執行下乙個鉤子程式return callnexthookex(hhook, ncode, wparam, lparam); }

四、根據使用者需要模擬鍵盤操作

顯血功能:玩war3的都知道,war3自帶的顯血快捷鍵有3個。alt鍵是顯示所有單位生

命,[ 鍵顯示友方單位生命,] 鍵顯示地方單位生命。外掛程式需要做的事情僅僅是模擬一直按著某個鍵不鬆手而已。由於alt鍵與其他很多鍵構成組合鍵,故我們不能模擬長按alt,否則會影響

正常遊戲。我們的解決方案應該是模擬長按 [ 鍵和 ] 鍵。**如下:

//獲得魔獸程式的控制代碼 intptr wchandle = findwindow(null, "warcraft iii"); //如果鉤子有效 if (wchandle != intptr.zero)

改鍵: 小鍵盤(numpad)上的快捷鍵很不方便按,所以很多玩家喜歡把小鍵盤上的鍵改到左邊的字母鍵盤。玩dota的同學都知道,沒有任何英雄的技能使

用"q」這個快捷鍵(召喚師有一種球是"q"(不是技能))。於是我們把小鍵盤上的7鍵改到q上,也不會造成任何衝突。方法也很簡單:如果監控到使用者

按"q」鍵,則像遊戲程序傳送小鍵盤上的"7"鍵。**如下:

//如果使用者按了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語言編寫的外掛程式。作為微軟.net技術的忠實粉絲,這難免是一種遺憾。不過不要緊,下面流牛木馬就教大家兩招,包教包會,免收學...