本
文
摘
要
Cheat Engine是一个强大的DIY修改器。今天碰巧学了一番,用的是自带的教程。但是也许CE太过于极客了,后面几个教程,只有思路而没有操作,颇为棘手。第九关偏偏网上还没有教程,摸索半天总算弄明白如何解决最后一关。
CE的前面几关的攻略见百度贴吧
精确数值扫描:http://tieba.baidu.com/p/2322488210
未知初始数值:http://tieba.baidu.com/p/2322501468
浮点数: http://tieba.baidu.com/p/2322517857
寻找代码: http://tieba.baidu.com/p/2322528453
指针: http://tieba.baidu.com/p/2322539055
代码注入: http://tieba.baidu.com/p/2322579352
多级指针: http://tieba.baidu.com/p/2322588800
生成修改器: http://tieba.baidu.com/p/2322630649第九关题目如图
游戏讲的是,你需要调整游戏内部数据,来使得玩家控制的Dave和Eric打败500血的电脑。正常情况自动执行,玩家的血量会很快归0,so just hack it!
1 找到四个血量的地址
首先,用精确数值扫描的方法,找到Dave的血量地址,注意这个地方血量是单浮点型。
如上图,我找到了两个玩家的血量地址,并设置了描述。
接着,以Dave为例,右击,选择“是什么改写了这个地址”,打开debug窗口,并再次攻击Dave,找到相应的代码,如图
打开:“显示反汇编程序”
右击moves [rbx+08],xmm0,选择,找出指令访问的地址。出现一个新的空白对话框,再次对每个角色攻击一次,结果如图。
可以发现,前两个地址正是Dave和Eric的地址,并且如果你之前用类似的方法找到了两个电脑的地址,正是下面两个。故猜测,运行“攻击”时,程序是依次获得该角色的指针位置,放到rbx寄存器中,然后在offset为08的位置,就是该角色的血量,修改这个血量,即角色受到了攻击。那么,要让Dave和Eric胜出,我们就要让他们血量不减少的同时,找到电脑的血量,并使其减少。
2 分析数据
选中四个地址,右击选中“打开选中的地址分析数据”(control+D)。如图
可以发现,每个角色,除了在基址的前几个地址有数据,别的都是0,仔细贯彻这些数据可以发现,在offset为14的位置,玩家的值为1,电脑的值为2。并且多次攻击发现,这个值为定值。故,我们可以采用这一点来区分玩家与电脑,达成目标。
回到汇编代码的窗口,分析命令moves [rbx+08],xmm0,并结合上面的代码,我们发现下图这样的代码:
显然,这是一个简单的改变[rbx+08]位置值的指令。先将[rbx+08](血量)存储的值放到xmm1中,再减掉一个xmm0,然后在放回去。
故在subss xmm1,xmm0处代码注入。
3 注入代码
打开-内存浏览器-工具-自动汇编
再打开模板-代码注入
如图
代码会注入在原代码的上方,并且原来的代码也会保留。其中newmem,originalcode等,是汇编中的位置标志,可以直接用来跳转。
故在newmem下添加代码如下:
cmp [rbx+14],1 //判断是否是玩家 jne originalcode //不是玩家,直接跳转到原代码执行 addss xmm1,xmm0 //是玩家,将相减改为相加。也可以去掉这一句,即不对玩家血量进行修改 jmp exit //调到exit处然后点击执行。回到tutorial程序,重启游戏并自动执行,结果如图
去掉了addss xmm1,xmm0语句,两个玩家血量不变至此,解决了CE的最后一个问题,成功通关。
总的来说,CE是一个相当强劲的修改器,用完之后也深深感到制作者设计之精妙,Cheat Engine :: Index 官方论坛里还有更多的奇技淫巧,有兴趣的朋友可以去看看。