网上有很多外挂制作的教程大多是讲针对大型网络游戏的主要包含一些抓包反汇编C++的知识综合事实也如此常见的外挂都是使用VC++写的从来没有过C#或者其他NET语言编写的外挂
作为微软NET技术的忠实粉丝这难免是一种遗憾不过不要紧下面流牛木马就教大家两招包教包会免收学费 )
其实作为游戏外挂来说主要就是三个功能模拟键盘操作模拟鼠标操作修改内存数据修改内存数据比较难但模拟鼠标键盘的操作却很简单很多流行游戏的外挂都可以只通过模拟鼠标键盘来实现例如劲舞团QQ音速连连看各类网页游戏以及各类大型网游中的自动打怪自动吃药等等
Warcraft Ⅲ学名魔兽争霸之冰封王座俗称魔兽简称war在最近六七年风靡全球最近两年war在中国又掀起了玩DOTA的新高潮
本文制作DOTA游戏中的显血改键外挂为例简单地介绍如何使用C#语言制作游戏外挂
最终界面如下
本示例包含两个功能显血将Q键改为小键盘的键玩war的同学都知道这两个功能对于war(尤其是DOTA)相当重要
首先简单介绍一下外挂程序模拟键盘的原理
外挂程序与游戏程序是两个不同的进程外挂程序使用Windows提供的API找到游戏程序的进程并设置键盘钩子(什么叫做钩子?你不知道但百度知道)设置完钩子后我们再监控游戏进程中用户的按键并根据用户需求进行处理完成某些模拟键盘动作
了解了这个过程之后我们就可以开始整理思路了完成外挂一共需要以下四个步骤
一声明Windows API 中的函数和常量
//键盘Hook结构函数
[StructLayout(LayoutKindSequential)]
publicclassKeyBoardHookStruct
{
publicintvkCode;
publicintscanCode;
publicintflags;
publicinttime;
publicintdwExtraInfo;
}
#regionDllImport
//设置钩子
[DllImport(userdllCharSet=CharSetAutoCallingConvention=CallingConventionStdCall)]
publicstaticexternintSetWindowsHookEx(intidHookHookProclpfnIntPtrhInstanceintthreadId);
[DllImport(userdllCharSet=CharSetAutoCallingConvention=CallingConventionStdCall)]
//抽掉钩子
publicstaticexternboolUnhookWindowsHookEx(intidHook);
[DllImport(userdllCharSet=CharSetAutoCallingConvention=CallingConventionStdCall)]
//调用下一个钩子
publicstaticexternintCallNextHookEx(intidHookintnCodeIntPtrwParamIntPtrlParam);
//取得模块句柄
[DllImport(kerneldllCharSet=CharSetAutoCallingConvention=CallingConventionStdCall)]
privatestaticexternIntPtrGetModuleHandle(stringlpModuleName);
//寻找目标进程窗口
[DllImport(USERDLL)]
publicstaticexternIntPtrFindWindow(stringlpClassName
stringlpWindowName);
//设置进程窗口到最前
[DllImport(USERDLL)]
publicstaticexternboolSetForegroundWindow(IntPtrhWnd);
//模拟键盘事件
[DllImport(Userdll)]
publicstaticexternvoidkeybd_event(BytebVkBytebScanIntdwFlagsIntdwExtraInfo);
//释放按键的常量
privateconstintKEYEVENTF_KEYUP=;
本例所使用的函数比较少它们都在系统的USERdll里包括设置和取消钩子调用下一个钩子导入进程模拟键盘等等我们依次导入它们
这些函数的命名规范合理几乎只根据函数名就能知道其功能
如果读者对于其中的某些函数不熟悉请自行搜索MSDN
二使用Windows API设置钩子
有了以上windows API函数的声明下一步就是设置钩子了
寥寥两行代码但包含了相当丰富的内容
//委托
publicdelegateintHookProc(intnCodeIntPtrwParamIntPtrlParam);
publicvoidHook_Start()
{
//安装键盘钩子
if(hHook==)
{
KeyBoardHookProcedure=newHookProc(KeyBoardHookProc);
hHook=SetWindowsHookEx(WH_KEYBOARD_LLKeyBoardHookProcedureGetModuleHandle(ProcessGetCurrentProcess()MainModuleModuleName));
}
}
先介绍一下设置钩子的明星函数SetWindowsHookEx它的参数说明如下
SetWindowsHookEx(
idHook Integer {钩子类型}
lpfn TFNHookProc {函数指针}
hmod HINST {包含钩子函数的模块(EXEDLL)句柄 一般是 HInstance 如果是当前线程这里可以是 }
dwThreadId DWORD {关联的线程 可用 GetCurrentThreadId 获取当前线程 表示是系统级钩子}
) HHOOK {返回钩子的句柄 表示失败}
请注意lpfn这个参数上面的解释是函数指针在C#中是不能直接使用指针的更不要说函数指针了我们可以采用C#中的委托(delegate)来实现函数指针的功能
于是乎在上面的代码中我们定义了一个处理键盘消息函数的委托KeyBoardHookProcedure = new HookProc(KeyBoardHookProc)并将它作为参数传入SetWindowsHookEx 内KeyBoardHookProc就是被委托的具体函数
三监控用户操作
设置好钩子后我们可以在被委托的函数中写入监控用户操作与模拟键盘的代码
publicstaticintKeyBoardHookProc(intnCodeIntPtrwParamIntPtrlParam)
{
//监控用户键盘输入
KeyBoardHookStructinput=(KeyBoardHookStruct)MarshalPtrToStructure(lParamtypeof(KeyBoardHookStruct));
//截获Home键
if(inputvkCode==(int)KeysHome)
{
//此处写入其他操作逻辑
}
//继续执行下一个钩子程序
returnCallNextHookEx(hHooknCodewParamlParam);
}
四根据用户需要模拟键盘操作
显血功能玩war的都知道war自带的显血快捷键有个Alt键是显示所有单位生命[ 键显示友方单位生命] 键显示地方单位生命外挂需要做的事情仅仅是模拟一直按着某个键不松手而已由于Alt键与其他很多键构成组合键故我们不能模拟长按Alt否则会影响正常游戏我们的解决方案应该是模拟长按 [ 键和 ] 键代码如下
//获得魔兽程序的句柄
IntPtrwcHandle=FindWindow(nullWarcraftIII);
//如果钩子有效
if(wcHandle!=IntPtrZero)
{
//设置游戏窗口到最前
SetForegroundWindow(wcHandle);
byteVK_NUM=;//键盘上[键的代码按[可显示友方单位生命值
byteVK_NUM=;//键盘上]键的代码按]可显示敌方单位生命值
keybd_event(VK_NUM);//长按[
keybd_event(VK_NUM);//长按]
}
改键 小键盘(Numpad)上的快捷键很不方便按所以很多玩家喜欢把小键盘上的键改到左边的字母键盘玩DOTA的同学都知道没有任何英雄的技能使用Q这个快捷键(召唤师有一种球是Q(不是技能))于是我们把小键盘上的键改到Q上也不会造成任何沖突方法也很简单如果监控到用户按Q键则像游戏进程发送小键盘上的键代码如下
//如果用户按了Q键
if(inputvkCode==(int)KeysQ)
{
//获得魔兽程序的句柄
IntPtrwcHandle=FindWindow(nullWarcraftIII);
//如果钩子有效
if(wcHandle!=IntPtrZero)
{
//设置游戏窗口到最前
SetForegroundWindow(wcHandle);
byteVK_Q=(byte)KeysNumPad;
keybd_event(VK_Q);//按下小键盘
keybd_event(VK_QKEYEVENTF_KEYUP);//松开小键盘
}
return;
}
好了到这里就把模拟键盘的外挂介绍完了模拟鼠标与之非常类似请用户自行揣摩