KeyXing魔兽显血改键工具|制作过程

来源:互联网 发布:mpc控制算法 编辑:程序博客网 时间:2024/04/30 17:28

功能:显血、不影响聊天改键

其实这个工具就是用了几个api,很简单就能写出来。如果直接和大家介绍用哪几个api函数,那么对大家来讲毫无用处。重点问题是怎么确定是用哪些函数。知其所以然而知其然,以不变应万变,这里就跟大家谈谈我是如何找出相应的函数。

秘籍一:查

学计算机最大的好处就是网上有海量的资料,不懂就查,X度一下什么都出来。

经过查阅资料后,整理出如下解决方案:

显血:玩过魔兽都知道在游戏按“alt”会显双方血。经过查资料发现原来“[”和“]”分别显示我方和敌方的血。(PS:别问我魔兽如何,电脑都能虐我的)可以尝试用模拟按键消息。

改键:修改某个快捷键文件,或者利用全局钩子的方式进行替换(如何改键又不影响聊天?下面再告诉你。)

“查”是贯彻各个模块功能实现的秘籍,在工程开始时利用“查“网上资料试到编写程序有个大致的方向。然后利用下面的秘籍边查边实现,一步一步来。

 

秘籍二:试

弄出一万个解决方案还不如亲身写来试一试。

在编写程序的时候,有必要写一些测试工具,对程序某一部分功能的解决方案进行验证。可以如图只有一个按钮的简单对话框,或者在控制台进行测试。

 

在这个魔兽显血改键工具中,始终贯彻“试”这一秘籍的。例如在上面的:“如何显血”的解决方案中,通过“试“就能验证是否管用。即使不管用,也能从中得到某些提示,从而明确另一个方向。

模拟按键消息。按键常用有三种WM_KEYDOWNWM_KEYUPWM_CHAR。使用的函数有SendMessage或者keybd_event (会不会影响魔兽聊天?别急,后面再去分析分析)

Go,开始测试解决方案了,还是如上图写一个简单的对话框,按钮打开计时器每隔一个时间用Findwindows找到魔兽窗口,然后用SendMessage发送各种消息。

(注意如果游戏用 GetKeyState”来获取键盘消息,获取键盘消息SendMessage是没效的,得用keybd_event。不过我想不到有什么理由会让游戏牺牲这么大性能用GetKeyState?)

点击尝试按钮之后,果真在dota里显血了,测试成功!

 

秘籍三:分析

单是测试成功还不行,还得进一步获取具体每个消息所起的作用。

经过分别发送WM_KEYDOWNWM_KEYUPWM_CHAR消息

总结得:WM_KEYDOWN是显示血量的,WM_KEYUP是取消显示血量的。所以我们按下“alt”键显示血量,松开则取消显示血量。根据此分析,即可用语句控制逻辑进行显血了。

又回到之前最大的一个问题是:“如何解决改键而不影响聊天的?”看这个问题好像很难解决,是否需要写代码区分聊天状态和游戏状态?不需要,经过测试和分析,发现WM_KEYDOWN是使用技能,WM_CHAR是输入聊天字符,就是说如果单是发送WM_KEYDOWN而不发送WM_CHAR的话,魔兽聊天时是不会输入到聊天框里的。同时为了不影响其它进程,则指定只发送消息到魔兽窗口。

 

秘籍四:反汇编

确实遇到困难解决不了,网上又没公开源码怎么办?

在编写的过程中,我看到显血改键比较有名气warkey不用Dll就能截取魔兽中的按键信息,绿色软件需要的是方便,最好做到一个exe文件就搞定,开始我想到是使用GetKeyState主动去获取键盘中的按键信息,但经过测试之后发现GetKeyState的确能获取全局键盘的按键消息,但是却获取不了游戏中的魔兽程序。知道我鹏友告诉我一声哈。百般无奈又查不到相关的信息,此事只能出必杀——反汇编分析。当然这需要一定的反汇编能力。我们可以通过Ollydbg分析目标程序,或者更直接的途径分析别人写好的的显血改键工具!这里以比较出名的warkey显血工具为例(这个工具需要安装,这是我写显血改键工具的原因——我喜欢免安装的绿色工具。)用Ollydbg打开warkey后,搜索程序中的所有使用过的函数,分析跟踪可能性最大的函数:SetWindowsHookEx



跟踪分析,此工具设置了一个WH_KEYBOARD_LL全局钩子。全局钩子不用DLL?不急慢慢接下去分析。

我们知道SetWindowsHookEx中第二个参数是填写钩子回调函数,跟踪入去看看里面有什么。发现里面有keybd_event,而且参数还是KV_NUMPAD7,此举是模拟数字键盘的7!!!

 

另外还发现弹出广告页面的元凶!我要绿色!!

 

又回到秘籍二“试”的方法中,一测试,果然WH_KEYBOARD_LL是一个不需要DLL就能设置全局钩子的特殊钩子。

 

结束语:

总结写程序的秘籍:

1、查 ,利用网上丰富的资源

2、试,多写测试程序检验某部分功能的解决方案

3、分析,利用已有的资料或现象分析定位下一步前进的方向

4、参考别人的代码

前面三个没有先后之分,始终穿插到程序中,第四个建议是最后才使用。因为如果一开始就参考别人的代码,你的思维就会限制到别人的代码中,从而会忽略很多细节(例如为什么用这个函数而不用哪个函数?这样写和那样写有什么区分?),你看到的代码是别人经过分析比较后的代码,但在分析细节中获取的往往是最多的。