植物大战僵尸-微秒僵尸

相信大家已经很期待了,也可能有人学会了前两篇所讲的内容,自己也已经实现了,那么成功的可以看看我的办法,失败的或没理解的也不要气馁,认真努力学习,你一定会成功!

好的,我们开始!

首先打开“植物大战僵尸”,进入游戏,接下来鼠标右键“以管理员身份”打开“CE”并如图所示:

点击左上角的“小电脑”图标

先选择上方的“应用程序”→选择“植物大战僵尸中文版”→“调试器附加到进程”

我们选择“扫描类型”的“未知的初始量”

回到游戏,,让“僵尸”受到伤害

然后,我们先选择“扫描类型”然后选择“减少的数值”搜索“再次扫描”

之后我们发现搜索结果仍非常多,所以我们重复让“僵尸”受到伤害,我们接着重复“再次扫描”,直到结果很少时,我们发现疑似“僵尸”的血量,我们选择并鼠标右键点击“找出是什么改写了这个地址”

然后我们再次回到游戏,让“僵尸”受到一次伤害,之后我们返回“CE”选择并点击“显示反汇编程序”,记得记录地址“00531319”为了后面用OD修改保存,

我们先来下个断点(按F5)检测一下是否是僵尸的有关血量,果然,游戏卡了(断到了),因为每次攻击,游戏都会判断下是否能打死,

 

那么我们来分析一下此行是什么意思,“mov [ebp+000000C8],edi”将“edi”的数值转移到“[ebp+000000C8]”中,那么为什么要将“edi”的数值转移到这里呢?

我们不妨假设一下,“[ebp+000000C8]”就是“僵尸”的血,那么”edi”也就是“僵尸”血的另一个代表(意思就是“edi”控制着我们猜想的“僵尸”的血量),那么我们看看“edi”都做了什么,向上查看有关“edi”的代码,

我们发现了“sub edi,[esp+20]”这是个减法运算,”sub”是汇编里面的减法运算,这里的意思是,”edi=edi-[esp+20]”,这里我们发现控制僵尸的血量的代表正在自我减少,

我们若让它减少至0,会不会直接秒了僵尸?那么我们来试一试。

双击我们修改,将”[esp+20]”修改为“edi”意思是让它自己减去自己,就是等于0了,

修改完之后,我们来切换到游戏界面实验一下,忘了,刚刚的断点忘记关了,大家要记得关了,并且点击“运行”,

成功了,僵尸的确秒了,我们的猜想也成立了,

正在高兴的玩着时,出现了“戴帽子的僵尸”我们发现这个类型的“僵尸”无法被秒,那么这是一个问题,

我们继续观察这个类型的“僵尸”发现它只要帽子一掉,就直接被秒了,说明这个帽子类似于“护盾”“盾”被打完了,然后又变成普通的“僵尸”之后就会被秒,

那么,我们只有找到这个“护盾”的血量在哪,或谁改变了它,我们开始等待下一个“戴帽子的僵尸”我们使用CE进行扫描,

那个“内存查看器”可以关闭了,我们点击CE的“新的扫描”

我们选择“扫描类型”里的“未知的初始量”,切换游戏,等待“戴帽子的僵尸”出现,然后点击“首次扫描”

然后我们再次切换到游戏,等待“植物”攻击“僵尸”之后,我们切换到CE,选择“扫描类型”的“减少的数值”然后点击“再次扫描”

之后我们继续切换游戏,让“植物”攻击“僵尸”然后再次切换CE,“扫描类型:减少的数值”→“再次扫描”

直到我们扫描的结果足以让我们大概确定哪个是我们要找的数值,然后我们鼠标右键“找出是什么改写了这个地址”

然后切换游戏,让“植物”再次攻击“僵尸”然后,我们的“记录操作码”的窗口就会有数据,我们先记录地址“0053104D”然后我们点击“显示反汇编程序”

我们发现和我们刚刚修改的“普通僵尸”的血量代码基本相似,那么我们依旧可以理解“mov [ebp+000000D0],ecx”“[ebp+000000D0]”代表着“僵尸”的血量,“ecx”是可以改变“僵尸”的血量的代表,

