C语言实现植物大战僵尸自动收集阳光(一) 问题分析与寻找基址

C语言实现植物大战僵尸自动收集阳光(一) 问题分析与寻找基址
C语言实现植物大战僵尸自动收集阳光(二) C语言控制台程序的实现
C语言实现植物大战僵尸自动收集阳光(三) 解决收集不全与收集奖杯卡死的问题

前言

前半个月正是考试周,我们学校软件和计算机的课程安排非常不对称,按理说大三下学期,同学们考研的考研,找工作的找工作,根本没有那么多时间应付期末,但是我们这学期偏偏有5门闭卷考试,人家计算机只有一门闭卷其余全开卷,实名制羡慕,我女朋友就是计算机的,在我复习的时候她就在玩植物大战僵尸,在那用鼠标咔嚓咔嚓的点阳光,咱也不敢说啥(卑微男孩,毫无家庭地位),甚是心烦,遂问了一句,要是我给你做个软件能自动收集阳光,你觉得怎么样?她答:“那敢情好,就怕你没这个本事。”我日,我都这么卑微了,这事还能让她拿住?复习?复习个p,整!

前置内容

分析问题

刚确认问题后,我立刻得到如下几个思路

  1. 软件模拟硬件,识图找阳光,发送消息,模拟鼠标点击
  2. 找到收集阳光的call,软件调用

如果思路1的话,操作会很不方便, 比如正在放植物的时候,如果发送了鼠标点击的消息,可能会把植物放到意外的地方,所以我们选思路2

确定思路

下一个问题就是,如果找到收集阳光的子程序,我们需要在OD中下断点,并不断向上追踪,那么问题来了,从哪里下断点?
我观察到当阳光出现时,是以一个速度向下掉落,玩家点击阳光后,阳光飞往左上角,阳光的运动状态发生改变了,那么我猜测,在收集阳光的子程序中,应该有一个状态量,状态量改变,阳光运动状态也打算改变,只要找到这个状态量,在堆栈中查看改变这个状态量的汇编代码所在哪个子程序便可。下一个问题,如何查找状态量?
答:用CE不断搜变化的值与不变的值

动手尝试

  1. 第一个阳光落下,按ESC暂停,进行一次全搜索
    在这里插入图片描述

  2. 点击第一个阳光,按ESC暂停,阳光状态改变了,搜索一次变化的值
    在这里插入图片描述

  3. 此时我们发现有很多值还在变动,显然这不是我们需要的,再搜索一次未变化的值,直到剩余地址数趋于稳定。

  4. 重复上述动作,直到地址结果数令人接受在这里插入图片描述

我们猜测阳光落下与收集的状态变量是布尔型,所以直接对第四个地址进行尝试,当阳光落下时,该地址的值为0,鼠标点击后,该地址值为1,为了确认一下这个地址是否是我想要的,我用ce将它锁定为1,然后发现,当将该地址锁定为1的时候,就已经实现自动收集了,大功告成。

所以,很开心的是,我们已经不需要再用OD去下断点找call了,直接把这个地址锁成1就完事了。但是这个地址是游戏运行时根据基地址算出来的地址,我们还得找到一个不变的地址(基地址)才能给女朋友用,要不她一重启游戏这个地址就失效了,她还是得挑我毛病。

注意:变化值与不变值的方式查找地址,能否找到自动收集所需要的内存的地址需要一点运气,读者在复现的时候可以直接通过0和1的搜索加快搜素进度,同时,为了最大可能性的成功,请保证同一时间内场上只有一个阳光,且该阳光掉落前,没有其他阳光在场。具体原因请详见该系列的第三篇博文。

定位基址

CE找植物大战僵尸基地址的教程网上很多,而且没啥技巧,很机械性的照着做就完事了,我上文给出了一个链接,可以作为参考
在这里我直接给出基地址和偏移

基地址:
6AA00C
6A9F78
6A9F38
6A9EC0

[[[基地址]+00000768]+E4]+50

这个我们在课上学过,叫间接寻址,基地址和偏移是常量,[地址]表示取地址内储存的值,类似C语言中取指针指向的变量的值*p,游戏运行的时候,程序根据基地址内的值与偏移进行运算就得到目标地址,当然我们做辅助软件从程序外部修改内存用的也是这个原理。

结论

我们已经找到了自动收集阳光的基地址,按理说每次打开ce把地址算出来,然后把它锁定为1就完成任务了,我特意把女朋友叫了过来,向她证明:“你看,我做到了”。不过到这里我们还没完成,因为咱们总不可能让人家就这么用吧,至少得写个控制台程序出来,所以下一篇就是怎么用c语言把这个功能实现出来。

同时,还有一件事,就是在后面的实践中发现,只锁定这个地址其实会有两个问题

  1. 锁定该地址会导致无差别收集,包括阳光,金币,奖杯。当奖杯被自动收集时,游戏会卡住,无法正常进行冒险模式
  2. 当阳光多了以后,有一部分阳光无法被自动收集

对这两个问题的分析和解决,我将放到该系列的第三篇博文中,一个事能水三篇,我表示很满意(逃

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值