现在的位置: 首页 > 综合 > 正文

植物大战僵尸辅助之重叠植物

2013年08月27日 ⁄ 综合 ⁄ 共 1600字 ⁄ 字号 评论关闭

视频教程的地址:植物大战僵尸辅助视频教程付VC/易语言源代码

流程:

判断植物是否可以被种植,如果可以,则阳光值减少,如果不可以,则返回。

分析步骤:

1.       找到阳光减少的CALL

2.       分析程序开头的关键跳转

       种植成功后,阳光值会减少,所以我们必须找出阳光值减少的call(而不是阳光值增加的call)。

       首先通过CE找到存储“阳光值”的内存地址,然后通过CE找出是什么改写了这个地址。

在弹出的窗口中没有信息,此时阳光值未减少,所以改内存地址暂时未被访问。

返回到游戏中,种植下植物,让阳光值减少,随后我们发现CE中捕获到了1条指令:

mov [edi+00005560],esi,如图所示:

记录下该条指令的内存地址,如上图所示,

mov [edi+00005560],esi指令的内存地址为:0041BA76(重要)

以上工作我们都是在CE中完成的,主要是通过CE得到“阳光值”减少的指令所在的内存地址(0041BA76)

接下来,我们需要使用OD附加该游戏。

转到0041BA76处,如下图所示

转到了0041BA76后,需要在此下断点(F2)

然后返回到游戏中,种植植物,此时程序会在断点处断下来。

接下来,通过查看“调用堆栈”(快捷键ALT+K),我们可以得到代码执行过的Call的调用层级。

此时,堆栈窗口中的数据如下:

其中,

调用堆栈:     主线程

地址       堆栈       函数过程                              调用来自                      结构

0018FB74   00410876   PlantsVs.0041BA60                     PlantsVs.00410871

是最外一层调用的call

0018FC20   0041220E   PlantsVs.0040FD30                     PlantsVs.00412209

是第2层调用的call

通过分析,程序的开头第2层调用Call的PlantsVs.0040FD30处。

我们在PlantsVs.0040FD30处下断点,然后删除之前的断点(0041BA76处)。

接着返回到游戏中,种植植物,在PlantsVs.0040FD30断点处停下。

然后F8单步步过,单步执行一直到最外一层call为止。

在此期间,在每一处实现跳转的位置处,做下标记,如果所示:

直到执行到最外一层call停止单步执行:

到这里我先总结下以上的分析,

实现“重叠种植”的突破口:

游戏中,想在已经种植过的地方再次种植植物的时候,是无法种植的。很明显,游戏自身的代码有自己的判断

a.如果要种植的地方已经有植物了,则无法种植,阳光值不减少

b.如果要种植的地方还没有植物,则可以种植,并且阳光值会减少

简单的流程图就是:

种植植物    允许种植    阳关值减少

反过来,我们只需在阳光值减少的地方(0041BA76)下断点,然后查看调用堆栈,得到在执行到“阳光值减少”代码时,游戏程序还调用到了哪些函数(如:是否已经种植植物了)

通过查看调用堆栈,我们能够得到游戏过程中“种植植物”的程序入口。

因为,在种植植物的时候,需要判断,当前位置是否已经有植物了,在汇编指令中就是通过跳转指令来实现的。

显然,当前位置有无植物,游戏的执行过程肯定不一样。

我们只需在种有植物和没有植物的地方分别进行跟踪,在每一处实现跳转的指令出做标记。

然后前后进行对比,就能得到“有种植植物则跳过”的代码指令,这就是关键所在。找到了该指令,我们只需无条件跳转(jmp)即可。

如下图所示,即是关键代码:

修改指令后:

至此,程序修改成功!

最后,将修改的代码复制到字节集。

原创文章

转载请注明出处:http://blog.csdn.net/php_fly/article/details/8913656

抱歉!评论已关闭.