最近在学习有关游戏逆向的相关知识,打卡坚持记录下去。
首先,关于如何直接用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这个就相当于阳光相对于基址的位置,即使游戏重启后也可以生效哦,是不是很简单呢