植物大战僵尸植物叠加种植
本帖最后由 namedlxd 于 2019-5-6 21:35 编辑今天我们来研究一下如何在一个位置放多个植物。
首先来思考一下放植物的流程:
选择植物选择地面位置
if ( 位置可以放植物) {
扣除阳光
放下植物
设置植物冷却
设置该位置为已使用
......
} else {
提示不能放植物
}
因为没有看过源码,所以猜测的流程大致如此,不难得出,如果我们要在某个位置放多个植物,稍加思考可以从两个地方入手:
[*]在if判断处使它总是跳转到能放植物处代码
[*]修改地面位置为未使用
当然可能这两种方法都是错误的。不妨事,我们先来看看第一种方法。
我们要找到种植物相关的代码,所以我们可以从阳光入手。首先使用CE找到阳光地址。
接下来右键查看谁改写了这个地址,我们放下一个植物可以看到有一条记录,我们记下0041BA76这个地址:
接下来我们就需要用另外一种调试工具了:OllyDbg
我们打开OD,附加进程,可能附加失败,我们把CE关掉就好了。
打开后ctrl+g,输入0041BA76,跳转到程序开始位置,一次可能跳转不到,再跳一次即可。此时我们看到的就是CPU执行的汇编指令了,我们在这段代码的段首下断点。
回到游戏中种下一棵植物,OD会断下来,我们看OD的右下角的堆栈信息追溯回去。
我们可以把这个call标记为减少阳光call,当然不一定正确。
往上翻再次找到函数头部并下断。
我们在能种植物的地方种植物,发现OD会断下来,我们单步调试往下走,标记出来每个跳转是否实现,跳转的标记为1,不跳转的标记为0。
然后再在一颗植物上种植物,OD会断下来,我们单步调试往下走,找到不同的跳转。
我们会发下这条指令在空白区域种植物时是实现的,在有植物的地方种植物是未实现的。那么这条指令很可疑,我们把它改为永远跳转试一下。
"右键" -> "汇编" 把je(jump equal)改为 jmp(无条件跳转),单击汇编。
进入到游戏中,就会发现可以叠加种植植物了。
给大家一个CT吧,hook的那一段代码。不一定适用各个版本
链接: https://pan.baidu.com/s/1y25X5iS_y6WMsfZ43NtKhA 提取码: 1ekv 复制这段内容后打开百度网盘手机App,操作更方便哦
本帖最后由 无瑕黑心肠 于 2019-5-4 03:13 编辑
楼主的图片挂了,我尝试修复了一下,以下是我找回的内容:
今天我们来研究一下如何在一个位置放多个植物。
首先来思考一下放植物的流程:
选择植物选择地面位置if ( 位置可以放植物) { 扣除阳光 放下植物 设置植物冷却 设置该位置为已使用 ......} else { 提示不能放植物}
因为没有看过源码,所以猜测的流程大致如此,不难得出,如果我们要在某个位置放多个植物,稍加思考可以从两个地方入手:
[*]
在if判断处使它总是跳转到能放植物处代码
[*]
修改地面位置为未使用
当然可能这两种方法都是错误的。不妨事,我们先来看看第一种方法。
我们要找到种植物相关的代码,所以我们可以从阳光入手。首先使用CE找到阳光地址。
接下来右键查看谁改写了这个地址,我们放下一个植物可以看到有一条记录,我们记下0041BA76这个地址:
接下来我们就需要用另外一种调试工具了:OllyDbg
我们打开OD,附加进程,可能附加失败,我们把CE关掉就好了。
打开后ctrl+g,输入0041BA76,跳转到程序开始位置,一次可能跳转不到,再跳一次即可。此时我们看到的就是CPU执行的汇编指令了,我们在这段代码的段首下断点。
回到游戏中种下一棵植物,OD会断下来,我们看OD的右下角的堆栈信息追溯回去。
我们可以把这个call标记为减少阳光call,当然不一定正确。
往上翻再次找到函数头部并下断。
我们在能种植物的地方种植物,发现OD会断下来,我们单步调试往下走,标记出来每个跳转是否实现,跳转的标记为1,不跳转的标记为0。
然后再在一颗植物上种植物,OD会断下来,我们单步调试往下走,找到不同的跳转。
我们会发下这条指令在空白区域种植物时是实现的,在有植物的地方种植物是未实现的。那么这条指令很可疑,我们把它改为永远跳转试一下。
"右键" -> "汇编" 把je(jump equal)改为 jmp(无条件跳转),单击汇编。
进入到游戏中,就会发现可以叠加种植植物了。
为啥图片加载不出来 为啥图片加载不出来 图挂了.. 这个厉害了 图片挂了 这个更厉害。 找回有点厉害啊 修改器里啥也有