分享

小议游戏辅助工具的编写 | 逆水行舟

 quasiceo 2013-11-26
八月 21, 2007
Posted by

曾经买了N本软件加密解密|汇编的书,试图自学软件破解 ,可惜因为精力有限(天资有限?)没有继续下去。那些做得很出色的游戏W.G, 令我好生佩服。道高一尺,魔高一丈, 世界上应该没有不可破解的软件吧。哪位破解高人有空指点一下我吧,我的邮箱是*******。

虽 然不会游戏破解, 但是对有些游戏,还是可以写出一些游戏的辅助工具的。大学期间QQ游戏的连连看刚出来的时候,就写了一个辅助工具, 自动寻找可以连通的图片并自动点击达到作弊目的。虽然里面的寻路算法被学校一些高人鄙视得体无完肤, 不过这个工具让我在玩连连看游戏时所向披靡, 如果输了,那肯定是对方用了更强大的辅助工具,  orz…

网上经常看到有人使用按键精灵, 我觉得像这样的工具,其基本功能不外乎2点, 可以从软件甚至硬件上模拟鼠标键盘的状态, 以及可以对游戏屏幕的取色和分析。

模拟操作:
从 硬件上模拟鼠标键盘, 我。。。不会, 据说跟硬件驱动有关系,这个实在脱离我的认知范围。可以试试从软件上进行模拟(除了一些BT游戏应该都可以), 从较高层次看的话, 可以利用窗口的消息机制, 使用SendMessage, PostMessage之类, 再低层次一点的话, mouse_event,keybd_event也是可以的, 再低层次。。哦。。不会。

要实现模拟操作,一般都得先得到游戏窗口的句柄,这方法就多了, 通过标题FindWindow,或者WindowFromPoint,都可以,一切随意。

如果游戏可以使用SendMessage这种方法模拟的话,是比较爽的, 先开一个spy,观察一下游戏角色要实现某个动作需要给窗口发送什么消息, 然后直接在程序里面往游戏窗口的消息队列里面放入这些消息。

mouse_event也是很好用的玩意, 根据我使用mouse_event的经验, 模拟鼠标点击的话,鼠标按下之后跟弹起之前最好要sleep一段时间,不然游戏窗口貌似不认账。

屏幕取色:
现 在的游戏基本上都是DX开发的, 貌似是直接向显存写数据的,是不能直接通过窗口句柄取得某坐标颜色的。据网上资料说, 可以通过DX编程来访问其他进程里面的DX显存内容来达到取色目的…这个让我有点小寒, DX编程让我头大, 当然,可以采用另外一个方法,就是直接通过GetDesktopWindow和GetWindowDC直接取得整个桌面的DC,再使用GetPixel达 到取到屏幕某坐标颜色,再根据游戏窗口的矩形, 把屏幕某坐标映射到游戏窗口里面的坐标系。

实现了上面2个基本功能之后, 那么接下来可以扩展一些功能,比如:
得到当前游戏坐标:
基 本上现在大多数网游都会在屏幕某个角落显示小地图和地图坐标。 如果要得到地图的坐标, 在大多数情况下是可以办到的。 比如画面上显示的坐标是123 456, 那么先把坐标所在的这一块区域的颜色取下来, 把该区域分成7块或者更多块, 假设每一块就是一个数字, 每一块分别跟10个数字的模板进行匹配,如果匹配符合,那么说明该块就是该数字。

注: 有一些网站的验证码做得比较简单的话也可以使用该方法进行自动辨认。

得到当前的鼠标形状:
这个功能很重要,一般来说,鼠标移动到怪物身上或者NPC身上或者特殊物品上面,光标都会发生变化, 如果能检测当前的光标形状, 那么就可以猜测当前鼠标指到哪个物体上面。
首 先要取到当前的光标句柄, 由于GetCursor只能得到当前线程的光标,所以首先要使用游戏窗口句柄,通过GetWindowThreadProcessId得到游戏的窗口线程 号,使用GetCurrentThreadId得到我们自己程序的线程号,最后使用AttachThreadInput使我们自己的程序线程可以取到游戏 窗口线程的各种输入状态,这样我们再使用GetCursor就能得到游戏的光标句柄了, 有了光标句柄, 可以干的事情就多了。。。省略N字。

自动寻怪:
游戏里面有寻怪键的话,什么都不用care了,直接模拟那个按键即可, 要不,可以分析小地图, 毕竟小地图数据量小, 分析效率比较高, 从小地图得到怪物的坐标,再经过坐标映射得到屏幕上的怪物坐标即可。
很多情况下上面2种方法都不行,那只能使用算法进行寻怪了。网上比较流行的算法是圆渐开, 就是以某坐标为圆心,鼠标划圈, 不断扩大半径, 当鼠标遇到怪物时,光标会变化,这样就能找到怪了。

自动补血:
这个是很挫的功能了, 就是取血槽颜色, 发现颜色不对,那可能是血少了,然后模拟吃药动作。。。

脚本驱动:
可 以把所有的关键功能模块化变成DLL,留出一些接口, 接下来就有多个方法了, 比如你可以使用perl的WIN32::API, 加载这个DLL,然后就是直接的perl编程了。不过我个人感觉还是不大方便。 我有一个比较WS的方法,那就是先写一个程序,可以读取脚本和加载DLL,然后给脚本自定义一些command和参数,比如一行一个command, 程序的工作就是读取脚本里面的command,根据command去调用对应的API。 然后接下来所有程序都不需要重新修改和编译了, 你要研究的就是如何把脚本里面的command写好来实现你的作弊目的。

还有N种功能,发挥一下想象力吧….

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多