EVE任务挂机脚本 part2

经过一段时间的摸索,我已经成功地注入EVE,并能调用eve客户端的API。

对于注入EVE的原理,这篇文章讲的很清楚。大体来说,就是将自己的dll注入到EVE的进程中,然后调用EVE内部的Python解释器。由于EVE的客户端完全就是用Python写的,所以你几乎可以为所欲为:)

我使用EasyHook作为注入工具。EasyHook使用起来比较简单,而且可以很好地处理托管代码。同时,使用EasyHook可以用C#来开发,比较方便。但是EVE内部运行的是CPython,因此我现在的做法是使用EasyHook将一个托管的dll(使用C#编写)注入EVE,再用托管的dll加载非托管dll(使用C++编写),再在非托管dll中调用CPython的API。

在开发的过程中遇到的一个麻烦是,EasyHook只管杀不管埋。某个dl被注入到目标进程后,除非目标进程关闭,否则它会一直驻留在目标进程的内存中。因此,每当重新编译代码,我都需要重开EVE以进行再次注入。这非常的蛋碎。

我一开始的想法是,在外部使用Python编写脚本,然后将脚本代码传入EVE的进程空间,再调用Python的eval()函数运行我的脚本。不过CPP显然对这着早有防范,他居然把Python库中的eval()函数整个给拿掉了!与EVE一同发布的python27.dll位于 EVE/bin 文件夹下,大家可以拿工具去看里面的函数签名,eval()函数(对应的C API是PyRun_SimpleString())是不存在的。

既然此路不通就只能曲线救国了,我目前在C#中运行一个IronPython解释器,以解析我的Python脚本文件。所以我现在的调用路径是 IronPython -> C# -> C++ -> CPython。虽然比较蛋疼,不过确实有效。

当然,写挂是有风险的。据这篇文章说,CPP封号很严。大体来说EVE封号分三个等级:

  1. 永久封你的号。
  2. 永久封在你电脑上登过的号。
  3. 永久封与你的号同一个IP网段的所有号。
  4. 而且没得申诉。

所以,我目前的开发环境是虚拟机+VPN。公司里玩EVE的人还是有几个的,我不想他们因为我而被封号:)

那么,Lv4战斗任务挂机脚本也被放在GitHub上了,名字是EVE-Script-3,目前正在开发中。这是一个注入型脚本,因此需要配合另一套注入代码使用。不过那部分代码我就不放出来了。实际上,注入过程并不复杂。如果有心,即使没有任何逆向工程经验的人(比如像我)也可以成功。

当然,如果你准备着手写自己的注入挂,你可能会需要一份EVE客户端源码,你可以在这里找到。虽然版本比较旧,不过凑合着能用:)

EVE任务挂机脚本

06年EVE国服公测的时候,我是第一批玩家。我的EVE游戏历程大概是 玩一年->AKF两年->玩一年->AFK两年。最近由于同学诱惑,于是又重拾EVE。当然考虑到国服目前这个状况,我果断流失到欧服了。

EVE是一款非常令人纠结的游戏,大凡接触EVE稍久的玩家都会惊叹于它神一样的画面以及屎一样的PVE内容。EVE的PVP部分还是不错的,但PVP始终是消费。要生产就必须日复一日、年复一年地刷着一成不变的任务/死亡。这就是我AFK的原因,做任务让我恶心。但同时我又是个非常有收集欲的人,而EVE刚好能极大地满足我的收集欲。魔兽世界是个好游戏,个人认为在游戏性上比EVE好太多,但EVE更能满足我的收集欲。因此,每当AFK一段时间后,我便心痒难耐,骚动不已。

于是我开始考虑为EVE写任务脚本。

最初的想法是用按键精灵。我也用按键精灵写过一些小玩意。不过按键精灵存在的问题是:

  • 所有东西都要写在一个文件里,这是让我最汗颜的一点
  • 不具扩展性,比如据我所知按键精灵不提供文字识别(OCR)

随后我考虑使用Python。游戏脚本主要就是处理输入和输出。输入就是读取屏幕内容,输出就是模拟鼠标键盘操作。我使用OpenCV进行图像识别,使用pytesser进行文字识别,使用pywin32桥接鼠标和键盘消息。这些模块网上都有,直接下载就可以用了。看,Python无所不能,写个游戏脚本自然不在话下:)

但这些日子EVE的脚本也越来越难写。首先是EVE界面变得越来越花哨,这对于图像识别来说是个大敌。如何有效防范脚本外挂?答案是半透明的皮肤以及球型的血条。另一个问题是CCP修改了怪物的AI,怪物现在会更加频繁地攻击无人机,这使得无人机挂机完成任务的好日子一去不复返。我是无人机党,经我研究除了极个别精英怪以外,轻型无人机还是比较不会招惹仇恨的。因此想要无人机挂机,只能用轻无。

大约在2013年1月,我完成了EVE-Script,这是一个lv2任务的挂机脚本。代码写的比较搓,主要是练手攒经验为主。

大约在2013年3月,我完成了EVE-Script-2,这是一个lv3任务挂机脚本,也是我目前正在使用的脚本。使用这个脚本挂一天下来的收益大概是一亿ISK外加八万多LP点,期间不捡垃圾不打捞。现在你可以看出问题来了,使用脚本挂机的收益远比不上玩家手动操作。但好处在于,机器任劳任怨,人类却不能连续做十多小时的任务。

我写的脚本只适合我自己使用,我放出的源代码也很难给任何人提供帮助。但对于那些想要动手写自己的任务脚本的人来说,我在这里为你们提供了一些思路。但同时需要注意的是,脚本挂机是个高风险行当。风险不但来自CCP的封号,还来自各种莫名其妙的怪损。

original_xEiG_7d8d0000def6125c

 

大体来说,一个任务脚本在开发完成后,还需要经过大量的跟踪调试才能够完全正常地投入使用。经过我长时间的调教,我的脚本已经不会导致怪损。现在断我财路的最大的问题是断线:)

—————————————————-

喔,你说lv4任务。当然,这些才是最富有油水,最具有挂机价值的任务。在完成了lv3任务的挂机脚本后,我马上就考虑开始开发lv4任务的脚本。但随着我Google资料的增多,我发现也许有更好的方式来完成这项工作。

游戏挂机脚本大概可以分为两种,一种是像按键精灵一样,找图,模拟鼠标键盘事件。这种脚本有个冠冕堂皇的名字叫做“基于图像识别的挂机脚本”。还有另一种“基于DLL注入的挂机脚本”,这种脚本更高效,更简单。真的,如果能注入DLL,我就可以直接调用EVE内部的API,这比从屏幕抓图分析简单太多了。

众所周知EVE的逻辑是使用Python编写的,EVE内部会运行一个Python解释器。假设EVE没有对脚本进行混淆处理的话,我应该可以直接获取EVE的所有UI元件。显然国外已经有许多蛋疼的人研究过这种方法的可行性了,事实上国外许多收费的脚本就是这么做的。

总之,一切还有待研究。