00:00
呃,我们今天来修改一下,呃,植物大战僵尸这个呃,植物的攻击速度。嗯,然后的话就是修改植物的攻击速度的话,我们可以通过这个定时器啊进行一个突破。定时器作为这个切入点。啊也没什么,嗯,你可以想一下就是,嗯,写这个游戏的话,肯定是以这个面向对象自己,那他肯定是有这个植物类啊,抽象出来一个植物类嘛。然后的话就是像我们这些,呃,向日葵还有这个豌豆。他都是继承于我们那个植物类的。啊,继承于这个植物类。那支撑这个植物类里头会有什么,那肯定就是有我们的一些阳光这个价格啊价格,还有这个就是我们的一个像素点啊,XY的一个像素点,空刀之类的,还有就是一些冷却啊,这些是他们共有的,那当当然的话,那植物类里的话,他也会有一些就是共有的一些属性啊,共有的属性就比如说这个定时器。
01:09
啊,就是呃,攻击速度,还有一些定时器,那这个定时器的话,昨天我们找到的是这个太阳掉落对吧?啊,就是向日葵啊,生产阳光的速度。那么它这个植物类里的话,肯定会有一些就是更新定时器的一些函数啊,就是比如说这个阿波啊泰这个函数对吧?啊去修改,随时去更改这个定时器。啊,这个定时器的一个数值进行一个减减,那么我们就可以通过先找到,因为你想去修改植物的攻击速度,那你肯定就是要修改这些攻击类的一些东西,就比如说这个豌豆啊,或者说这个西瓜对吧。但是你去找这些呃类的一个植物的话,你找找他们的一个攻击速度,你是比较麻烦的,因为你他这个攻击速度特别快,对吧,隔两三秒的话,它这个就开始第二轮的一个攻击了,所以说的话,通过蜥蜴去搜索这个内存的话啊,去找这个豌豆或者是什么西瓜之类的就比较难找,但是我们。
02:16
把这个思路理清,理清楚之后的话,我们就应该知道向日葵生产光向日葵,嗯,去生产阳光。啊,他这个动画效果是很慢的对吧。这个动画效果很慢,那么我们就可以通过什么,呃,向日葵生产阳光的这个速度,然然后呢,找到呃,我们的一个更改定时器这么个方法,因为它继承下来的话,它肯定会有这个啊修改定时器,那么你找到向日葵,你是不是就相当于能找到这个植物类啊,换句话说的话,你找到植物类的话,那是不是,嗯,你这个豌豆和西瓜这个定时器你都能找到啊,因为他们都是继承于植物类,对吧。所以说我们先通过第一步啊找到。
03:04
找到,呃,向日葵生产。啊,阳光的定时器。之后呢啊,以这个逆向的一个角度,我们就能找到什么啊,豌豆的一个定时器。底逆向的角度。找到呃豌豆的定时器,这个思路应该能听懂啊,就是以新人家面向对象的一个思想,因为什么?呃,他做游戏开发的话,必然会抽象出一个植物类,植物类的话肯定会有个定时器对吧?呃进行进行一个减简操作,然后呢,这个位置的话,可能是我们都应该学过这个逆向对吧?啊1CX应该是我们那个对向地址的,通过您传递不同的一个对象,然后呢,它这个定时器减减的一个呃位置。剪的它的,呃,剪的也是它的这个不同的一个植物的一个定制器,那么这样的话,我们就能什么呃,找到这个什么呃,豌豆或者是斜化的一个植物类的一个定时器。
04:04
嗯,那之后的话,我们的第一步嘛,先找到这个向日葵生产阳光的定时器,然后把这个游戏打开。嗯,然后你随便去这个百度下个蜥蜴。嗯,然后我们去附加一下游戏。我找一下啊,这是游戏。啊,附加一下。嗯,为了方便我们做这个测试代码,我先把那个阳光的数量多改点啊。啊,先把那个阳光数量多改点。啊,稍等一下啊,我先把那个阳光的数量啊,先多改一些。
05:00
然后25是吧。啊,给它改为9999,然后够了够了之后的话,就是我们现在应该是怎么找这个向日葵的,生产阳光一个定时器,那写定时器这个代码的话,肯定就是呃Y有循环嘛。啊或啊,先写个这个变量啊word,然后呢,按time对吧,比如说刚开始给他一个750。然后呢,一个循环。啊,这个是一个死循环,然后呢,这个定时器啊,每循环一次,它会进行一个减减操作,那如果这个定时器。嗯,他这个n time小于零的。小于零的对吧,然后我再把那个定时器重新复制给为一个七百五啊。他应该是这么个逻辑对吧,但是他这个750,他肯定这个七百五是我随便写的,所以说他最开始这个定时器的一个时间值我是不知道的,所以说嗯,我先第一步的话是嗯,先得扫描,然后呢,找到这个嗯。
06:07
啊,新的扫描,然后嗯,四字节,然后呢,选上这个位置位位置的一个初始值啊,就是我们不知道这个数值是多少啊,然后我们首次扫描,然后这个开始对吧?这个向日葵动了一下,然后呢,那他这个数值的话进循环了对吧?那肯定这个数值的话肯定是或者减减啊对吧,应该是减减操作或者是加加操作对吧?那我们先开始收减减啊,它这个数值肯定是一个嗯,减少的数值,然后再次扫描。回到游戏对吧,然后它又变了啊,再次扫描啊,减少了数值,再回游寄啊,他这个枪子会又动了啊,减少了数值啊,再回游寄啊。减少了数值之后的话,我现在是没回到游戏对吧,我还没返回到这个游戏,那现在他这个数值应该是未变动呢,然后搜索一下没变动啊,回到游戏啊,他把这个阳光生产出来了,对吧。
07:01
生产出来之后的话,那这个值的话肯定是大于零的,对吧,因为它被重新赋值了,因为这个阳光生产出来之后的话。对吧,那它这个位置n time应该是被重新赋值,被重新赋值的话,那这个值肯定是嗯,大于零。啊,比什么什么大啊,我肯定是比零大,然后呢,再次扫描。返回,然后他这个被重新复制之后,它这个值肯定是又进行一个减减了,对吧,然后呃,减少的数值。啊,减少的数值。啊,减少的数值啊,剩30多个了,对吧,剩30多个之后的话,你像这些值的话特别大,那肯定不像定值器对吧,最可能像的应该是这两个数据,我们看一下。那应该是这个对吧,我们给它改为一个一试一下。喂,不是是吗?
08:01
看一下啊。不是他,然后看看他呢。那把这个值改为一看一下。啊,也也也不是是吧,然后那我看一下还有没有别的啊。那我这个应该是搜错了一轮是吧。这好像没有没有太像的了啊。啊,减少的数值呢。看一下这个啊,这这个也不像,那我这个应该是哪一轮啊,应该是点错了,然后我们重新来一下啊。啊,现在扫描,然后呢,位置的数值手指扫描啊,放一个这个先把它炸一下。重一下对吧,啊维持的一个初始值。然后数值减少了对吧,啊减少了数值。
09:06
动了对吧,减少的数值。又动了啊,减少的数值。啊,又动了,减少了数值。啊,又动了对吧,减少了数值208个啊,看一下这个186像不像。啊,给它改为E先试一下。诶,那就是这个对吧。也就是这个值,然后呢,我给它改为一个一,那量大,然后就可以看到对吧,这个阳光它就一直出来了,那我们这个阳光的一个定时器的一个地址就找到了,那找到阳光定时器的一个位置之后,我们就可以去。找到。N汤姆的一个地址。N time的地址,那你这个定时器这个地址的这个值肯定是来源于一个对象对吧?加上一个偏移量,为什么是一个对象下偏移量,因为刚才说了对吧,它应该是一个向日葵点点定时器的一个位置对吧?或者是一个对象。
10:15
啊,对象点啊定时器。等于一个等于什么什么位置,对吧,我们先找到他这个对象这个位置,所以说我们要找找一下是谁去改写的这个定时器的一个地址,然后那么来。那你就可以看到对吧,这个值它一直在循环啊,去修改这个定时器的一个地址。啊,也就是这个位置。啊,他一直在访问对吧,也是一直在加一个负一,那加负一的话,是不是就相当于一个简简的一个操作,那我们就可以把这个条地址给他拿出来,拿出来之后的话,我们这个呃,蜥蜴应该是暂时没用了。然后我们换上我们那个叉叉二叠bug。啊,去副驾。
11:02
然后过来。然后你就可以看到对吧,在这个位置是一个什么向日葵定时器的一个操作。然后他去加负一,然后我们看看什么地方可以,呃,五把父子啊啊五五把负子,然后我们看一下往下找一找。呃,ED加500赋值。也就是在这个位置对吧,在这个位置啊,重新给呃定时器赋值,那也就是说我把这个EXAX这个值改为零的话,他这个向日葵就会一直去生产这个阳光对吧,那我们就可以去写一下这个代码。但是你可以注意注意一下啊,你不能直接写这种木指令,木EX的一个指令,因为它进条代码的话,一个字节码啊,ADD这条指令它是0376对吧,你得找。找出这两个字节码能给ex赋赋值的一个指令,那比如说呃,易货这个指令。
12:06
你可以看一下,他正好是两两个字节对吧。然后我们看一下。啊,等这个向日葵去生产那个阳光啊。稍等一下啊。啊,等那个向日葵去生产阳光。然后你就可以看到对吧,那这个就证明我们写的没错,然后我们就恢复,但这个不是我们这节课讲的对吧,我们这节课要找的是一个什么豌豆射手的一个攻击速度。嗯,然后的话我就可以把,呃,这个向日葵。我们得回到这个位置,回到这个位置的话,我现在相当于找到了什么位置,是不是找到了我的。最开始。呃,第一步的这个位置,我们现在是找到了他。找到了他。
13:06
找到了这个位置,那我就得,我就得什么,我刚才说了啊,我们可以通过这个什么向日葵定位到这个豌豆的这个位置,那我就可以什么。呃,回到。这个位置下顿点。返回游戏,然后呢,我们把这个位置改成地址类型,然后呢异地加屋嘛。那这个位置对吧,定时器还有这个应该是。二二两千五就是定时器的一个最大最大数值对吧,2500,然后呢,这个位置应该是当前的一个数值。然后我把这个放过去,放过去之后,诶,我把这个盾点删掉。然后我把什么啊,这个豌豆给他。向日葵去掉,去掉之后改成这个豌豆。然后你可以看到对吧,这个位置是不是就就进行一个重新那个初始化了,那我就可以什么在这个位置下一个断点啊,进行一个呃。
14:02
硬件的写物断点,看看谁去改了一个豌豆的一个什么,呃,定时器操作。然后我们现在就找到了,呃,豌豆的这个位置,然后呢,第三步下斜过断点。嗯,看看谁去修改了豌豆的。定时器操作。啊,返回。啊,这个运行啊,运行的话,它断到了这个位置,对吧,那你可以看一下这个位置是不是也是。啊,进行一个什么拌斗。啊,射手。呃,减减讨论。那这个位置的话,我是不是就可以去修改它这个豌豆射手的一个间隔了,然后我们把这个断点给它删掉。啊,回来啊回来在这下蹲点。断下来之后,他现在是一个负一对吧,每次都是减减一个操作啊,每次都是减一个操作,那我就可以什么,嗯,让他每次啊。
15:09
减减三对吧,让他把这个间隔变快点啊,减三,然后我们返回游戏。啊,运行。啊,断电删掉。运行啊返回,然后你去看一下它这个色素的话是变快了对吧。你可以看一下它是不是这个射度,射速的话比平常变快了,虚度啊,但是它还没有就是完全的快,那你就可以把这个间隔给它改为负五,你再看一下。这概为负五。改为负五的话,你再回来你就发现他这个豌豆射手,你可以看到不攻击了。这个现象又说明什么?我们找错了啊,也不能说是找错了,它这个游戏的一个设计的话,你就可以看一下我们现在找到的一个定时器是什么,定时器是一个动画效果的一个定时器。
16:04
也就是说你可以看到他这个嘴一直在抽搐,对吧,你可以我们回来这个游戏。然后断点声调。他这个嘴一直在在抽搐,变得很快,但是他不去射子弹了,那就说明什么,他这个子弹也是一个对象。他这个游戏的一个设计的话,它是一个子弹,也是抽象出来的一个对象,可能啊子弹对象。在这个子段对象里的话,肯定会有一个什么啊定时器啊,然后呢,呃呃每次呃射出的数量。啊,会有,应该也会有这些什么,X和Y的一个坐标值对吧,然后像我们的一个伴奏。子弹。啊,可能也继承于这个子弹对枪的吧。
17:00
你像西瓜啊西瓜。啊,子弹啊,也是继承于子弹对象,然后我们刚才找到的是什么位置,我们找到的其实是一个游戏的一个循环。呃,先是什么定时器,呃,计算呃,豌豆。动图,那这个动画效果啊,然后呢,调用什么发射子弹函数。然后上一层应该还会有,就是呃,豌豆啊,子弹的定时器。呃,这个判断之类的。他应该是这么个逻辑,所以说我们早我们修改了这个什么动动画效果啊,动画效果这个位置。没有用。因为他什么。它还有这个,它这个子弹自身的一个定时器判断对吧,它没有用,所以说你可以看到这个位置,它这个动画效果一直在有,但是呢,这个定时器啊,它没有啊,就是因为这么个原因,所以说我们就得去找到它这个子弹发射子弹的一个函数,那就得通过这个子弹对象对吧。
18:12
那我们就可以什么,呃,恢复一下。那这个子弹这个对象这个操作的话,应该就是怎么去找。你就可以想一下了,发射子弹这个函数的话是不是,呃,我们先不用去蜥蜴去搜这个,呃,子弹的什么X,这个Y的一个变化对吧,你可以定,呃思路也比较多,可以去吸啊,搜索子弹XY的变化啊,就能定位到这个子弹的一个函数,对吧?但是我们现在都跟到了啊,定时器判断那个位置,也就是说它在代码下面必然就会有这个发射子弹那个函数,能理解吧。因为我们现在是找到了什么啊,豌豆子弹的一个定时器判断,你如果继续往下执行这个代码,这个流程的话,它肯定会有发射子弹这么个函数。所以说我们现在找到了这个位置的话,我们继续往下去跟踪代码啊,在这个位置啊,继续。
19:07
去跟踪代码,它这个以下的一些代码的话,肯定就会有这个定时器的,呃呃,子弹这个操作,所以说我们就看一下它这个流程啊,我们先看一下这个流程。那你就可以看一下呗,他这段代码的话,我们就很熟悉了啊,它是取出来,呃,这个时间对吧,看看这个时间等不等于这个零啊,如果等啊,如果小于零,它就跳转跳走跳走,它就这么个执行流程对吧,那我们就看一下。呃,下断点。然后F码。啊,这个是跳转成成功对吧,跳转成功它就会执行这个位置啊,跳转成功啊执行流程。什么F8跟踪啊,这个靠我没执行对吧。啊,这这几这两个看有没有执行对吧,这个。
20:02
跳转成功啊,记录一下打个一啊就呃或者是JCC啊,一就代表成功的意思,然后F8,然后返回了对吧,返回了之后。他就没有任何操作了,那也就是说他这个跳转我们脚后键退回退回。退回,也就是说他这个呃,子弹发射这个函数的话,一定不是成功的一个流程,对吧,它肯定是在这个范围之内。肯定这个代码是在这个范围之内,所以说这个跳转的话,跳转不能让他成功。那我们就可以在这个位置下断点了,对吧,在这个位置下断点。在这个位置下端点我们F值去跟踪对吧,F对F8呀,啊这个靠执行了对吧,F8。嗯,没执行。没执行啊。啊,这个执行了对吧,也写个一,写了一个一之后,他一共执行了两个靠。
21:07
啊,执行了这两个靠,然后我减后键啊,这个靠的话传了两个参数对吧,然后我看看上个靠。三个号的话。上个靠就是这个靠的话,它一个参数都没传递对吧,它就执行了个这么个东西,那这个靠的话,你就大概的往里跟一下,你就这个就不像一个子弹发射的一个函数,对吧?因为你可以看一下这代码,它就很明显不像一个子弹发射的一个函数。然后外层还没有传递参数,你就就算你传递一个参数的话,如果帮你去写一个发射子弹的一个函数的话,你必然肯定传一个什么铺制一个子弹对象,然后铺是一个就是呃呃植物,对呃这个X或者是这个Y对吧。肯定是最少有三个参数,或者还有一些什么,呃,子弹的一个类型对吧。
22:01
肯定会执行这些东西啊,甚至呃,可能还会传递一个僵尸对象。对吧,他在这个子弹里头就会计算伤害啊,肯定是会传递一些参数的。所以说我们就可以去,呃,分析什么,我们的下面这个靠,然后我们在这个靠里啊,进行一个下断点。那我们先回到游戏看看什么样子呢,对吧,然后我们下段点。啊,回到游戏啊,断下来了,断下来之后的话,我们就继续F8跟踪啊。嗯,然后这种靠的话,你可以看到它这个里头,呃,还是很多调用啊,我们就注意一下它的个返回值,为什么要注意一下它的一个返回值,因为我们都知道函数的一个返回结果是放在这个ex寄存器当中,你可以看到它的下面这个的代码,它立马就test ex exx,然后呢,进行一个跳转,也就是说它判断了一个返回值。
23:03
所以说我们先关注一下它这个返回值F8 F8先不进这个靠跟踪,那不进靠跟踪的话,你可以看到它返回了一个什么,像不像一个对象的一个地址。你可以看到吗?像不像一个对象的地址,像像是,嗯,像是一个指针对吧,如果说它是一个对象地址的话,它应该会有一些虚函数之类的,然后我们看一下地址。啊,这好像不像虚函数对吧,不像虚函数表,那这个可能的话,这个可能是一个指针的指针,对吧,然后我们跟进一层。啊,跟进一层,来到第二层之后,我们再跟踪一层。看看这个是不是对象。然后你可以看到啊,这个就是不是就像函数地址了啊,004010,然后我们看一下地址对吧,你可以看一下,这就很像地址了,然后我们随便跳跳出来一条。啊,这是一个直接的是吧,这地址,然后我们看一下。
24:02
啊,你可以看到啊,这很明显像什么函数地址的对吧,那也就是说它这个返回的是什么。返回了一个对象地址,但是不知道呃是什么对象,那肯定就是像我们刚才说的,要不就是一个子弹对象,要不是就是一个僵尸对象对吧,那我们呃,不知道它是什么功能啊,我们就可以给这个靠给它弄掉啊,直接往那个函数进行一个返回。然后注释一下,返回了一个对象。然后呢,我们把这个套啊,看看怎么给它进行一个返回啊。啊,他这个正常的话,一个流程应该是什么啊,如果这个对对象不等于空,它继续往下执行对吗。对象不等于空。啊,继续往下执行。那我现在的话指望它一直等于空对吧,等于空的话,你可以看到啊把这个异货对吧?Al,然后呢八,那我就可以直接什么进行个八操作,看看他返回的到底是什么对象。
25:01
诶,然后你看一下现在我这个效果是什么,子弹不发射了,对吧,那这个子弹不发射了,你可以看一下。那子弹不发射的话,它无非两种情况,一个是他没获取到这个,呃,一个是。一个是没获取到子弹对象,那还有一种情况呢,可能是什么?呃,判断啊,前方啊,是否有僵尸对吧啊。有两种这个结果对吧,但是这个我们就可以继续往下跟踪了,我们先记录一下。因为这个靠我们给他弄破掉之后的话,他这个子弹不发射了,那第一种情况就是说他没有获取到这个子弹对象,那第二种的话就是说他判断了前方是否有有僵尸,如果没有僵尸的话,那你这个子弹就没有必要去发射啊,他就这么个啊两种情况对吧,那我们就可以继续往下跟踪对吧,看看这个对象不等于空的一个情况。啊,我们看一下这个对象不等于空。然后他继续往下执行了,对吧。
26:01
然后我们F码。啊F8啊,看看对象不等于空,他会做什么操作啊,执行什么靠。啊,进行了一个跳转对吧,跳过了两个靠,那记录一下跳过了啊两两个靠。F码继续。啊,就执行了一个套一个套。然后这个也执行了一个,这个跳转也执行了很大啊,这个也是个大跳转,大跳转。然后我们记录一下啊,看看这个跳转。跳过了几个看哦。一个炕。打。三号嗯,这个跳转执行的也那啥靠也比较多,然后我们再跟踪一下啊返回。
27:00
然后对象不等于空,然后F8。啊,Z跳转ZZ。啊,跳转跳过了两个号啊,这个是这俩,然后往下翻。然后看一下。执行一靠两靠,然后。跳转成立,然后返回,那我们这个关键。关键点的话,应该是在这几个跳转当中,对吧。嗯,在这几个跳转当中,那这个跳转这个是给这些靠存跳过去的,然后我们看一下啊。嗯。我们先把这些僵尸整死啊。啊,我们先把这些将纸整纸。然后我现就留一个伴奏啊,要不就影响我们那个断点,这个对象太多,然后我们重新下段。
28:07
我们看看我们那个关键点是在哪,到底是在这个位置,还是在我们那个下面那个位置,我们要找到这个子弹发射的位置,对吧,然后这个也给他取消了,好让他来。断下。F8,走。多跟记一遍啊,我们把这个流程给他记录一下。啊,跳过两个炕。那这个两个号,那这两个号可能是一个关键对吧,然后我看看这里面都做了什么。啊,如果不知道的话啊,我们就可以直接委吧,然后我们现在再跟你一下。执这个执行了。但是这个靠的话,他没有传递什么参数,对吧,有点不像,然后我们在这个靠也执行了。执行了,然后。记录一下。
29:00
然后跳转跳走。跳走之后。就结束了是吧,那我们这个关键的话,应该是这两个靠。我们看一下这两个号啊,都有什么用啊,这个跳转的话,子弹发射他这个号就已经结束了,所以说下面这些代码的话,应该没什么用,他的关键这两个点的话应该是,嗯,刚才打一这几个位置对吧。打一这几个位置,然后我们减后键回来,嗯,然后我们先看第一个靠,第一个靠的话不知道他做什么对吧?啊喊住头直接给他返回。女生吧。然后看看回到游戏有什么影响,然后这个看看啊,这个四是吧,啊四函数直接返回暴力修改,那我们看看有什么影响。然后好像没啥影响是吧,哎。我看啊。
30:00
然后你们可以看一下啊,他这个影响的是什么。你可以看到他这个影响的是什么位置,他他这个影响的好像是。这个动画的一个效果是吧,那这两个靠的话,我们应该大概能猜测出来啊。这两个看。然后我们记录一下,嗯,影响呢。是动画效果。那这个位置呢,可能也影响的是动画效果。然后我们看一下。你可以看到啊,他这个确实影响的是一个动画效果,然后有时候的话,它这个是一个漂浮的一个状态,对吧。那我们现在找到的就是找到的这些位置的话,就根本就没有说我们的一个,呃,子弹发射套对吧。然后他这些子弹还都能发射出来,那也就是说什么他这个子弹。
31:02
不在这个位置。就说明我这个,我这个思路应该是又断了,但是的话也不能说算是断了。呃,那我们就可以回到什么位置,继续回到这个位置。那我就可以先把这个给它拷贝出来。那拷贝出来之后的话,我们现在找到的这个位置的话啊,一直跟踪跟踪到了什么,呃,动画效果啊,影响的都是一些动画效果,然后我们就可以观看他这个附近的一个周围代码,观看一下他这个附近的周围代码。然后把这些先给他回复回复一下。恢复一下。然后把这些,嗯。嗯。动画效果变的都给他改一下。然后我们回到这个代码之后,我们注意一下啊,它这个附近有很多判断。
32:01
为什么会有很多判断呢?它这个产生动画效果之后,之前或者是之后,你是不是应该写逻辑的话,应该去判断一下呀,啊判断一下就是你的植物类型。需不需要判断一下植物类型啊,因为什么啊,因为你要判断什么,你这个植物类型等不等于什么啊豌豆,然后呢,植物类型等不等于什么。啊,西瓜。啊,植物类型等不等于。嗯,还有什么什么,还有什么向日葵。对吧,你应该去先判断一下植物类型,然后呢,重新给什么,嗯,某个地方对吧,就某个区域赋值给什么一,然后呢。如果是西瓜的,你给它复制为二,如果什么嗯类类型的向右葵的话,你给它复制为三之后呢,发生一些动画效果,然后在某个地方,在这个子弹对象里,对吧,或者应该是在一个什么子弹对象里。
33:08
嗯,会有一个函数。检查。检查我这个定时器,嗯,应该是攻击速度定时器是否到底。啊,或者是不在这个子弹对象里,可能是在一个某个函数吧,就写个啊,就写个fun nc吧,某个函数里啊,子弹是否到底,如果子弹到底。那我是不是就可以执行我刚才说的这些东西啊,发射子弹的这些函数,这个可以理解吧。那我们就可以去看一下我们刚才呃,周围的这个附近代码有没有去判断一些什么各种判断,那我现在就看到了三个Z判断对吧?判断这个exx是否等于1C啊,判断ex是否等于三四啊,判断exx等不等于二八。
34:05
那他在他这个二尔法判断完之后的话,它会进行一些赋值,对吧,那看看啊,这有一次赋值对吧,Esi加九零,我们我们还得找一些什么关于啊对象的一些判断,对吧?对象之类的一个赋值,你像esi或者是什么EDI,一般都是作为一个结构体的一个基地值,对吧,加上一个偏移量啊,偏移量啊进行一个赋值,因为呃,像这些定时器对象的定时器这些东西的话,它都应该属于一个对象,所以说啊,它肯定是这种结构。啊,赋值给什么问号,问号对吧,那我们就看一下判断的旁边对吧。像我现在这个位置啊,这一跳转属于什么判断的一个附近啊,就像我现在找到了判断的附近,那判断的附近的话,这个问号等于一对吧,那应该是什么类型啊,是应该这种类型的吧,判断一个之后啊,等于一个。Esi加问号,问号等于一。
35:01
Esi加问号,问号等于二。我现在找到了这个Z的这些位置,找到了各种判断的位置,对吧,它跳转之后,我们看看有没有负值的位置,那我现在看到了一处负值对吗?这个,那这个就是什么。Esi加九,零。啊,给了一个六四对吧,那这个一处负值,那我看看跳转。这个这个跳转啊,这个判断三四这个跳转如果等于三四,它往下直行直行直行的话,它是不是这处又有一处什么负值对吧?那这处的话也是什么esi加九零等于1A对吧?那大概能推测出来ES加九零的位置应该也是一个定时器。啊,这种思路能理解吧。褪色出来。Esi加九,零。可能也是定时器。
36:04
这种思路应该能理解吧?如果能理解的话,那我们就可以看看一下这个esi到底是不是定时器,那这个判断的话应该很多了吧,就是esi加九零这个东西的话,它应该有很多位置都会用,因为什么?因为你这个植物有很多种类型,那你就可以把这个什么代码啊往下继续拉一拉,对吧,EI加九零高亮起来。17对吧,这也有一处。继续往下找七八对吧,这也有移速。继续往下找三二也有一束对吧,那基本可以确定出来了,一三加九零,你看1D19。啊,EP。可以看出来吧,要EX24对吧,那在这处的话,是不是就可以大概推测出来,你往上找对吧,这还有二三对吧。那这个函数里这还有要A大概能推测,推测出来什么。
37:01
Esi加九零应该是个定时器,那到底是不是你就可以什么啊断下来。嗯,我们先断下来。刚才正常流程的话,我们先搁这,让他先断一下。回到游戏里,断下来,F8运行。EI加九零的吗。Esi加九零,我们看一下啊,继续往下走。23那这个位置。然后我们看一下啊,下次下次来的时候他动不动。用F你们可以看到吗?它这个位置瞬间就变零了,对吧。然后我们看一下啊。看一下它动不动。然后来到esi这个位置,赋值给二,三。Esi加九,零。啊,负值给二三,然后运行过去回到游戏瞬间就变零了,那这个位置的话像不像定时器啊啊,有点像是吧,那具体是不是啊啊,我们就可以在下断点。
38:10
嗯,在这个位置下个断点吧,下个起步断点。嗯,Esi加九零。断点,我们看看什么地方去写入了它。然后先把这行执行完,执行完看看什么地方去修改的它给它变成为零的位置,对吧?呃,硬件端点斜步四个字节。啊,过去运行。回到游戏断下来了,对吧。这一说。Ex修改了定时器,然后你再往上看一看这个位置。Ex减减对吧,像不像定时器减减的那个操作。找到这个位置之后,然后我们把这个断点给它删掉。
39:05
啊,断点删掉。删掉了之后的话,我们就可以看一下九零的位置啊,被赋值,都被赋值,为什么数据对吧,因为我们刚才看到啊,它有很多类型对吧?很多类型的话,那你这个豌豆射手的一个间隔的话,可能是五秒,然后你这个西瓜的一个间隔的话,可能是七秒,然后向日葵的话,可能时间更长点,可能是500秒,对吧?啊不一定,然后我们就看一下啊,九零被赋值。都被修改成什么样呢,对吧。然后我们往下找啊,你就算没找到这个修改的地方,我们看一下它这个判断条件对吧,这处判断九零是否等于零。啊,打一个位置啊,判断是否为零。然后我们继续往下找啊,九零的位置。那这个位置看一下九零判断幺二。
40:03
判断二,三,判断三,三判断是四。然后嘛,还有看看还有没有。好像没有了是吧。啊九零,然后我们看一下啊,啊,这次还判断了88是吧。那这个判断的话还有点儿多呢。然后继续判断,然后我们看一下啊九零。然后呢,这还位置还有判断的一个歧义。啊,这处判断是否为零。然后我们继续找。嗯,他这个位置有点多是吧。然后这个位置还判断幺三。然后这个位置。还判断等于等是否等于一是吧?那这个位置有点多啊,然后我们用这个二分查找法啊,去判断一下,然后我们先看一下它不等于零的一个情况啊。
41:03
然后我们看一下它不等于零,它的一个流程F8。啊,游戏这个函数就直接结束了,对吧,然后他这个子弹也没发射出来,所以说判断为零这处的话,我们可以直接给他删掉呢,然后这个位置啊判断。啊,不能往返跳转。不能往那跳转,因为跳转的话,他这个就直接函数结束了啊,跳转函数结束。跳转函数结束了,然后诶。然后我们看一下继续往下找。那我们继续往下走啊,等于九零的位置是吧。然后这处我们看一下打个断点。啊,这处的话,他压根就不断是吧,这处这下面的话不断,那不断的话就是应该是说明我们那个植物类型它是不对的啊,他就不走这这处跳转。
42:00
啊,然后看一下这个幺三,这个位置幺三的话。啊,幺闪的话,他好像也不断对吧,他这个呃,攻击攻击一直在攻击对吧,幺闪的处他也不断。啊,不断。然后继续往下找,然后有一处唯一的位置,对吧。然后判断它等不等于一是吧,如果不等于一啊,它进行一个跳转,然后它跳到上面,然后它不等于一,然后我们看一下。啊,这处断了对吧,然后但是的话他往上跳。函数结束了,所以说我这个断点应该下在这个下面啊。应该下在这个下面,而不是下在这个位置。啊,如果他不,如果他就诶。九零我应该下在这个下面,然后我们看一下。啊,然后这个位置是呃,等于一那个情况啊,就是不等于零的情况。
43:03
不等于零情况。然后我们。F8跳转。然后跳这处跳转。跳转成立,然后F8。然后就是你得判断。然后执行概函数。啊C啊E打个直行,然后函数返回。那诶,然后你就可以看到啊,我这个。哦,我这个刚才一运行,你可以看到他这个豌豆立马就吐出子弹了,对吧。也就是说啊,等等于乙的时候,它就会吐出子弹。等于乙的时候,它就会出突出子弹,那这个靠的话可能是这个号。然后的话,我们看一下到底是不是这个,靠,我们是会在这个位置下段啊,然后把其他的断点全给他删掉。
44:01
因为函数结束了对吧,然后运行起来啊,他这个什么,他这个呃,子弹就吐出来了,你可以看到这个游戏里啊,它吐出来了,那很有可能就是刚才我们那个位置,然后脚后键。我们在这个下一个论点。啊断立马就断下来了是吧,然后我把F8运行啊过来,然后我们可以看到它这个子弹立马就出来了,那就说明什么,这个位置就是我们的一个子弹发射。那我就应该怎么,这个代码应该怎么改,我应该是回到。呃,回到让它等于乙的一个位置对吧。然后讲键退回。那也就是说我得往我这个EDI加九零的位置一直让它等于一是吧。然后我看看他这个流程啊。呃,让他等一直等于乙。EDI加九零赋值,这个位置是给它赋值的,对吧,Ex开始赋值的。
45:06
那我这个代码我看看啊,嗯,这个位置。复被复制完之后,然后这个位置简简。他应该是,那我应该在这个位,我那我就可以在这个改啊这个位这行代码,你看我把这个代这段代码给它拷贝出来。拷贝出来,拷贝出来的话解释一下啊,他这行代码把这个什么时间取出来。时间取出来,然后判断是否小于对吧,然后进行一个呃,时间减一。坚毅减去减减。那我就可以把这行代码给他,直接什么木1X等于二对吧。然后时间减减,那建行代码的话就变成了ex,等于最后呢,把这个ex送回给。
46:00
一点加九零的位置,那我这个代码这么改就可以了,那我就把。这端代码给它弄掉。然后呢,木ex等于二。然后我看看回到游戏。诶,然后异常了是吧。那我这个得先让我这个OD搁这个代码位置断下来啊,那这个代码异常了,然后我重新运行一下。因为为什么会异常,因为就是我没有在呃,他这个位置断下来的时候修改,我直接修改的话,它造成异常很正常。嗯,然后。嗯,我得先,我得种几个植物啊。
47:01
然后我现在的话。我先稍等一下啊,我这个攒点钱。然后回到这个代码这个位置。I was'。他这个代码怎么位置还变了呢,我看一下啊。我看一下他这个代码位置怎么还都变了呢,我看一下。我看我这个注释啊,我操原我这个注释。啊,定时器,诶。呃,定时器。我看一下啊,我重新找一下,刚才那个位置有点找不到了,嗯。刚才复制出来那有。看下啊。嗯。
48:03
应该是在这个附近是吧。影响的是动画效果,然后呃,注释。嗯。等于一,它就会突出子弹四六你看啊。啊,我拷贝出来的是我这个修改完的他这个,所以他这个会则会乱,然后找一下。在这个位置是吧,这个是它的正常位置,因为我刚才是复制出来已经修修改完的代码应该是,然后我看一下,嗯。我再攒点钱去修改一下他这个结果。然后等待僵尸的出现啊。然后僵尸出来了是吧,然后把这个。断下来。啊,再加上天板断下来。啊,种一下。然后把这个代码。我看一下这几行给他弄不掉。
49:02
然后改为木ex逗号二。然后L8运行。然后ex现在等于多少,等于一个一是吧。好,把这个exe复制给定时器里,然后我们看一下。然后你可以看到吗。这个攻击速度不就改了吗?然后有问题吗。
我来说两句