本帖最后由 namedlxd 于 2019-5-4 16:07 编辑
上一篇帖子讲了如何一个坑放多个植物,其实很简单。由于楼主并不熟悉C/C++、E语言,而且没找到用python实现的方法,楼主实在弱鸡,希望大家见谅。
这里给出个特征码在OD里面搜一下就可以找到对应位置了,注意不同版本可能特征码不同,不一定全部能用。
具体操作是:
1.OD附加植物大战僵尸
2.ctrl+G 跳转到00401000,习惯
3.ctrl+B 输入下方特征码
83 FE 05 ?? ?? ?? ?? ?? ?? 57 53 55 ?? ?? ?? ?? ?? 85 C0
4.点确定 搜索,跳转到这
5.0040FE2F /0F84 1F090000 je PlantsVs.00410754 ; 1
6.把这个指令改为jmp就行了。
这里给大家说下特征码怎么来的,要找特征码,首先要到需要根据特征码定位的地方,然后找附近的指令的机器码。
我这里就是把附近的机器码给保存了下来,具体特征码介绍大家可以看这个帖子:https://tieba.baidu.com/p/3857456629?red_tag=1802720485
[Asm] 纯文本查看 复制代码 0040FE1C |. 83FE 05 cmp esi,0x5
0040FE1F |. 0F87 CE100000 ja PlantsVs.00410EF3 ; 0
0040FE25 |. 57 push edi
0040FE26 |. 53 push ebx
0040FE27 |. 55 push ebp
0040FE28 |. E8 F3E1FFFF call PlantsVs.0040E020
0040FE2D |. 85C0 test eax,eax
另外特别感谢@无瑕黑心肠帮忙找回丢失的图片
上一篇帖子:https://www.52pojie.cn/thread-947013-1-1.html
下面进入正题,今天来看下如何使植物快速CD,
通过观察不难发现,植物CD是一个循环的过程,那么这个逻辑在程序中如何表达呢?其实也很简单,我们先设置一个上限,比如说:10000,然后找一个变量,不断循环累加,每次加一,等加到10000就归零,每次归零CD就被刷新了,这样就实现了,当然也可以从10000累计减少,每减到零就刷新CD。
我们先假设它是递增来实现的。
进入游戏,CE附加,放下一个冷却时间较长的植物,我们搜索未知的初始值,然后切到游戏里面,让游戏运行个1秒钟,其实就是让辣椒冷却减少一点,然后再搜索增加的数值,重复这个操作。
经过不断努力,我们找到了一个在辣椒冷却结束时,值为0的数据。再次放下辣椒,然后把这个值改为5000,发现冷却结束了。说明这个值就是我们要找的值。
接下来,我们看是什么改写了这个值。第一个指令是我们拿起或放下辣椒的指令,第二个是我们放下辣椒后,辣椒CD减少的指令,我们看第二个指令的反汇编。
通过分析不难发现,我们可以将01改为一个较大的数字,实现快速CD。这种方法大家应该很熟悉了,那么接下来看看是否有新的思路。
一般来说,在游戏中冷却的代码都是类似这样来实现的:
[Asm] 纯文本查看 复制代码 while (冷却中) {
减少冷却时间;
}
设置冷却结束;
然而在汇编语言中,没有while关键字,只能用跳转指令来实现,我们可以用汇编语言模拟一个循环:
[Asm] 纯文本查看 复制代码
00 -> 是否冷却中
01 | - - 如果不是跳转到04
02 | | 减少冷却时间
03 -|- 跳转到00
04 -> 设置冷却结束
分析完之后,我们可以发现,关键语句在01,我们看汇编代码,差不多与之类似,我们看减少冷却时间上面的一条,je PlantsVsZombies.exe+872AC,我们试着把这个条件反过来,即把je改为jne。(上图为原来的,下图为改过之后的)
我们进到游戏里面看一下。我们发现实现了植物无CD,我在这里种了满屏的核弹。
这次的教程就到这里了,希望大家可以动手操作一下。我看有的朋友想要成品,其实我觉得玩游戏并不是主要的,自己动手实现这个功能才是乐趣的所在。
|