12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
三国霸业 战车-珍宝-觉醒-攻城掠地SF-全新玩法 免费玩新区 攻城掠地私服 进入游戏
手游私服盒子 各类免费游戏 0.1折送海量资源 各类手游私服 进入游戏
皇家MU2 《奇迹 2:传奇》韩国网禅公司《奇迹》正统续作。 3D锁视角Mmrpg 暗黑3+传奇+流放之路+奇迹 进入游戏
查看: 421|回复: 0

植物大战僵尸一击必杀的实现

[复制链接]

303

主题

303

帖子

616

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
616
发表于 2020-5-11 16:41:13 | 显示全部楼层 |阅读模式
1.思路
实现对于僵尸一级必杀的话,那么我们可以通过僵尸的血量去寻找,每当一颗豌豆打到僵尸身上的时候,僵尸的血量肯定是在不断减少的,那么找到这个地方,应该就可以实现一击必杀了吧。2.寻找
上CE,找!当僵尸出现的时候,先搜索未知值,然后每当一个豌豆打在僵尸身上的时候搜索,减少的值,然后没打的时候搜索未变动的值,通过这样不断的搜索筛选,找到了这样一个地址,可以看到每当一个豌豆打在僵尸身上的时候,这个值都在减少,修改此值为0后,僵尸立马死去,说明这个地址存储的就是僵尸的血量。


通过这个地址,右键,find out what accesses this address,可以看到这几处地方,我们重点关注一下比较的地方,把地址记下来。


上OD,寻找刚才CE中看到的CMP的地方。下一个断点,发现在豌豆还未打到僵尸身上就断了下来(主要看的是54D525处的比较,因为这里和0做比较,猜测是检测僵尸血量是否为0,为0为死亡),看一下这里是僵尸血量和0作比较,我们修改条件,让JG不要跳转。


修改过后发现僵尸立马死掉,直接出了动画效果。说明这里就是判断僵尸血量的地方。


3.新的问题
修改此处的跳转就可以实现僵尸的一击必杀了,但是出现了新的问题,就是当出现路障僵尸的时候,并不会秒杀它,这是为什么呢?


那么应该是路障僵尸的血量并不在这里进行判断,我们执行出去,在外面给这个函数下个断,当植物攻击路障僵尸都不会断下来,路障僵尸的血量的判断都不在这个函数中。


我们在函数头部下断,当攻击路障僵尸的时候断了下来,顺序执行,这部分只有四个CALL,发现两个个call不会执行,会跳过去,只会执行下面的两个call,最后一个call里面是我们实现击杀普通僵尸的地方。继续单步执行,发现54D60F处的跳转会跳过最后一个call,所以我们刚才的修改无法实现击杀路障僵尸。


继续动态调试,发现当路障僵尸头上的路障被打掉的时候,程序断在了最后一个call的地方,之后路障僵尸直接死了。正常打路障僵尸应该是先把头上的路障打掉,然后他变成一个普通僵尸继续打,然后僵尸被打死。猜测一下,我们的僵尸其实是由两部分组成,僵尸本体,和护甲,像路障僵尸,铁桶僵尸这种,都是普通的僵尸不过加上了护甲而已,54D608的call应该是判断僵尸护甲值的,当护甲减到0,被打掉后,jle不再跳转,才开始调用54D613处的call,计算僵尸血量值。无护甲的僵尸只是血量的不同,比如小鬼僵尸,跳跳僵尸这些,但是应该都是要调用54D613的call的,我自己测试了一些,可以自己去动态调试验证。


我们可以通过CE来验证一下我们的猜测,打路障僵尸,然后通过CE寻找一下路障僵尸的血量。还是先搜索未知值,然后通过不断的搜索减少的值和未变动的值。最终确定下来一个地址。


我们尝试修改值为0,发现僵尸并没有死,但是他头上的路障不见了。


右键find out what accesses this address之后,记下这几个地址,换OD


在OD中找到地址,下断,回到游戏里当攻击到路障的僵尸的时候程序断了下来。


执行出去发现就是我们刚才说的那个call,这验证了我们的猜测。


我们大致看一下刚才下断那里,当前ebp+0xD0存的就是僵尸的护甲值,通过赋值到ecx中经过一些计算,计算伤害,然后再重写进地址中,最后54CDF4处test ecx,ecx(上一条语句,ecx的值是存储护甲这个地址赋值的)比较判断是否为0,来看一下护甲值是否为0,来决定一个返回值,这个返回值出去决定是否跳过下面的那个call,也就是僵尸本身血量的那个call,到这里流程基本就清楚了,修改也比较好改了。


4.一击必杀
这里可以有两种修改方式第一,修改那个函数里面对于护甲值得判断,也就是先实现一击必打破护甲,再像刚才那样修改本体的血量的判断,实现对于本体的一击必杀。但是这样对于带护甲的僵尸来说,不是一击必杀,需要两击,所以这不行。


第二,完美的一击必杀,第一必须要像刚才的那样,把僵尸的血量那里修改了,这样只针对无护甲僵尸,然后对于有护甲的僵尸,可以直接修改外面的判断条件,把这里直接nop掉,因为不管你护甲多高,最终都是要进入下面这个call的,只要你本体死亡,那就是死亡。这样对于任何僵尸都是一击必杀。


5.效果
直接把植物种在前面,反正僵尸永远过不来。


巨人僵尸也是一下秒杀


可以下断看看,发现会直接断在刚才分析的那个非护甲僵尸的call那里(OD中写的是普通其实不太严格,应该写非护甲僵尸的),可以进去看看僵尸血量地址里的值,会发现只不过是值比较大,因为巨人僵尸血比较厚。这验证了我们刚才的猜测。


来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-11-25 10:09 , Processed in 0.062500 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表