视频教程的地址:植物大战僵尸辅助视频教程付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