本帖最后由 Roachsa 于 2019-2-24 20:33 编辑
游戏分析练习记录。
准备
- 系统:Windows 10 专业版 64位
- 软件:植物大战僵尸中文版
- 工具:CheatEngine v6.8.2
- 目标:任意阳光修改
分析
游戏运行时所需要的数据,一般都会放在内存中,以便随时获取,特别时对于一些经常修改的数值。
植物大战僵尸中的阳关值就是经常变化的数值,所以,想要对其进行修改,首先要在内存中找到它的位置。
使用CE附加到游戏进程上,准备对其内存进行搜索。
查看当前游戏中阳光值。
在CE中进行第一次搜索。
搜索结果有773个,太多了。进入游戏改变阳光值,进行第二次搜索。
结果剩了一个,那么这个就是要找的内存地址了。有时不会这么快出现唯一地址的,只需要多改变几次数值,进行搜索即可。
双击结果中的地址添加到下方的地址列表中,修改该地址数值,查看游戏中的阳光值,验证该地址。
阳光值修改成功,证明该地址正确。
不过,这个内存地址只是临时的,是游戏中用来临时保存当前游戏局中阳光值的,重新开始关卡或者开始别的关卡,保存阳光值的地址就会发生变化。
但是,无论怎么变化,游戏总能准确的找到这个保存阳光的地址,那么游戏中一定存在一个基址,通过这个基地址,作为地址指针,经过一系列偏移,就可以确定每句游戏用来保存阳光值的地址了。
现在已经确定了当前游戏中保存阳光值的地址,那么通过查找有哪些地址访问了该地址,进而反向追溯,就可以找到阳光的基址了。
使用CE查找哪些地址访问了当前阳光保存地址。
可以看到有两个地址访问了当前阳光值地址,而这两个地址全都采用了 0x5560 的偏移量,所以寄存器的值就是上一级地址指针的中的值,为 0x1BC86BC8。
使用CE搜索哪些内存中保存着该指针。
结果有很多,可以进行依次排除,不过,一般都是与其他结果相差比较大的就是我们要找的,这个是因为啥,我暂时没想明白。
这里就是结果中的第一个结果,加入地址列表。
查找访问哪些地址访问了该内存地址。
可以明显看出,地址偏移为 0x768,寄存器中的值为 0x02809C80。
与上面一样,进行搜索。排除后有两个地址不确定,这两个地址都有一个固定地址访问,而且不同。
分别是 0x006A9EC0 和 0x006A9F38。
不过,既然是基地址,那么都有可能是阳光值的基址,添加指针地址,重新开始游戏,确定基址。
最后证明,这两个都是游戏的基址,额!
可能是因为游戏版本的问题吧,两个基址都可以使用。
最后整理分析出的数据。
阳光的基址为:0x006A9EC0 和 0x006A9F38。
偏移依次为:0x0、0x768 和 0x5560。
阳光地址计算为:
第二级指针 = [006A9EC0]
第一级指针 = [第二级指针 + 0x768]
阳光值地址 = [第一级指针 + 0x5560]
依据这些地址与偏移,就可编写出任意修改阳光的程序了。
|