如何使用CE来获取游戏的基址(以植物大战僵尸为例)

最近在学习有关游戏逆向的相关知识,打卡坚持记录下去。

        首先,关于如何直接用CE来获取游戏中的数据我相信大家都很清楚——

首先直接在Value下直接填写你所知道的数值,再点击上面的FirstScan进行扫描

然后我们就可以得出很多属于游戏进程的,存储了和你所搜索的值一样的地址(这里搜索的是50):

然后再根据这个值的变化再搜索一次,我们就能排除大部分地址(这里我种了一颗向日葵,阳光变为0):

可以看到符合条件的地址大大减少了,如是几次,我们可以很轻易的获取当前存放阳光的地址,我们试着把阳光改为6666:

可以看出阳光变为了6666,我们就实现了一个基础的通过内存来修改游戏数据目的,但是这个目的并不如预取中的完美——因为每次游戏重启它的内存地址都会变化,那么有没有什么办法可以避免这个问题呢?当然有!因为大部分游戏都有一个叫基址的东西(不懂的同学自己去搜),而游戏程序每次运行时的代码都是不变的,那么很明显,每个变量的位置相对于基址也是不变的,于是我们可以通过游戏的基址来确定游戏的位置,然后再通过其相对于基址的偏移量来确定其目前的地址,达到“以静制动”的目的。

那么我们还是以阳光为例子,假设我们已经获取了阳光的地址

我们可以通过这个来看看阳光值被哪些代码读取了(因为不管你的值是多少,最后都得跑到mian函数里面才能被调用,而这个main就是我们需要找的基址)

点开发现了被这两个东东读取了,这样我们直接看第二个汇编指令:

- mov eax,[esi+00005560] <<表示读,即将esi+00005560这个地址的值读取到eax里面

点开发现ESI的值是16C9E80,已知寄存器的值都是从内存中读取来的,那么这个值又存在内存

哪里呢,我们再来扫描一次

看得出来,这个值是来自于寄存器EDI+168的这个地址,因为7681是常量,故我们只考虑EDI寄存器,在查EDI寄存器:

成功在里面找到了基址(绿色的都是),随便以一个基址为例:[[006A9EC0]+768]+5560这个就相当于阳光相对于基址的位置,即使游戏重启后也可以生效哦,是不是很简单呢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值