将“sub ecx,eax”中的“eax”修改为“ecx”,让之后赋给“僵尸血量”的“ecx”为0

之后,我们切换至游戏中,观察“戴帽子的僵尸”是否会被秒杀,我们发现了,“植物”的一次攻击直接把“僵尸”的“帽子”打掉了,但不会死,之后再补一发攻击才可以秒掉

那么上述这种秒杀,其实不是我理想中的样子,那么,我们要想达到直接秒杀这种情况,我们就需要思考一下了,“僵尸”0血时,肯定执行了什么,让“僵尸”停下来并消失,

那么,我们随着我们的猜想,我们沿着“僵尸”0血时,都会执行哪些语句,会经历什么跳转,会不会经历几个事件,我们开始随着“僵尸”0血之后开始“单单步过”(单单步过的意思是我们不进入程序的call事件函数子程序等,一步一步的执行后面的每条语句),

Emmm…时隔了一星期,我居然忘了,怎么去写了,先给大家公布下修改什么吧(辛亏当时修改时存了截图)

来,打开OD,将游戏“附加”上,然后“Ctrl+G”搜索我们第一次记录的地址“00531319”

第一次搜索,可能会搜索不到,我们多次搜索,搜索到如下图的界面:

然后我们修改如图圈的这行,将“dword ptr ss:[esp+0x20]”修改为“edi”让“僵尸”血的一个代表减为0,之后,这样就实现了“普通僵尸”的秒杀

那么我们接下来修改“戴帽子的僵尸(或者说是具有护盾的僵尸)”,我们来“Ctrl+G”搜索我们之前用CE记录的第二次地址“0053104D”,

我们修改此行“sub ecx,eax”修改“eax”为“ecx”意思是让“帽子(护盾)”的数值减为0,

这样就实现了秒杀“帽子(护盾)”

之后我忘了如何去直接秒杀“僵尸”了,不过有记录,

然后我们在下面看看有没有什么判断之类的,我们发现了“je short PlantsVs.0053105E”我们先下断点,然后等待植物攻击“戴帽子的僵尸”然后断下了,之后我们发现原来“je short PlantsVs.0053105E”的跳转并没有实现,然后变为了跳转已实现,那么我们就可以大概猜想下,我们是修改了“帽子(护盾)”的血为0,然后跳转就实现了并且跳转到如图第一个“Call”下方,那么说明这里的第一个“Call”就是用来检测并计算和显示“帽子“护盾””的血和“帽子(护盾)”血量减少时的图像变化,

大胆的猜想,第一个“Call”是用来管理“帽子(护盾)”的血,那么如果你是开发此游戏的人,你是不是先写先判断“僵尸的帽子(护盾)”是否消失,然后接下来就是来判断“僵尸”的血量计算?我们不妨猜想下面第二个“Call”就是用来监控计算“僵尸本体”的血量及“僵尸”血量减少时的动画图像,那么它与“帽子(护盾)”的写法基本相似,我们要想“僵尸”直接死亡,我们就不让这个“Call”判断浪费时间了,我们直接帮它一把,直接让跳转实现,所以我们将“jnz short PlantsVs.00531079”修改为“jmp short PlantsVs.00531079”“jmp”在汇编里的意思是 无条件跳转

之后我们回到游戏,继续游戏,我们发现,“戴帽子(护盾)的僵尸”并没有直接秒杀,说明,我们之前的猜想出现错误了,Emmm…由于我忘记了,所以直接告诉大家修改哪些部分吧,

 

“Ctrl+G”搜索“0053186D”然后直接鼠标右键“NOP”掉,就实现了秒杀“僵尸”

最终效果图:

下一集“植物超级攻速”:临时截图,仅供欣赏

但修改时意外发现了:快速落“太阳”:

“植物”持续攻击:

持续攻击修改地址:“0045EF2C”

本文作者为:晗雅|星空,转载请注明!版权必究!
分享到:

请选择你看完该文章的感受:

8瞧一瞧 1扯淡 1学到了 0不懂 5正能量 1无聊

评论抢沙发

评论前必须登录!