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

2021-09-20 15:15:19 字數 4005 閱讀 3834

網上有很多外掛程式製作的教程,大多是講針對大型網路遊戲的,主要包含一些抓包、反彙編、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)

// 繼續執行下乙個鉤子程式

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語言編寫的外掛程式。其實作為遊戲外掛程式來說,主要就是三個功能 模擬鍵盤操作 模擬滑鼠操作 修改記憶體資料。修改記憶體資料比...