郁金香游戏辅助教程笔记(二)
P114:125-穿墙功能分析-关键代码 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们接着上一节课的代码,来继续分析一下有关穿墙的这部分功能,那么上一节课呢我们讲到的是呃,我们已经分析到了一个比较关键的位置啊,也就是这个地方我们把它复制过来。
这是我们分析到的啊,那那么第二个地方呢,我们是从呃需要从这几个地方来分析入手,也就是对我们这个1680c坐标的一个访问的啊,那么我们理论上来说的话啊,他要修改这个坐标的话,就是在移动我们的人物的位置。
那么要移动这个位置呢,它在前边呢就有一个判断,那么两点之间要移动到的目的地地址与我们的当前当前地址呢,这个坐标地址时间呢,它是否是畅通的,中间有没有障碍啊,它要进行一个实施的一个判断。
那么我们再来看一下,用c来我们来说明一下这个原理,嗯168c5 ,那么我们打开122相关的代码,对了,我们之前有保存一个相关的这个坐标,嗯,那么也这就是我们当前的这个坐标,那么我们的这个原理的话。
也就是说他会什么呢,那如果是这前边有这个障碍的话,那么他就不会去改变这个坐标,那么如果你看没有障碍了,这几点呢它都会去改变啊,那么当前面哈这个时候我们注意一下175。
那么这个时候我们鼠标这个时候实际上已经点击了这个地方了,但是但是这里的话他没有任何的反应啊,他不会去修改这几个坐标,那么我们点点击,如果是点击在后边的话,他就会去修改这几个坐标。
那么说明在这几个地址的前边的话,应当是有呃相关的课来进行实事的判断,判断两点两点之间呢是否有这个障碍,那么我们现在就需要找到这个扣,或者是他有可能是扩,也有可能是相关的一个代码的一个判断。
那么判断之后呢,我们就要找到这个关键的这个位置,那么或者是修改这个判断的一个结果,或者是修改这个关键的跳转的这个地方,让他要达到我们人物移动的这个目的。
那么首先呢我们用我们的电量附加到游戏里边。
那么我们先把之前的这个人进行一下处理,呃,之前是这个位置已经有一个函数的判断了,那么因为我们发现了修改这个位置的话。
并不能够实现我们相关的嗯,这个穿墙的功能说明他判断的这个地方的话应当不止一处好,那么这个的话我们已经解决了啊,他返回的这个地方,这是第一个,障碍20多啊,有障碍应当是一,应该是一个非零啊。
大于零不是伤害大于零,大于零,啊,好那么我们接着来分析第二个啊,从这个地址转到这个地址去看一下它的一个跳转的一个来源,那么这里呢应当就是我们的移动人物,修改当前坐标,那么我们先分析一下,嗯。
那么也就是说我们看一下,从这里的话能够看到一个跳转,那么这里一个跳转的话,但是呢如果不跳转的话,也没有影响,那么关键的是这里啊他会来什么呢,从上面的分析来看的话,那么从这一句来跳转的话。
如果是这里跳转了,那么我们的人物呢就不会移动,就不会移动,那么也就是说呃这一句判断非常的重要,他是这里判断一si等于二,那么这个e si不等于二的话,不能够等于二,等于二的话。
那么呢我们的人物呢就不会移动了啊,也就是说我们的这个e si的数值的话相当的关键,它是用来判断有障碍或者是无障碍的,可能是这样一个数字,那么e si来应该是一个关键数值啊,来决定它是否是否移动啊。
因为如果这个e s i等于二的话,那么这里呢跳转了就不会实现,那么就会执行到这里,那么呢就会跳过这个人物的移动啊,就跳到后面去了,这段代码呢根本就不会执行,那么只有了这个e s a不等于二的时候呢。
那么呢它才会来进行跳转,跳转到这里来执行,那么还有一种情况,那么也就是e si等于3=3的时候呢,它也会跳过,那么也不能够等于三,那么也不能够等于二啊,我们看一下成片e s i2 ,不能等于三。
也不能等于二,那么也就是说不能等于三,不能等于二,那么前面呢我们看一下,那么甚至的话这个e来不不能为零,那么也也就是说这个ei的数据化不能稳定,还有呢不能为二,不能为三。
这几个数字它可能呢都是一种状态啊,分别表示的可能是不同的这个障碍,那么我们再往前面走一下,那么这里有一个跳转,那么也就是说执行到这段代码的话,有两种可能,一种可能呢是从这个库执行之后呢。
呃在执行的这段代码,另一种可能呢是从这两个地方来跳过来的,那么我们来看,如果不是跳转的情况呢,就是调用的这个过来执行,那么这个过来最终它的返回值给了e s i,那么这就是一个关键的一个括号卡路,嗯嗯。
看看能不错的,那么如果是没有障碍的话,他这个数字呢肯定不能够等于23,那么可能这个数字是为一,也可能是四五这一类的,反正不是不等于零,我1232023这几个数字不能够出现在他的这个库里面。
那么我们在这个地方呢下一个断点,看它有没有经过这里,那么我们发现这个地方调不会断下来啊,那么说明它的这个来源的话,不是从这里的顺序执行下来的,而是呢这个跳转这里跳转下来的,那么我们先转到第一个jp这里。
那么第一个奖品的话,我们看一下一这个e si,它是对es si的这个数值来进行判断的,那么我们就要找这个es si的一个来源,看什么地方对于这个es i进行了协助,那么我们发现呢是在这个地方。
而这个ex呢它来源于这个扩,那么这个扩的话我们发现了与这个扩呢是同一个扩,那么所以说这里的话应当啊,应该还是可能是我们的战略判断库,因为是同一个空嘛,那么在这里面添加上相应的这个注释。
那么我们在这个地方呢,下一个断点,啊这个时候会断一下,我们上来的时候会断一下,那么看有障碍的时候哈,点障碍这个所在的地址,那么有障碍的时候,好像它不会断下,嗯有时候呢好像也会断下,他要有一个转身的时候。
好像才会断,那么我们看一下它的返回值,那么这个时候的话他可能是没有状态哈,呃它不会跳转,因为这个时候返回的值呢是一啊是一,它就不会跳转了,那么这个移动的这个过来的移动人物的这段数据呢。
我们看它就会不会执行,那么我们来看一下这个库有没有呢,不等于一的情况,那么我们在这里呢下一个条件的断点,不等于一的情况啊,我们看会不会有,那么这个时候呢ex呢等于零啊,我们刚才说的它不能够等于023啊。
这几个数字都不能等,那么这个时候的话,移动的这个过来就不会被执行了,这里呢我们就怎么来就跳过了,跳过了这个关键的这个数据啊,它不等于二,也不等于三啊,应该是不等于二,不等于三,但是呢它等于零。
只要是023这几个当中的一个了,他都不会来移动我们的人物坐标,那么所以说呢我们要现在要想办法做测试呢,就是要想办法让这个call哈,在之前的这个括它的返回值要让它为一。
那么这个呢我们可以说呢呃就是一个关键的点,这个扩啊,呃要让他这返回30=1啊,那么可能达到,但好像强度呢,好的,那么我们进去看一下,那么这个函数的参数的话好像还比较多,那么我们先看一下它的参数,这些。
嗯参数的话123467个啊,这个不少,那我们转到第一个数据窗口看一下,这里是两个坐标,那么可能是计算这个点击与点二之间,它们是否有这个相应的啊障碍,看是否有障碍,而且我们发现的话。
以及形成中间这个坐标是相同的点点进行,反正他就是前面这一部分我们看都是相同的,说明他们移动的距离的话应该是比较小啊,比较小的,那么我们再来看第二个,那么这里呢也是一个坐标啊,那么这里的话好像是一个坐标。
也是一些坐标的一些序列啊,那么可能就是计算我们两个点之前是否有障碍的车型这样一些呃功能,那么我们我们跟进去看一下,按一下f7 ,看一下它是从什么地方返回的,ex的这个数值。
那么我们看最后它屏占的时候是平了多少,究竟的参数的个数有多少,当然为了不影响这个获得其他的功能,因为它设计的代码比较多,那么我们最好是在它尾部啊,在这个位置的时候呢,嗯来修改ex的一个数字,然后再返回。
但是它的数据呢又来源于这个库里面去了啊,那么我们再看一下这一段,最后来退出,那么我们看这个库它有几个参数,我跟进去看一下,啊啊啊,这话还是比较大好的,马上要到这个结束的地方了。
那么这里呢我们按一下f7 进去,看一下他最终的一个数值是从什么地方返回的,那么是从这个地方就返回了啊,我们看到好像它不影响ec x,它是只是做了一个比较,然后就返回了,好像ex的数值呢它也没有被改变啊。
再次我们再看一下e x等于零,那也是你的,e和e x等于e b p e x,那么这里呢他就执行了一句啊,一个比较,那么我们看这里是否是可以这样改,但是他这里也有一个跳转,麻烦的。
就是在这个地方它可能会跳到下边这个地方去执行,那么这个地方的话不是很好修改的,那么我们先可以这样啊,因为可以先在这个函数的后边来进行一个修改嗯,修改这个e si的这个数字。
那么我们把这个mo 1 i等于这样的修改,但是这样占的字节比较多,我们可以这样来修改一下mode s,也占的比较多哈,啊这个si的话好像他没有这个sl,没有这一问,只有一个a的话,这位有,下。
那么我们再看一下该怎么修改呢,当然还有一个直接的地方呢,也就是我们在第一次比较这个e i的,我们看一下有对这个e s i进行比较的地方呢,我们都对它进行相应的修改,那么从这里呢呃跳转跳转到这里来。
那么这个时候呢他对我们的呃e4 x来进行了一个呃一活的一个处理,与零进行一个比较,那么我们在这里呢我们可能可以跟他做一些手脚好,那么我们让它不跳转,那么也就是说我们把这一段语气来给它更改掉。
那么我们就可以这里呢如嗯你这边喜爱,对一,这样的话设计的也比较多,或者这里我们就直接给他改道哈,直接就跳转到这里来执行,相比,341286,再看一下这样好的,那么我们这样修改之后,再看一下。
这样的话就能够达到一个穿墙的一个功能了,但是最好我们还是能够修改那个函数的一个返回值啊,这个时候呢也可以任意的穿墙嗯,去我们想要的这个地方,好的,那么这节课的分析的话,我们就到这里了。
那么当时我们发现的话,从刚才那个地方修改的话,我们这里寻路的话,好像它又有问题啊,那么从这个地方直接跳转过来,那么因为还有有二和三的这种情况,那么我们看一下有没有jsi不等于一和零的情况。
在这里我们下一个条件段,但是他也没有执行到这两个啊,那刚才的这个修改为什么会有这个相应的,那么我们还有一种情况呢是转到这前边来进行一个,再分析一下它还有没有更好的一个地方进行一个修改,1s2 啊。
判断啊,这个是修改人物移动,关键的这个空,接成,嗯,那么它一般是等于一啊,只要我们不让它等于一就行了,那么应当是在这个地方哈,它等于一的话,那么这里的比较的话它就不为零,不等于面积再看一下。
那么应当是可以修改这个地方哈,如果这个e s i它返回值为零的话,呃,表示了有这个障碍,要让它的返回值等于一,那么它等于这里呢我们可以来把它改为打lop掉啊,一直不让他跳跳啊,因为他有障碍的时候。
我们比呢会进行一个跳跳,那么我们要这一句的话,应该也可以实现这个完美的一个这个地方,这个时候我们寻路就可以用了,那么这里也可以进行一个穿墙的一个操作,当然我们最好的这个方法呢。
我还是建议啊在这里边来修改这个嗯,可以尝试修改这个ex的一个返回值好。
那么我们在做测试,那么这个时候呢有障碍啊,不能够跳转,那么我们可以修改这个库。
对调整它的地方也比较多,那么我们提到它的五一步,好像是应应当是这个位置,在走路试一下,应该是这个位置,那么这里的话,因为我们可不可以直接的啊-1 x啊,一来试一下,好。
那这样的话它也能够完美地进行穿墙以及这个行动,好的,那么这样的话我们的穿墙功能呢嗯就实现了,那么我们就作为这个地方修改,one two one two three,好我们把它复制,好的。
那么这节课呢我们就到这里,下节课我们再见,车车车,那么这两个的话是一个地方不放第一个,那么第二个呢是在这里。
那么还有一些关键的代码,我们都把它发出来,啊,好的,那么这节课的分析就到这里。
P115:126-CPU优化降低游戏CPU占用率 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们一起来看一下哈,游戏当中cpu的这个优化,也就是降低我们游戏对cpu的一个占用率啊,那么呢主要的话游戏值对我们的cpu,占用比较高的,一般是由于这个游戏画面啊。
画质这方面的话,他对于cpu这方面的占用相对的多一些哈,那么呢它会有一些就是呃定时器,或者是有一个单独的一个线程,它可能呢来不断的更新我们游戏的画面,那么我们如果能够找到这些相关的数据呢。
那么我们就可以达到一个呃,cpu优化的一个作用,当然还有一种比较,通用的一种做法啊,呃比较通用的做法呢,我们就是强制的让这个游戏的主线程呢,呃进行一个啊定时的啊,进行一个呃休眠的一个状态啊。
也就是说就像我们工作一样,那么工作了啊,几秒钟的时候,我们让它休息一两秒钟的时间啊,那么这样呢也可以减少我们cpu的一个占用,那么我们先来看一下比较通用的这种做法,那么这种的话在去找个教程里面呢。
我们也有用过啊,那么我们再再次来看一下,那么我们直接来用代码来实现哈。
做一个试炼,打开120克的代码,那么打开之后呢,我们切换到我们的这个资源窗口,那么添加两个测试的按钮,那么实际上呢我们也就是用一个定时器啊,不断的呃,就是说呃挂接在我们的主线程上啊,然后呢。
让他进入一个就定时的,来让它休息一会儿啊,那么这样的话,我们也能够在一定程度的来减少,我们的这个游戏的cpu占用时间,那么我们现在看一下它的占用时间的话,大概是30%到40%左右啊,的这样一个时间啊。
cpu占用率占用啊,这个时间片的话,那么我们可以来在这里呢,在我们的主线程上哈设计一个定时器,啧啧,那么呢第一个传进来的是我们游戏的窗口,句柄,那么第二个呢是这个它的一个i p。
那么这里呢我们设置1000,那么后边的话这里是它的一个呃毫秒数,那么这个呢我们可以尽量的设置小一点,那么后边的话,这里呢是一个窗口的一个回调函数,那么这里呢。
我们需要给它设置一个回调函数,那么回调函数的格式呢,我们可以参考相应的呃m sdn,或者是百度上找一下,那么复制一下哈,不调函数的格式。
那么在这里呢我们让它休息一会儿上,就可以用这个sleep了,来阻塞它哈,让他休息啊,达到我们减少cpu占用的一个效果,当然这个数值呢不能够设得过大哈,这个数值呢尽量设置小一点呃,也不能够过小啊。
大概经测试的话,大概是十左右的话比较好吧,这个数值,然后呢在后边的话啊,这里呢就把我们的窗口的回调函数了啊,传进来就可以了,好的,那么我们先编译生成一下。
啊因因为当时他的这个回调函数。
这里的,好,那么另外一个按钮呢,我们用来呃关掉这个定时器,那么第一个呢也是我们游戏的窗口句柄,那么第二个呢是我们的这个呃d,那么这个i d呢,最好我们把它定义成一个红,三二,那么这这样的话。
增加一个我们代码的一个考阅读性,好的,那么我们来看一下具体的一个效果,那么好我们看一下现在的一个占占有率,那么现在这个游戏的呃。
cpu占有率的话是35%,到40%左右,那么我们点一下哈优化,那么我们再来看一下cpu的占占有率的话,大概在10%左右啊,10%以下哈,那么这样的话就大大的减少了我们cpu,而且我们这个时候的话。
还不影响我们游戏的一些操作,这个都没有影响啊,那么我们甚至呢当然我们一旦取消之后啊,那么这里的话占有率的话,他一下子就高上来了,就高上来了,那么这个数值呢,我们还可以呢适当的调大啊。
但是呢一般不超过15,那么如果再继,续的,当然这个数字过大之后的话啊,他可能就会呃产生黑屏啊这一类的,那我们再来看一下,那么这个时候的话,我们的这个速度的话就会稍微的慢一点啊。
这个时候的话也是效果也是差不多哈,也是10%以下,那么我们可以调整的这个参数呢,可以是这个数值啊,这个数字呢我们把它调大之后,比如说我们调为100啊,那么这个呢我们可以设为一个进度条,来调整1~100。
那么是100的话,可能效果就不是很明显,那么也就是说100ms的时间呢,那么我们再让我们的cpu来休息一段时间,那么在这个时候的话,他这个cpu占有率的话下降的呢就比较少啊,就比较少。
大概只下降了5%左右,那么我们再试一下其他的数值,那么这个时候呢是28%,大概是下降了10%左右,那么所以说这这个数字的话,我们可以作为一个呃参数的一个接口,来提供给,就是说这个玩家来进行。
或者是设置成一个进度条啊,来设置这个数字啊,最后呢我们就可以达到一个cpu的优化了啊,那么这个很简单啊,这种当然这种的呃,这种方式呢它的效果的话也是普普通通啊,不是最好的,那么最好的效果的话。
肯定是要结合我们后面的方法二,和我们的这个方法三来实现,那么我们在这里呢也顺便说一下,这个方法二和,方法三的一个呃原理,因为我们的这个游戏的话,它也有一些消息的一些处理啊,那么消息的一个处理的话。
它在一个循环里面,那么首先呢它会从我们的消息队列里面,消息队列里面的啊取出这个消息啊,然后呢再进行相应的调理啊,分就是说分类的一个处理,把不同的消息来进行一个不同的一个处理,那么像我们这种的话呃。
它可能呢,也可能它也是用的一个定时器来进行,一个处理,定时器,那么w这个碳啊,消息呢它是1130x的113,那么它也可能是这一种,那么我们可以甚,至可以用我们的工具啊,spa加加来来看到。
那么我们来到游戏里面看一下,那么我们来看一下这些消息,那么我们可以发现的话,有很多很多的消息,那么他不断的在闪动的呢,一共有492268108,然后又是492268啊,1000这个是我们的啊,是啊。
我们设设置的这个是1000啊,那么1000这个的话我们是设置的50秒,他中间间隔了很长的一段啊,大概就是说其他这几个消息执行,补六次的话,呃,然后呢,我们的这个这个定时器来才执行一次,那么极有可能的话。
它就是我们的这个游戏的相,相对于这个绘图的这个功能的话,就是在这几个哈回调函数里面的话,它占用的cpu占用率比较高,那么我们就是说呢,可以来找到相关的数据哈,最好的我们可以来对这几个定时器呃。
的这个时间间隔来进行一个调整,那么我们可以看出的话,它的这个间隔比较短,那么我们最好是能够呃,获得他的这个id和这个回调函数之后呢,那么我们把它进行重新的设置功能呃,那么大家也可以下去试一下。
那么就是说调整一下,我们所看到的这几个定时器的,一个时间间隔啊,那么我们可以通过这种方式呢也能够啊,理论上也能,够起到一个这个cpu的优化,那么这个呢我们就作为这节课的作业哈,大家下去自己尝试一下。
那么下一节课呢我们一起再来研究一下呃,这三个定时器好的,那么这节课呢我们就先到这里。
P116:127-CPU优化降低游戏CPU占用率方法二 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们继续分析与cpu优化相关的数据,那么首先呢我们打开第126课的代码,当,那么首先呢我们,接着从上一节课的这个定时器的相关数据让我们进行分析。
那么这个时候呢我们有很多的这个定时器啊,有三个呃,它的id呢,当然每次启动之后呢,这个id呢是变化的,那么首先呢我们进行尝试啊,这三个定时器我们看呃把它重新进行这个设置。
那么或者是呢我们把这里的三个定时器呢把它关掉啊,关掉之后呢,我们看一下呃,它是不是与我们的这个游戏的画面啊有一些关系,那么我们可以来嗯在它的资源按钮上添加一个测试按钮,当然你可以用上面节课的这个代码。
那么在这里呢我们可以呢呃用ctime,那么这里呢我们把它改一下,那么这里呢我们就把这记录下来的,一个是2946102094,还有一个是610,那么另外还有一个定时器呢是364啊。
那么我们先关掉两个看一下,那么我们看一下这个我们看一下cpu的占用率的话,这个时候呢并没有啊,而且我们在游戏画面呢也没有受到影响,那么我们继续看一下,清空一下,再看一下消息记录。
那么这个时候定时器的话就只有一个了啊,那么这里呢也有一个回调函数啊,另外一个回调函数不断的在被执行,那么364这个呢我们也也添加代码来把它关掉,另外一个呢是364,那么再重新生成一下。
那么这个时候的话我们发现了我们的这个定时器的这个消息的话,呃已经没有了啊,这个pos体啊,呃系统发送的这个定时器的这个消息。
那么我们再来看一下游戏,它有没有相应的被影响到,那么这个时候的话我们发现了我们的cpu占用率啊,好像有我们的这个定时器的话,好像是没有关系的啊。
那么所以说的话我们不能够从这个呃定时器这里来来做一个入手点,那么我们需要了另外的呃分析,那么另外的分析的话,我们一般呢呃游戏在处理系统消息的时候呢,在这个循环里面呢一般会用到两个几个函数啊。
一个是gtmessage,另外一个呢是pk啊,message,那么这两个函数的话,它是用来从我们的消息队列里边呢,呃获取我们的这个消息,那么获取消息之后呢。
然后进行一些就是说啊派送到调用我们相应的这些回调函数啊,通过另外的两个函数呢来解释啊。
另外好像还有两个函数需求这个名字translate,有这么多事情,那么相关的还有几个函数啊,但是我记不太清楚。
还有这个post to sell message啊,这一类的,那么我们先通过这两个函数呢,下段啊通过我们的o d来附加一下。
看一下呃能不能够找到我们的这个消息循环,然后再通过我们的消息循环呢,看能不能找到一些关键的数据嗯,嗯。
好的,那么我们先对这个pgm s技能啊进行一个下段。
那么首先呢我们嗯这个他有个全局钩子。
我们需要把它去掉啊,不然有点卡。
然后在这个地方呢我们断一下,断一下之后,我们找一下它调用的一个来源嗯,在这个地方调用的,那么这里呢他对于这个消息呢有一些啊解释啊,然后呢呃这里呢它相当于是调用相相关的这个回调函数去调用。
那么这一片的话他就是对我们可能的话啊,从这里的话来看呢,它也是有一个循环很大的一个循环,那么像这种循环里面的话,它也有可能呢就就是对我们的这个图像的这些进行处理,那么我们可以从这个消息的头部呢。
我们下一个断点往下跟一下,那么有关图像的话,一般呢它会调用这个第当。
d9 的这个动态链接库里面相关的一些函数,那么我们从这里呢开始下段,然后呢我们把断点取消掉,往下执行,跟一下,那么注意这个寄存器和堆栈的一些变化数据,我们看有没有与我们绘制图形相关的一些数据。
那么执行到这个这个函数的时候的话,好像呢它在这里好像是主赛了哈,那么就,这个时候呢它就暂停了啊,那我们需要把它恢复一下啊,然后呢继续执行,那么从这个地方呢我们能够看到哈。
呃应当是一个我们界面绘制相关的一些地方啊,从这上面一句来这里啊,第三第九的与我们这个图形相关的啊,这一句应当是,那么我们再往后面啊继续执行一下,看还有哪些相关的数据,那么这又开始新一轮的一个循环。
那么这个时候好像是直接跳到了嗯,下一次的一个循环啊,直接就跳到尾部来了,那么我们按下回车之后来看一下这个大的跳转跳到什么地方去了,那么跳到尾部之后呢,他又进行下一次循环啊,那么这个是一个什么意思呢。
我们再来看一下,1a x那么我们看一下这个ex是一个什么数,是什么,那么现在的话看不出来啊,那么我们继续看一下,那么首先呢这里呢他从我们的消息队列里面取到数据,然后呢这里返回值是零,那么返回值是零的话。
也就是说我们的这个消息队列里边呢,他没有取得数据啊,嗯没有取到数据的话,可能呢就直接来会从呃直接来就进行下一次循环,那么我们来看一下,这个时候来这里有个计时器哈,用来计算一个时差的time。
get time,那么这种的话呃他个体碳呢一般是在我们绘制这个画面的时候呢,用来计算一个时差的啊,两个前面一个时间与现在的一个时间的一个时间差,那么这里呢它好像也是有一个时间差的一个判断。
他把这个以前的这个数值来加上64,然后呢与我们现在的这个数值来相比啊,那么如果呢这里呢嗯j n b好像是小鱼啊,小鱼的时候呢就跳到跳到下边来执行,那么也就是说它检查这个时间差的话,大概是100ms。
可能是100ms更新一次,可能是,那么我们再往下面啊,执行一下,跟进去看一下这里面,那么这里的话我们能够看到的话,应当是从我们的呃这个服务区呢,呃到这个缓冲区来读取我们的这个包啊。
因为服务器这边呢发送过来的一些数据,那么这个包的话它也可能呢设计我们再退回来啊,那么这里的话应当是嗯接收服务器数据,那么那么我们先让它跑起来,那么这里呢应当是接收了服务器的一个数据,那么接收数据之后。
我们看一下这个e d i它是调用了什么,那么这里呢也是一个计时啊,计时他把这个ex来存放到我们的这个变量里边,然后呢也也要进行一个什么判断啊,这一类的,判断是否大于零啊,这个gm s啊。
这这也是一个跳转,那么这里是服务器的数据的一个接收,那么我们继续往下看一下,这里呢我们把它记录下,咳咳咳,好的,那么我们再往下面看一下,那么这里呢也有三个空啊。
嗯好像这里感觉的话应当是一个什么登录的界面,什么什么的,那么感觉这个函数的话,从它的这些字串来看的话,好像也是与我们图形绘制相关的,get to take count,那么我们可以把这个扩了。
把它落不掉啊,看一下这里呢他也没有返回参数这几个空,那么我们直接来把它落不掉,看一下结果,那么这个时候的话我们发现了移动人物的时候呢,它移动不了了啊,那么这个库的话可能是与我们这个人物相关的。
那么后面这个括我们先进去看一下啊,它的一个返回是啊,也是没有参数的,那么这个我们就把它弄不掉,看一下有没有什么效果,那么这个时候呢我们人物呢它也不动了啊。
那么这个扩的后面这个扩的话可能是与我们人物相关的,那么我们嗯紫萝卜后面这个孔再来看一下,那么从这个处理来看的话,可能前面两个呢它是做一些数据的初始化。
那么这个课呢可能才是我们这个呃绘制我们人物相关的一个孔,那么我们第一个括先来看一下,这个货好像没有影响啊,看起来,那么我们再进去看一下这个库里边是什么,啊刚才已经进来看过了,我们是创建一些什么数据。
那么这里呢这三个扩的话,我们就是这个人物角色的动作,更新啊,暂时我们可以这样的理解,那么我们再从这个地方下个段,继续往下面跟,那么这里呢也有一个空进来看一下,那么这里呢它一共有三个参数。
那么我们再退回来,在这个地方我们嗯a d d先评上一usp等于c啊,也就是说相当于把这前面的这三个参数来出战嗯,这样的话能够形成一个堆栈的一个平衡,然后呢我们不调用这个库来看一下它的一个这个库的话。
看起来没有影响,目前对我们的这个界面,好这个没有影响的,那么我们把它撤销,然后呢继续往后边跟一下,主要我们注意一下相关的这个库,那么这里也有一个扣啊,也是我们这个呃d3 d9 相关的。
6182个d r20 条这样一个空,那么后边呢我们再看看这里呢也有一个空,是一个第三进球啊,618233889,那么这种错的话啊,一般呢就是与我们贴图相关的啊,也就是呃这个3d界面好相关的一些东西。
那么我们可以看到了,从这里的话e s i194 哈,那么我们看一下e s i的一个来源,那么这里的话看不到这个usi的一个来源,那么我们把这两个过来把它注销掉啊,那么注销的话我们也需要知道它的一个参数。
那么我们跟进去看一下还有多少参数啊,这里呢yc啊,它的这个参数呢,那么我们这里要评价的话,也就是a t p u s p e c,那么后面这里呢我们也需要评上。
因为如果我们前前面这一段我们这样处理之后的话,那么后面这里呢我们也不能够呃,因为这里有一行啊,那么我们只需要,这里我们加的话,我们会影响到后面这段指令,那么影响到后面这段指令的话。
这里呢我们也不能够调用,那么我们还有另外的一种做法,在这前面我们跟他屏障啊,直接从这个地方我们跳跳转到后面这个地址了,但是它这里也有一个跳转嗯,就因为它这里边也有两个谱写。
那么我们可以在这个位置来屏障a d t e s p,那么从这里评价的话,我们就应当是,计算一下,这个应该是101418,那么应该是a a d d e s p0 c啊,这样才对,而且在后面的这个数据的话。
我们需要lop掉,不然的话游戏会出错,那么这样呢才不会影响到我们下一个库的一个运行,结果还是出错了,好的,那么我们重新加载一下游戏,然后继续从我们刚才这个位置来啊来分析,先把它还原一下。
那么前面的还有我们的分析啊。
成果啊,这里,好的,那么我们再次来用我们的d来进行附加。
那么这次附加之后呢,我们就注意看一下刚才这些呃更新我们见面的这些函数呢,他是通过什么消息呃来完成的,也就是说他在获取这个消息队列的时候,究竟获取获取到了什么消息。
然后呢才会来执行我们的这个界面的一个更新的一个动作啊,当然我们还要接触呢,呃刚才的这个测试,那么我们需要把这两个库呢嗯进行注释掉,看一下有没有是不是我们界面相关的一些数值。
那么我们可以先把后面这个漏不掉,那么我们可以选中这里呢它只有一个参数,那么我们在这里来下个断点,然后呢再把这几行呢一起落不掉,用lop音乐来填充,填充一下,好的,那么我们先运行一下。
那么这个时候的话我们实际上啊看不出任何的一个效果,那么但是呢前面这里还有一个,那么这里的话我们弄不掉的话,这里需要屏障的话,就是本来是嗯ec那么e c的话,我们从这里评价的话,应该是这里少了一个幺零。
应当是零四,那么我们在这里呢下一个段啊应当是要评价是零碎,名字的话应该是这里有一个谱系,这里有一个谱系,这里还有一个谱系啊,这样来的,那么把这一段让我们解注释掉啊,但是刚才呢我们出错了啊。
不知道是什么原因,然后我们再分析一下。
好分析之后呢,从这个地方呢,我们在i t t l s p a c,然后再跑起来,那么这个时候的话,我们发现呢这个呢它也的确是与我们画面呢有一些关系啊,有一些关系与我们贴图是相关的啊。
至少那么这个时候呢整个游戏画面呢就花掉了就花掉了,但是呢这个我们发现了对我们cpu的占用率的话,它并没有下降多少啊,并没有下降多少,但是的话我们可以了,实际上我们可以在这个地方呢呃加上一个。
push and cosleep,这样的话cpu下降的话就会下降多一些,当然这个参数的话,我们还可以调大一些这个参数这里,那么我们可以了,比如说把它改为111,然后再cosleep。
让我们这个主线才能在绘制图形的同时呢,我们让它休息一会儿,那么这个时候我们看一下,那么cpu的占用率的话,实际上就很低了,但是这种占用率的话,它是在我们牺牲的这个画质的这个情况下啊。
那么这样的话肯定不是很呃不是很理想,那么我们还有另外的一种方式也可以,那么主要是我们在这里呢我们要分析一下它的一个,就是他是通过什么消息来处理的,来进行我们的这个呃画面的一个更新。
那么这个消息的话在最前面呢,我们这里嗯应该是注意前面啊,应该是这个地方,那么这里呢有个p嗯,p和message,然后呢他把他的这个取出来的这个消息的话,放到了这个bp减2394这个结构里边,嗯。
因为这个我们看一下pmc,那么这个pk message的话,它这里呢有一个结构啊,它会取出来作为一个输出啊,然后呢存在这样一个结构里面,它的第一项呢是我们的呃这个游戏窗口的句柄,第二个是一个消息的类型。
然后呢其他的几个附加的一些呃相关的参数。
那么我们来看一下,减2934这个地方,那么我们可以在这里来发现有一个九这一段参数呢,我们把它复制出来,然后我们再看一下当前的呃e i p啊,你就是当前的指令地址是在这个地方。
那么这是他执行的一个相关的一个消息呢,会执行到这里好的,那么我们可以撤销钓鱼。
然后让它跑起来,那么这是他执行的一个,这是我们的窗口区别,那么这个窗口句柄的话多半都是我们的游戏窗口的主窗口的一个区别,这是一个消息的一个类型,那么这个消息路线代表的是什么呢。
我们一起打开127克的代码来看一下。
啊这是126克的这个代码,那么我们再来看一下,那么我们转到我们的这个相关的这个消息里边去看一下啊,比如说我们的这个消息w这个log button这一类的啊,那么我们转到这个定义来看一下,往前面移动。
那么这里呢是123117,那么我们看一下113呢,我们在这里找到它它的这个消息类型的话,实际上还是定时器啊,还是一个定时器啊,其他地方呢它有有向这个地方呢发送这个定时器的一个消息啊。
嗯那么实际上它最终呢只是我们的这个spi加加呢。
他们又检测到我们的这个定时器,因为spy加加的话,它只能够检测到呃,这个post发送post message发送过来的这一位的这个消息,还有就是系统发送过来的啊,你部分消息他检测的这个消息的话不是很全。
刚才我们这些消息,那么我们再把这些定时器的消息再关掉,再试一下,那么我们看一下嗯,138350 300,然后383 300,那么我们看一下,关掉这些定时器之后,他还有没有这个消息。
嗯。
好的,重新进入游戏之后呢,我们再次把我们的这个i加加啊,我们查看一下我们的这个游戏,再来看一下相关的这个消息,然后这里呢我们再修改一下代码呃,5634971056,三四,760。
那我们再核对一下349710,那么我们再次注入我们的代码,那么还有一个701啊,这里还有一个701呢,呃没有被关掉电视器,那么这个时候的话我们来看的话,它相关的相关的这个定时器的这个消息呢就被消掉了。
已经没有了嗯。
那么我们再用我们的调试器啊,附加看一下它的它的这个游戏界面的一个更新,是在什么地方用到一个什么消息。
那么再转到我们刚才分析的一个地址,那么刚才这里的这个类型的话,是我们的这个定时器。
好的,那么我们解锁在这个地方下段来看一下,然后呢我们移到最前边,那么这里的一个pk message啊,我们再来看一下他所在的这个缓冲区,哈哈哈,那么这里的话同样的是113,那我们改一下它的一个数值。
看一下,然后呢我们再带到刚才的地址,再进行下道看一下,那么这个时候的话,同样的进行断下,下一次,那么发现的话,这个地方好像跟我们的这个消息的内心好像没有太大的关系,那么我们再进游戏看一下。
也能够正常的进行移动,啊当然这个时候的话再一次的变成了113,但是我们的定时器已经关掉了,但是呢可能还有其他的这个消息的一个来源,那么像这种情况的话,我们也可以做一个钩子啊,就类似的钩子。
那么只要只要有消息的时候,或者是呃那么我们就在这里边呢做一个判断啊,跟他做一个计时,每个多少时间呢,我们让它呃进行休息一段时间,那么这个呢我们可以用这个tgta计时。
也可以用这个get her count啊来进行一个计时的一个判断,当然这里的话最方便做后壳的话,可能就是这个循环的这个首付啊,因为他每次每刻都要经过这个地方,那么我们可以在这里呢来做相应的这个户口啊。
那么现在的话我们可以在这个地方来做贺卡,我们来看一下啊,首先呃它的流程是这样,那么呢首先他可能在这里的话判断这里有个零,那么这个零的话可能是用来判断这个缓冲区是否有这个数据呃,如果是缓冲区没有数据的话。
他就转到这个get message这里的,因为在这个gt message好像是主赛的啊,他会一直等到我们的这个消息对应的队列有消息存在,然后从里面取出这个消息。
而这个pk message呢它不管有没有消息呢,都会从我们的这个消息对点里面的呃,去这个消息出来啊,那么如果他取消息队列为空,没有消息的时候呢,它取出来他的一个返回值的话是零啊,那么我们再来看一下啊。
嗯它的一个流程呢,第一次他可能会执行这个pk message的pk pk message,如果他没有成功的取得消息呢,嗯那么这里呢他会做一个判断啊,那么为零的话它就跳到这个位置来执行,然后继续五零的话。
它就跳到最后啊,进行一个下一轮的一个循环,还有这两个函数呢,它是向我们指定的这个游戏窗口吧来的这个回调函数里面呢,呃进行相关的一些数据的一些处理,那么在他处理的主要是系统的这个消息。
那么所以说这这两个的话,我们可以把它弄不掉啊,这个地方,那么这个地方抹不掉之后呢,我们可以在这个地方来来做一个贺口啊,那么我们先把这一段啊嗯,用lop来填充哈,再进游戏看一下,对了这个时候最小化的话。
它也是属于我们的系统消息,如果这里呃把它落不掉之后呢。
呃游戏呢就不能够最小化了,那么我们需要先把它嗯。
先把这个游戏来显示出来之后呢,再进行这个相关的这个loop啊,这个时候呢我们可以进行啊,no它就没有问题了,但是,当然我们还需要做一些修改,可能,洛普之后我们再来看一下它的这个流程。
那我们把这个跳转呢也把它改一下,这个跳转呢我们也把它弄不掉,再试一下啊,那我们再来看一下,如果这里的话去,取得了之后啊,就会jump到这个地方来执行,那么如果这里我零,那为零的话,应该是没有取到这个呃。
没有取到消息,然后呢就跳过,那么我们要进行loop的话,应当怎么办呢,那么我们但是这个地方哈这个地方的话我们看一下呃,无论是有都是取到这个消息成功之后呢,才会进行这个判断啊。
这里get get message,取消息成功之后呢,会执行到这一句,如果是pcb设计了,他执行之后呢也会到这里去啊,嗯照到这一句之后呢,然后进行这个消息的判断啊,如果为零的话,会跳到这个地方来。
那么最后呢这个地方呢都会被执行,那么这个空啊,如果是被这个消息处理,被处理之后呢,它会跳到最后去啊,那么所以说我们把这个项目给他,先把它弄破掉,这样的话它就没有这个影响,没有相关的影响。
然后我们可以把这个时候呢可以再把这一段呢嗯弄不掉这个货的话,这一段我们落户掉,本来他就要跳到这个地方来执行啊,这段代码本来是要跳到这里来执行,那么我们把它中间的这一部分部分呢,漏不掉的话。
应该是没有关系的,那么这个时候我们看到没有关系,但是这个时候唯一的呢它不能够最小化了啊,就是也不能够移动窗口,他对这些消息呢没有响应的,因为我们刚才这两个函数呢被注释掉了。
那么关于我们最小化以及一些鼠标的一些消息的话,最大化最小化这些系统的这个消息的话,需要通过这两个函数来去解释哈执行,那么所以说我们把它弄不掉之后就没有了,然后呢我们再落不掉啊,这个奖配啊。
这个时候呢也是没有问题的啊,只是唯一的一个缺点,能不能够移动移动,然后我们看一下现在的cpu的占有率的话就要低上很多,啊35左右啊,然后呢我们再再到这个地方进行,让这个主线成本进行一个休息哈。
取消息成功之后的,我们让他休息一下,休息100ms左右,嗯然后呢cosleep,然后我们再来看一下这个时候cpu的占有率的话呃,就要低上很多啊,大概是这个进程的话大概是3~4之间啊,一那么最高呢再三啊。
那么这个时候的话就是比较理想的,那么而且这个时候的话,我们发现的话也不影响我们人物的移动,或者是打怪再打怪这一类的啊,都没有多大的这个影响,好的,那么在这样的处理的话,它应该是最省我们的这个cpu的啊。
这种方式,当然我们呢可以通过我们的这个代码来把这个呃,把这个hook来做得更完美一些,那么这样的话我们看一下,它大概是我们的cpu占用率的3%到4%左右啊,不到5%,那么这样的话理论的话能够实现。
那如果是内存足够大的话,可以开五六十个号都没有问题啊,这样的话当然内存的话一般不可能有这么大,那么我们下一节课呢再分析怎么把我们的这个hook来把它写好啊,像这样的一个hook的一个处理方式的话啊。
毕竟不是很完善啊,不是很完善,那么我们再来看一下他取得的这个消息的一个类型,再分析一下呃,这里取得的这个消息的话,放在这个bp减2934这个结构里面嗯,那么这里的话它有多种的这个消息。
只要取这个消息啊成功了,然后呢我们就就会到这里来执行,那么我们实际上应当对它进行一个过滤呃,有一些消息的话,我们应当是立即处理的,那么某一部分的这个消息呢,我们呃才是区别对待。
那么我们再次转到我们刚才这个图形处理这里来看一下啊。
第三第九这个地方,那么最后呢我们是在呃牺牲这个图图形这方面的都可以啊。
其他的呢我们消息呢马上进行处理,那么我们来看一下0f是什么呃,什么类型的,啊这个0f的话它也是这个界面绘制的啊,当然这个的话呃这个消息的话它也可以作为我们的嗯。
这个户口都是可以的,那么这里的话我们可以来加上一些消息的一些呃序列,哪些消息我们可以就是说哪一个范围,我们可以用来让我们的这个线线程呢啊进行这个休息,哪些消息呢要马上处理啊。
这个时候呢编程的时候可以具体的写在这个hook里边啊,进行一些过滤,好的,那么我们呃进行一个赏识啊,那么另外呢从这里的话来看,他就是一个消息的一个循环,那么我们可以对这个获得的这个消息来进行判断。
那么如果这个消息不是我们呃必须要处理的了,那么我们直接就跳到这个循环的头部呃,进行了下一次循环,你可以这样来处理,当然这个做最终怎么处理的话,需要多做啊,写代码进行测试啊,进行尝试。
那么大概大概的这个原理呢就是这样的,我们一个人可以通过这个sleep呃,那么另外呢我们也可以来呃,通过我们的这个和其他的计时的这个函数来进行一个判断,但是呢我们应当来说的话。
要把我们的这个县城里面的这个时间片啊,把它腾出来的话,最终呢都要用到这个sleep这个函数必须要用到,那么我们才最终能够把这个时间漂亮。
我就把它弹出来,好的,那么我们看一下,把这个代码恢复之后,cp多一个占用率啊,马马上这个占用率绿的话就上来了啊,就是40%左右,差不多我们经过优化之后呢,差不多只有以前的呃。
1/10左右的这个cpu的占用率,而且还不影响我们游戏的呃,这个正常的运行,还有这个挂机这一类的好,那么这节课呢我们就到这里,那么下一节课呢我们再来探讨一下怎么来写这个hook的这个代码。
怎么来进行完善。
那么我们下一节课再见。
P117:128-优化CPU代码设计 - 教到你会 - BV1DS4y1n7qF
大家好。
我是郁金香老师,那么这节课呢我们为我们的这个cpu u的一个优化来编写相应的代码,嗯,那么它的原理呢主要就是呃对我们的游戏的主线程呢进行一个贺口啊,嗯那么hook的位置的话。
理论上可以选择在我们整个这个主循环的任意位置啊,但是有一些位置呢它有一些判断可能被跳过了,那么我们选位置的时候呢,呃主要选他能够一直啊在整个循环的头部,那么比较好,那么因为这个循环的话。
它会一直的被执行到嗯,那么我建议的话是选前面哈这两个括号进行一个后口,那么我选择选择的这个贺卡的这个位置呢是第二个空啊,嗯那么选择这个位置之后呢,我们需要做的一些相关的一些准备哈。
第一个呢我们就是把这个地址呢呃提取出来,还有这个扩的地址呢,我们需要提取出来,因为这个地址呢我们首先要写入我们自己的扩的一个呃,函数的一个代码,然后跳转到我们的这个函数里面去。
把我们自己想要的功能完成之后呢,我们还需要还原它的数据啊,也就是要调用这个库啊,因为它的可能呢要处理一些数据或者是有返回值这一些的啊,我们需要把这个整个环境来给它恢复起来,好的。
那么我们先来看一下这个例子之后呢,我们再开始写我们的代码,那么我们看一下现在的一个cpu的一个占有率和游戏呃,现在大概是在30%到40%之间的一个c p u占用率啊,那么我们现在看一下我们的代码。
那么cpu优化的代码注入之后的一个情况,好那么我们点一下优化之后啊,嗯再来看一下进程的一个cpu的一个占有率呃。
大概在4%到6%之间啊,它这个数值那么很小,当然这个数值的话我们还可以进一步的优化,我们只要把相应的参数给它设设置大一点就可以了。
而且在这种情况下的话,呃对我们的游戏的话操作起来的话,感觉呢还没有啊,没有相应的这种就是说呃没有卡的这种情况还是相对的比较流畅,那么我们还可以来通过修改一些参数来实现呢,呃更强的一些优化啊。
那么比如说这个时间的间隔的话,我们可以给它改小一点啊,那么这样的一个优化的话,可能还要占用的cpu呃的这个这个占有率的话还可以下降一两个百分点,好的,那么我们再次来看一下。
那么现在的又下降了一个百分点的样子啊,刚才是最大的数值是6%,那么现在是啊也差不多啊,50块什么啊啊,当然这个参数的话,我们还可以尽量的给它设置小一些,而且这个数字呢我们可以给它设置大一点啊。
这个也就是我们主线程休息的这个时间,我们可以,那么主要就是这两个参数我们需要设置,到时候呢我们可以把它设置成一个进度条的一个形式,那么我们可以看到现在的cpu占有率的话会更低一些哈,嗯。
那么稳定在大概的话稳定在5%到4%的这个区间啊,现在在他,那么我们一直可以看到它的一个cpu的一个占有率好的,那么我们还是来看一下我们的代码怎么编写的,那么关掉之后呢。
我们把呃把第127课的代码复制一下。
那么首先呢我们要设计一个自己的一个函数啊,那么在设计自己这个函数的时候呢,我们首先呢嗯要把它用纯汇编来和书写,那么这两个人我们可以把相关的代码先注释掉啊,保存一下。
然后在这前面这个位置呢我们定义相关的这个变量,以及我们的这个游戏的相关的一个机制。
那么在这里呢我定义了四个变量啊,那么第一个这个变量的话,用来记录了我们上一次啊获得的一个系统时间,然后呢这个也就是我们的时间的一个间隔啊,检测的一个间隔啊,相当于我们的这个定时器啊的这个时间的一个间隔。
那么后面呢这个是我们每次哈判断到这个间隔之后啊,也就是说间隔了这个10ms的这个时间之后呢,那么我们主线成了一个休息的一个时间,让他腾出这个时间票,那么这个呢是用来hook的时候来保存它啊。
之前的这个相关的一个数据,好的,那么我们首先来看一下我们自己的合格代码应该怎么写,那么在这里呢,由于代码比较多哈,我就直接把它复制进去,我们来看一下这个代码的一个构成。
那么首先呢我们在这里呢也是调用一个相应的这个函数,嗯,这里呢我们调用的这个p commet,那么我们以这样的形式来写pk messaga啊,然后呢coex,那么用这种写法的话,可能考虑性会高一些。
那么用它的一个目的呢,我们是检测一下我们的这个缓冲区结构呢,是否有我们的这个相关的消息啊,有没有消息存在我们的这个消息的缓冲区,那么如果然后呢再做一个判断啊,这里呢也就是说不移除这个消息啊。
那么如果是移除的话,可能这个游戏可能会出相应的这个问题啊,然后呢我们在这里做一个判断啊,那么如果这里为零的话,也就是说啊缓冲区内嗯,消息队列一样不存在,那么不存在这个消息的时候呢。
我们就直接就跳出这个函数啊,就不执行,因为没有消息的时候,我们也用不着啊去执行啊,因为没有消息的话,我们直接跳出去就行了啊,只有有消息的这个情况呢,他才会去呃做更新我们游戏的画面呢,或者是做其他呃。
从服务器去读取我们的这个缓冲区数据这一类的,如果消息队列里面没有不存在消息的话,那么我们就不用做后面的这些相应的工作,那么如果有消息存在了,在这里呢我们跟他做了一个判断啊,113,这个我们知道是哪位啊。
定时器的,因为它有很多定时器啊,因为这个消息的种类比较多哈,那么我们这里呢就以这个定时器为例来给他做一个相应的判断啊,当然这一段的话呃不要也可以哈,可能嗯等会我们可以测试一下啊,当然这个呢我们可以呃。
或许前面的这两句呢都不要啊,呃也许也许的话也可以完成这个相同的这个功能啊,那么我们等会儿以测试的为准,而这个2392930的这个数据的话,就是在我们的嗯,这里呢它它本身的建立了一个缓冲区啊。
他用来接收这个数据的是2934这个地方,2934这个地方呢,它是用来存放着我们的这个游戏的相应的这个句柄啊,取得的这个剧本,也就是我要发网这个指定窗口的去评,那么这个位置我们再加上四的话。
那么这里呢就是三零了,因为这里是负数啊,加四了,这里就等于2930,那么2930这个地方呢,它实际上是存放着我们的,游戏啊消息的类型,那么所以说在这里呢我们做了一个比较。
那么如果呢它不是我们的定时器的这个消息的话,那么我们就转到这个标签最后来执行啊,这里是恢复我们的环境,然后呢我们就跳到呃,跳到这个扩的下面去执行,那么这个地址的话,我们可以看到也就是扩的地址交互嗯。
也就是这个地址呢加上实际上就等于ec啊,也就是说我们函数执行完之后呢,就会跳转到ec这个地方呢啊52761c这个地方来执行,那么我们继续看一下。
那么这里呢我们用这个用汇编调用这个get take county,来来获取当前的这个系统计时,那么获得这个系统计时之后呢,我们另外一个last time啊。
那么这个拉点它呢它在最后这里呢用也是用的这个标题,这个抗体呢来获取的这个时间,那么也就是说上一次的这个时间呃,我们呢再加上这个10ms的这个间隔间隔时间啊,加起来之后呢。
我们与当前的这个系统时间呢两个比较,那么也就是说上一次执行这个货的时候啊,执行这段代码的时候呢,与现在第二次执行这个代码的时候呢,它的一个时间差啊,那么做一个比较。
那么如果这个时间差它大于大于我们的这个,这里我们设置的是10ms哈,那么如果大于这个10ms的话,我们就执行下面的这段代码,也就是说让我们的这个cpu呢呃休息一会儿啊,8623678。
那么如果是小于的话,也就是说没有达到我们的这个时间的一个间隔,那么我们就转到这个the label这里来执行,那么the label的话,这里呢也是呃,首先呢是做一个扩的一个恢复啊。
那么这里呢也就是说相当于调用了我们这一句代码啊,因为这一段我们被hook了,实际上这个奇以73d0 这个地方呢他没有被执行到,那么在这里呢我们就相当于是啊后这个7173d0 。
那么这里呢是这个7173d0 的地址啊,啊地址呢我们放到这个e s p里边啊,然后呢我们进行进行这个啊进行功能的调用,为什么这里我们要用push,而不用直接的这个e x e d x这类的计算器。
因为这里呢我们需要保护这个环境啊,那么如果我们这里去调用调用其他的ex 1 b x的话,那么这个环境呢就可以就被破坏掉了,那么这次我们返回这个上一层这个扩的时候的话。
那么我们的e x1 b x这些基层基本破坏掉了,那么在执行这些代码的时候呢,就可能造成错误,那么比如说这个地方它e b x的话,他肯定呢在之前呢有一个数值啊。
那么如果我们在这个库里面用这个e b x来放,存放了这个扩的地址的话,再来进行调用的话,那么在这里传入的参数的数据呢就是错误的,那么所以说这里呢我们可以用这种方式来来进行一个调用啊,用堆栈。
而且这个堆栈呢这里呢我们就像这个堆栈里面写入,我们要返回的这个地址,返回来就看,那么return这里的时候呢,就相当于喊出了我们的这个地址啊,也就是相当于屏占了啊。
因为这个时候呢它的一个地址来恰好也就是我们的嗯这个地址,那么我们大致就是这样的,好的,那么我们另外呢我们要hook的时候呢,呃还有一个问题,也就是要计算这个地址,那么我们计算这个地址的话。
实际上有一个公式,那么我们看一下这后面的这个数据的话,那么实际上呢不是这个扩的这个地址,而这个扩的地址的话,它是计算出来的,它有一个公式,那么实际上是这个当前的地址呃,加上我们当前的这个地址呢。
加上这五个字节啊,那么再加上后边的这个偏移量,最后呢得到的这个地址,那么这个偏移量的话我们要加上的话啊,也不能够直接这样加,那么直接这样加也是错误的,因为呢我们要把它反序过来啊。
那么这个反馈过来的话就是呃因为它的低位是隐士啊,我们应该这样写002b f c14 啊,因为这这样写过来啊,才是他真实的一个数字,那么这样加上之后呢,实际上我们就会等于这后面的这个数值。
那么这个我们可以用计算器来计算一下,那么我们16进制啊,27617,再加上再加上一个2b fc 2比c14 ,啊那么等于,嗯这个时候好像我们计算有点错误啊,我们再把它清掉,重新计算一下。
呃首先我们是把这个复制一下,加上五六,然后再加上我们的2b fc 3比来c1414 ,啊这个时候呢就等于我们最后的这个7173d0 ,那么但是我们现在呢我们需要把我们自己扣的这个地址来,写到这个地方来。
但是呢我们也不能够直接写这个地址,因为如果我们把这个地址写到这里的话,他马上就会崩溃了,那么我们要求出呃我们自己的这个扩的地址啊,比如说我们要把这个地址嗯写入到这个地方去。
那么也就是说我们有一个呃它会是这样一个公式,就有,那么我们把它代入一下,也就是同样的是呃这个当前的这个地址加五加上我们的这个地址啊,理论上啊加上我们的呃加上一个问号的一个地址。
那么最后呢等于我们获得这个地址,那么我们反过来求的话,这个问号这个地址呢也就等于我们的呃这个当前的地址的话,他要去解,要去捡物,然后去剪掉我们的呃这个地址啊,这样来实现,那么所以说它最终的代码的话。
呃求得要写入我们这个扩的这个地址的话,那么就是这样的一个公式来计算的话,那么这个地址呢就是我们要写入的一个地址,嗯嗯嗯这个地址是我们要写入的一个地址,那么这个我们要写入的地址呢,我们先把它放到ex里面。
嗯,然后呢对这个空加一的这个地址来进行写入啊,那么这里是写入,当然在之前呢我们这里呢是保存它原有的这个数据,把它保存一下,因为我们后边呢我们啊恢复这个hook的时候呢。
我们需要把这个保存的这个地址来要写回去啊,让他还原啊,让他还原,当然前面的这个呢我们还有一个函数来,是要打开我们的这个页面属性啊,让它有一个呃呃可读写的一个属性嘛,至少有一个写的属性。
不然的话我们直接往这个呃里边写的话,它本来只有一个啊可以执行的一个属性,那么我们往这个页面里面写的话就会出错,好的,那么我们一起来看一下啊,把这个号口以及这个2号可能啊这两个函数我们粘贴进去。
那么在这里呢我们用后口,那么在这里呢我们添加暗号的代码,那么我们先给你生成一下,那么这里呢我们还需要来定义一个变量啊,那我们看一下是不是对,在这里,啊这上一节课遗留的这个消息呢,我们需要删掉。
好的看一下现在cpu的一个占用率43%啊,然后我们优化一下,看一下,这个时候呢cpu呢马上他的这个占有率了啊,就低下来了啊,大家看我们看一下是多少,那大概是3%到4%的样子,那么我们进去看一下。
那么这个时候的话,同样的呃一点都不影响我们这个游戏的呃这个可操作性啊,二,好的,那么这节课呢我们就讲到这里哈,那么下一节课呢我们在为我们的这个cpu优化的呃,呃专门写一个页面啊,配上相应的进度条。
对相关的两个参数来进行调节就可以了,那么我们可以调节的参数呢一共有两个,你控制一个是这个休息的时间,一个是这个间隔啊,那么你只要调到这个火势的位置了,那么就能够最大的优化了我们的这个cpu。
因为如果是你的这个cpu速度越快的话,那么这个值呢可以调的越大啊,那么这个值可以调的越小,那么这个间隔时间的话,理论上的间隔时间越小的话,那么呢能够起到越好的一个优化效果啊。
那么这个休息的时间呢越大越能够起到一个优化的一个作用,好的,那么这节课呢我们就讲到这里。
P118:129-游戏黑屏优化分析 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们一起来分析啊,呃游戏的黑屏优化的一个处理,那么我们要分析这个黑屏相关的这个数据的话,我们可以接着之前的这个cpu优化的相关数据来继续的一个分析。
那么我们的入手的话,主要还是从我们的游戏的主线程开始分析,那么这是一种思路,那么另外一种思路呢,我们可以从游戏的所有这个对象嗯去分析嗯,但是另外一种分析的手法的话挺难上,可能要困难一点。
那么我们要去分析这个对象的属性啊,这一类的呃,做一个对象的一个偏离,那么我们首先呢我们从这个游戏的主线程来分析一下啊,因为我们的游戏主线程呢,它这个循环里面呢它分了很多块呃。
肯定就有涉及到我们的这个屏幕画面的一个更新的啊,相关的一个库。
那我们先附加到游戏里边,这不。
那么我们看一下啊128克的相关的一个分析哈,这个合格的位置我们先转到这里。
那么这是我们的主线程的这个循环,那么我们从这里来开始分析,那么这是我们主线程循环的这个扣,那么这个括后面的话我们呢当时有一个注释的一个地方嗯,就是我们我们找一下,好像是这个地方涉及到我们这个绘制相关的。
我们在这个地方下个断点,然后我们看一下断不下来哈,是这个地方看另外有一个类似的一个地方,这是他们,那么我们从这里往后跟,那么一般来说的话,我们这个就是画面的一个更新的话,都有一些时间函数相关。
比如说这个get to account,还有一个tgt t,还有一个是他,一提他那么这两个函数的话都是与时间相关的,它要计算一个时间差,那么多久的时间呢,我们更新一下这个画面,好。
那么我们先备注一下这节课,我们的目标是黑屏化分析,那么我们从这里呢继续啊,下了段之后呢,继续往后面跟一下,当然不是说他每次他都会呃更新这个数据,那么有有时候呢我们需要多跟几次,因为它有很多很多的跳转。
那么可能是某一次循环呢,它才是绘制我们的这个呃游戏的界面,那么这里呢也是一个计时啊,计时的我们给它的注释一下。
好继续往后面给一下,那么实际上我们这个计时呃,前后计时的这几个函数呢,我们可以来,那么像这里呢也有很多函数啊,那么我们可以对这些函数来进行,就是说呃loop啊,我们试一下它与我们的这个图片的绘制啊。
呃界面的一个绘制有没有关系,那我们再来看一下它有没有参数,好那么这个框呢也没有参数,我们也把它弄不掉,看我们的游戏界面呢,那这个时候我们就不能够移动了啊。
那么这个的话说明的话它实际上是我们移动相关的一些数据啊,那么这个也是与我们界面呢有关系的,那么我们把它注释一下,嗯,嗯切画嗯,可能是负责和移动人物这一类的啊,这一类的一个画面的一个更新。
那么我们在继续看一下后面这个库,这个库看来也是没有参数的,那么在这个库的话我们可以看到啊,这里我们可以点击呃,但是我们的人物呢它不会有这个动作哈,那么我们在这里点击一下啊。
但是我们的人物呢呃这个动作的啊相关的它没有了,那么可能这个过程就是我们人物啊动作相关的,实际上你看他还是在执行相关的动作,只要只是说我们这个课把它弄不之后呢,它相相关的移动的这个动作呢没有了啊。
这个时候啊,那么这这几个呢都是人物相关的,应当是啊这三个空啊,88888,那么这三个扩的话应当就是我们呃人物动作相关的这个空,那么我们现在的话如果要做这个黑屏的这个分析的话。
那么我们还要找到来绘制我们场景,还有建筑啊这一类的呃相关的这个空,那么我们在这个地方来下段哈,呃再继续往后面跟,然后呢这里也有一个扣啊,那么我们进去看一下呃,这个括它有几个参数,这个扩呢有四个参数。
那么我们再退回来,在这个地方呢,我们或者进这个库之后呢,我们这里呢提前跟他return银色啊,呃做一个堆栈的一个平衡,然后呢再跳回来,然后我们跑起来之后呢,再看一下,那么这个时候呢。
我们暂时没有发现与我们这个呃图像相关的这些数据啊,你没有发现,那么从这里来看的话,好像我们是呃这个怪物对象好像被隐藏掉了啊,那么我们再继续恢复一下,一般恢复之后的话,我们的这个怪物对象呢还是没有出来嗯。
那么我们再来看一下有没有其他的地方,我们有没有好考,再分析一下,那么这里本来应当是有很多怪物的,那么我们小退一下,再进来看一下,那么我们从这里下段呢,我们还是继续的往往下看一下嗯,再弄平一下这个孔。
再测试一下,看它与我们的这个怪物有没有关系,那么这个时候呢我们发现了所有的怪物呢,这个人物呢都不动了啊,那么这里的话应当是人物啊,怪物这一类的呃,画面的一个更新,人物角色啊,怪物,相关,好。
那么我们再来看一下后边,那么这里的话有一个time get time哈,理论上它也是有一个什么对象啊,思路的一个更新,那么我们再次测试一下,在这里呢我们你看一下,让他跑起来。
那么这个扣的话看来是就是说那个怪物死亡之后,他的一个一个数据的一个更新,应当是那么在这个数据,如果我们这个扣如果return了,那么怪物呢就不会死亡啊,看起来的话,那这个时候的话我们就攻击之后的话。
他就死亡了,哈的这个相应的这个怪物,好那么这这个事呢,我们怪物啊应该是对象死亡的这个扩,那么我们把它记录一下,嗯1333333,那么如果这个空我们被hook啊,或者是不调用它的话。
那么怪物呢我们攻击它之后呢,他就不会死亡哈,就不会死亡啊,从我至少是从我们这个呃本机上来看,它应该是没有死亡好,那么我们接着再往后面分析,那么这里呢我们是一个也是画面相关的啊,上一节课我们有分析了。
这个是一个第三第九的相关的,也是画面相关的,那么这个呢当然具体是一个什么空,我们还不知道,在这里呢我们也进去一下,进去之后呢,我们看一下它的返回参数是多少,那么是一岁,我们也把它注释一下啊。
好那么我们再让它跑起来,那么这个我们可以看到它是一个有画面的话贴图啊相关的,那么也都是与画面相关的,那么这个贴图的话应该是也是与我们黑屏啊相关的一个空,嗯这个是场景,我们暂时跟他取名一下啊。
呃场景贴图在这里,我们再下一个断点,然后f7 呃进了,那么这个理论上的话是一个场景的一个贴图的一个空,这个可能的话可以用来做我们的黑屏的一个优化嗯,嗯,好那么下面这里还有一个括,我们在这个段啊。
这个地方呢下段看一下,那么这个地方呢也是另外一个这个d3 d9 画面相关的一个数据啊,那么我们先来看一下嗯,这个我们看它的一个返回值是多少,需要屏障,那么这个的话我们可以看到他们有这个参数。
直接直接就return了,我这前面有一个参数额比腾零四还有一个参数,那么我们就来看一下这个地方,那么这两个结合起来的话,可能是我们的这个场景的一个贴图相关的一个动作啊,而且我们可以看到这里的话。
它也不影响我们的人物的移动啊,这一类的好,那么我们再回过头去哈,在这个地方再下一个段,那么我们进去看一下,那么这个地方我们把它恢复啊,看一下,那么从这里来看的话,应该是前面一个括号才是与我们贴图相关的。
那么这个库的话看不出来有什么作用啊,暂时,那么这个库的话我们暂时来看不出有什么这个作用啊,在这里,那么我们也先把它恢复,都把它注释一下,这两个地方,好的,那么这两个,然后呢我们继续往后面再看一下。
那么看一下这个空,我们跟进去看一下f7 。
那么这个扩的话也只有一个参数,那么我们就看一下,你这那么这个扣的话,我们就可以实现一个黑屏的一个处理,我们发现整个屏幕就黑掉了,好的。
那么这节课呢我们暂时呢就分析到这里了,那么我们暂时呢可以认为呢呃这个扩就是我们黑屏处理的一个扩,嗯嗯嗯,那,么我们还可以给一下后面的这个库,也可以看一下,这个好像是定时的啊。
这个与这个没有时间相关的这些数啊,可能与我们的这个黑屏的话没有多大的这个关系,从这个库这里来看的话,它是一个高精度的,好像是一个定时的,下面的呃方面的一个函数,这个函数呢平时用的比较少,那么我们看一下。
那么sd里面它的一个说明,那么从他的这个说明来说的话,好像是一个定时的啊,用来计时多少多少毫秒啊,这个是一个地址,是屏幕的一个当前什么屏幕的一个地址。
好的这个函数呢我也没有用过啊。
呃那么这节课呢我们暂时就分析到这里哈,目前的话我们就认为呢呃这个库哈应当就是可以处理我们黑屏的,那么我们把它把落p掉,或者是嗯做一个return,就是说不执行这个函数里面的好像来就可以了。
实现我们的黑屏的一个处理,那么这个时候呢整个屏幕呢就黑掉了吧。
但是呢我们看走路的话,不知道这个时候有没有影响寻路这类的,也没有影响,你们发现这是刚才黑屏状态下面我们的点的这个寻路,这是,好那么这节课呢我们就暂时就分析到这里,那么如果我们是要写那个这个功能的话啊。
就从这里来hook这个这个库,那么也可以把前面的这几个库来都hook掉,呃,也可以啊,那么可能的话前面这两个库呢是一个常见的场景的一个处理,那么最后呢这个库呢呃才是负责了一个场景的一个绘制啊,好的。
P119:130-真正的黑屏优化-可大幅降低CPU占用率 - 教到你会 - BV1DS4y1n7qF
大家好。
我是郁金香老师,那么这节课呢我们继续来分析呃,有关我们游戏建筑物的啊这个隐藏,那么首先呢我们先打开129课哈分析的相关数据,那么我们从它相关的这个地址来继续分析,那么就是我们黑屏。
这里的话他有可能这个库里面有可能就包含了这些呃对象,或者是建筑物的这些画面的一个更新,那么也可能是在这个扩的后面,它可能呢是单独的呃来完成的,那么几种可能呢都是有可能的嗯。
那么我们先转到这个库里边看一下。
那么这是我们上一节课分析的这个黑屏的这个库,那么我们从这里呢,呃再往下面再跟一下,看一下下面的这些库,好按下f8 ,那么我们看一下这个空它有一些什么功能啊,这个扣我们上一节课已经有更了一下啊。
它里边也没有循环,也没有其他的,只有一个定时的啊,相关的嗯,那么我们再往下点跟一下,那么这里呢有一个地方啊,也是一个扩,那么我们跟到这个库里边去看一下,那我们首先看一下这个ecx是什么。
那么这个ec x的话实际上是我们的人物角色对象啊,从这里来看嗯,那么我们这个空我们跟进去看一下先,那么这是可能是与我们人物角色来相关的一些操作啊,那么这里有个get啊。
也有一个计时的一个getting tic count这个函数,那么我们看一下这个货有几个参数,先看一下,这个扩比较大啊,它里面是实现的功能呢可能也比较多,那么我们还有一种办法呢,也就是不跟进去看。
他直接看这里的堆栈的一个e s p的一个变化啊,它执行前与执行后的一个变化,那我们看一下现在e s p的值是呃148啊,那么我们按下f8 ,他出不起了,那么执行到这里的时候,我们看一下3a。
现在是e58 啊,这是3a,那么可以看到呢,它只有三个参数嘛,那么只有三个参数的话,我们可以在这里呢这样一些sp的字了,只能直接加零碎,那么就把这个过来跳过了,那么我们看一下啊。
因为它后面这里呢还有一个语句句啊,呃让它出错了,那么我们可以下次改的时候呢,我们可以从这个地方看,这个地方呢我们直接跳到啊,跳到这个地址来执行二七比比一这个地方,啊这样的话我们就跳过这个空好的。
我们把这这一部分呢记录一下,然后再重新启动一下游戏。
那我们再次转到我们分析的这个地址。
那么首先呢我们在这里呢给它设置一个jp。
那么这里呢没有参数的一个压战呢,我们就到后面了,我们就不用啊恢复这个堆栈了,好的,那么我们再次进来看一下,那么这个时候的话我们可以看出来这个库的话。
暂时呢我们看不出来它与我们这个绘图的界面有什么直接的关系,嗯那么我们继续往后执行,那么接下来会往下面来跳转,那么这里呢也有一个d3 d9 啊,相关的嗯,一段操作,那么这里呢也是取出的啊,相关的。
那么可能这里呢也是一个呃这个界面绘制啊,相关的,那么我们看它的这个参数的一个个数是多少,那么我们主要是看一下这个扩执行之后这个堆栈的一个变化,现在呢他e s p的是五四啊,执行完了之后呢,呃变成了八。
那么所以说在这里呢我们可以让e s p的值呢呃加四,当然这里只有两个字节啊,它不够,那么不够的话,我们可以把这几句呢啊都不掉,看着恐惧,那么我们再次在这个地方下段看一下这个e si的是什么。
那么e s i的话我们可以看到,这里的话它可能不是属于我们这个所有对象里边的嗯,因为加八这个位置,它的这个数字来太大了啊,这个地方那么暂时呢我们不知道它是一个什么对象啊。
但是可能是与我们界面相关的一个东西,好的,那么我们这个时候呢来看一下我们的一个画面,那么我们发现的话,这个时候的画面的话是真正的啊黑屏了啊,呃没有任何的一个,那么上一节课好像我们的颜色的话它不一样啊。
也是黑屏,虽然说那么可能是前面的这个人他是呃用来,而且这个时候的cpu的话占有率的话啊,非常的低啊,非常的低,我们可以看到只有3%左右,那么这个的话应当呢还是真正的一个黑屏的一个优化啊,黑屏的一个优化。
那么虽然说三零节课呢,我们那里呢那可能是它是用于处理我们的一些图形图像的这个缓冲区,然后到了这个库这里呢才进行我们的这个画面的一个绘制啊,那么所以说我们要实现真正的一个黑屏的话,应当是在这个地方才对。
好那么我们撤销一下,那么撤销之后的话,我们可以看一下,这个时候cpu的话使用率的话一下子就上来了啊,呃那么我们这里的话应该还是一个真正的,黑屏优化,那么我们记住这个扩的这个地址就在这个地方啊。
第3d结构啊,黑屏优化,那么我们也可以直接转到这个地址去,给他做一个和这个相应的hook比特,直接在这里来进行一个优化,它也是能够黑屏啊,也能够黑屏。
也就是hook我们的b3 d9 来实现好的,那么这节课呢我们上一节课虽然说也分分析了一个黑屏,那个那一个呢是五黑屏,那么这个呢是我们真正的一个黑屏的一个空,那么这节课的内容呢实际上非常的简单啊。
我们把真正的这个黑屏的优化呢啊分析出来了啊,那么前面的这个是伪黑屏的嗯,那么这节课呢我们暂时来,那就讲到这里,那么下一节课呢我们在再来更新我们的这个人物啊,或者是我们的建筑物相关的啊,好的。
那么我们下一节课再见,我们可以把前后的这个代码呢都给它复制一下。
作为一个特征码,这里呢它绘制了这个图形之后呢,每次呢它也会啊休息100ms的时间,好像是啊,这个100ms是从前面跳转过来,然后我们再下一个断点看一下他。
绘制了这个,那么它进行了一个图像界面的一个更新之后呢,那么这里还有一个扩哈,他进去了好像可能是发发了一个消息,就让我们把这个县城来挂起了,这个时候,那么我们把这个破落不掉了,再做一下三四。
这个也没有参数可以直接的落,但是呢它有一个返回值,这个库哈,唯一的它是有一个返回值,然后呢可以做一个什么比较这一类的啊,同样是能够达到一个黑屏的一个效果,这,这个很奇怪哈。
这个过来好像也那么应该是真正的这个黑屏过的话,应该还是上边这一个只是说这两个过的话,他都能够达到黑屏的一个作用,但是这个黑屏我们看一下cpu的一个占有率,它有没有下降。
那这个我们看一下它是一个假的一个黑屏库啊,这个也是一个虽然说它能够效果上能够达到黑屏的话,那但是呢我们可以看到它实际上的话cpu的占有率呢它们有下降下来,那么只有来把这两个地方呢弄不掉。
那么这个时候呢他才是真正的这个cpu的占有率才会下来啊,而且这个地方还不能够还要也需要恢复一代码,这个地方这是伪黑屏扣。
那么实际上这里呢还有一个有一个字串啊,可以很方便的用来定位这个特征码到成好的,那么这节课我们先把我们的这个内容呢告一段落,那么我们下一节课了再来分析这个隐藏建筑啊。
P12:023-封装完善动作使用CALL-重复包含头文件 - 教到你会 - BV1DS4y1n7qF
大家好,我是玉溪香老师,qq 633057,那么这节课呢我们继续对上一节课的代码进行一个完善,以及完成我们第22课的作业啊,他们存在啊,这个u是x型,这个确啊,那么它的参数呢我们要求是动作的名字好的。
那么我们打开第26课的代码。
700,转到我们的源代码单元,回到最后,啊那么首先呢我们可以呢先骗你整个这个数组,获得它的下标,然后呢再调用上边一个函数,那么当然呢也可以完全的重启,那么我们把里面的代码,把前面聘你的代码写一下。
嗯这里是偏离到一块啊,干脆我们重新写过也可以,其实很简单,要写到进行一个变量全i下边呢是0~11,前面我们进入了一个活动,你这个是直接使用,我们就直接使用,这里是12i加项。
嗯就这里我们需要加上结构的一个前缀专用率啊,进行一个限定,那么首先这个名字呢,我们能用的名字传进来的这个参数来作为一个比较,那么如果最终比较的结果这两个相等的话,那么我们就直接使用它就行了。
那么直接使用这个下标就ok了,往前放,这个很简单,首先呢我们骗你整个动作列表,那么它的名字与我们常见的来到这个参数的名字来进行比较,但是比较之前呢我们要进行一个初始化的一个操作。
在前面呢我们要做一个初始化,好我们要给你的体现,当然这个也s的前缀呢,我们可以不要直接这样调用,也可以直接这样调用,哈哈哈,那么初始化了之后呢,我们进入整课,当然在这里呢我们也可以把初始化的这样啊。
写到这里边呢,也可以先这几道题,然后,再进行片面都是可以的,那我们出示一下,那么初始化了之后比较这个名字啊,然后呢这个就是他所在的一个下标嘛,就不用另外再去编写一个函数。
那么我们之前的对稿的这个使用的话,那么另外呢我们多了一个函数嗯,多少在流水平的啊,这个标题库是一dex类,通过这个名字呢去查询它的一个下标,那么这里呢我们越过了这个函数,直接这样写也可以好。
那么写好之后呢,我们来做一下相应的一个测试,那么在测试的时候呢,我们这里来讲,实际上直接就可以传我们的动作的名字,比如说啊运气调试就可以直接这样用,嗯这里呢我们进行一下优化啊,每次我们使用的时候呢。
我们都要来创建一个啊这个结构的对象的话,这样很麻烦,我们把这个结构对象的声明呢,我们把它放到一个全局的单元里面,在这里呢我们添加一个全局变量的语态,哈哈。
哈哈哈。
那么这个单元里面呢我们在对我们这些辩论呢进行一个定义,当然在定义之前,我们需要包含相应的一个图片,啊啊添加了全文件之后呢,呃这个图文件之后呢,我们在其他单元要使用的时候,在包含这个全局变量的这个单元。
那么比如说这个是我们的动作数,那么前面呢我们还有更高的速度,8888,然后除了背包数值呢,我们还有机会给他做一个数据,这个呢我们都把它放在这个全局的单元里,然后我们要到其他地方要使用它的时候。
我们直接包含这个单元来就行,那么包含了这个单元呢,我们这个struct connect这个单元我们就不需要包含,因为在这个途径里面,它也包含过,当然有时候让我们这里呢啊如果我们出现了这种。
有时候不得不重复包含一个单元的时候呢,我们也可以这样做啊,如果这里它包含了这个单元的话,它就会提示很多很多啊,从定义的啊,那么有时候为了方便使用呢,我们可以在这个相应的结构单元里面嗯。
加一个红的一个定义,最后一条无指令,那么这个红指令呢在前面我们编写啊,这个第八个问题啊,到时候呢我们也用过啊,那么只是用的不一样,当时我们是这个第八个,我们定义了我们在编译呢。
在编译的时候呢才编译这段代码,那么今天我们要用的呢是如果他没有定义啊,我要红,那么这里这个红灯你自己我们自己写,那么如果它没有定义这个红的话,那么我们在编译后面这个单元啊,这个n的移到最后,那。
么这样呢,如果这个人未定义,那么我们就执行下面的这个代码啊,同时呢我们就定义这个红,那么第二次他在啊再报案这个通鉴,再运行到这段代码的时候呢,那么这个盒呢也有了,在这个地方定义过了啊。
所以说呢这个条件呢它不成立,后面的这些代码困难,在第二次被包含的时候,它不会被编译,那么也就不会出现这样的错误了,那么这样写的话,我们就可以让我们把这个头文件来多次被包含。
当然这个windows可见的它里面呢也有一个类似的啊这样的一个处理,所以说这个windows单元呢它可能会反复的包含啊或者包,那么这也是一个技巧啊技巧,那么比如说这个文件。
那么我们也可以给它加上这样一句,预防它会重复的包含,那么这个移到我们定义的结束,那么这里呢我们也给他写一个红,如果如果这个没有定义了,我们在第一次的视频就定义一下这,啊那么这个途径呢也可以去多次的画完。
好那么接下来呢我们进行一下我们的测试啊,在这里我们用了这个运气调息,那么我们看一下测试有没有效果,那么这个时候要把我们的游戏啊显示出来,先挂解我们的主线程,然后呢把游戏显示出来,然后按一下测试。
这个时候呢它就运行了调息了,那么如果我们要打某一个怪物,我们先选定一下这个怪物站起来,那么选定了之后,我们看一下他第二个动作叫什么啊,叫工期,那么我们在这里呢我们也可以改成我们的攻击。
那么这段代码的可读性的话,它会更高一些,那么编写代码的时候呢,我们书写也更方便,如果我们直接传我们的这个下标进去的话,肯定介意啊,那么我们以后再修改我们的,代码的时候呢可能就不知道该怎么修改了。
因为代码的可读性太低了,好的话,我们再次输入,把我们攻击那个外挂界出现起来,这个时候它就会跑去了,之前我们攻击了一个命令,那么现在呢我们就还差一个选中怪物的一个命令,那么选中了怪物之后呢。
我们就可以再用这个攻击的动作了去嗯,恭喜我们的怪物了,那么我们就可以实现部分啊挂机的一个功能,不能挂机的功能好的,那么这节课呢我们就讲到这里,那么我们下一节课再见。
啊这个上一节课的座位的话是非常的简单的,就短短的几句代码就能做完成,好的。
P120:131-隐藏建筑物分析 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们呃分析一下哈建筑的一个隐藏啊,嗯那么我们这节课呢,首先呢从这两个黑屏优化的这两个地方开始分析哈,另外的一个有一个黑屏的这个扩。
那么既然我们找到的这个呢是一个真正的一个黑屏优化的话,那么说明这个扩的话,它可能是管理我们的嗯,也就是相关的一个游戏画面的一些数据的一个准备哈,可能是在这个扣扣里边啊。
那么我们可以从这个扩里边呢开始了呃进一步的一个分析,那么呃看一下它是不是与我们的这个人物界面啊,或者是我们的建筑物啊,这个场景呢相关的呃一些数据是不是在这里面。
那么我们先用来o d来附加进去。
然后呢我们再转到我们黑屏的啊,这个五黑屏库这里啊。
嗯,那么转到这个地方之后呢,我们再次把这个地方弄不掉啊,看一下,那么这个时候呢它是一个伪黑屏,它cpu的这个占用率的话。
它不会大幅的下降啊,虽然说有一定的这个下降。
它不会有很大幅度的一个下降,那么呢我们呃也就是说所有关于场景的,比如说我们对话框啊,呃还有我们的人物角色呀这一类的啊,画面的一个更新的一个相关的数据呢,可能都是由这个扩来准备的,嗯。
那么我们跟到这个库里边来看一下,那么这里呢它也有一个括啊,这里有一个比较,那么我们看一下这个库里面它的参数有多少,这个库看起来还有一点大哈,呃它没有相关的参数,那么我们先把这个库进行一下logo。
然后我们在这个时候呢。
我们发现了有关黑屏的话,可能就是这个孔哈,这个库呢也是一个伪黑屏扩。
过啊可能是管理对象,就像绘制数据的,那么我们把这个地方呢直接把它复制一下,那么既然这里边的话,那它是管理我们这个对象数据进行绘制的,那么里面它肯定有进行分类。
那么这个分类的话一般呢它会有一个循环这一类的啊,然后呢循环之后呢对他的这个对象类型的一个判断啊,然后来进行分类可以,那么我们继续往里边看一下,那么这里呢也有一个破啊,那么我们进进来看一下。
这个坡的话也比较大,那么比较大的话可能还不是很好分析,那么我们首先在这个地方下断看一下它能执行前后堆栈的一个变化,因为我们这个扩比较大的时候呢,我们去找他的这个返回地址的话比较麻烦。
也就是找对太比较麻烦,那么我们看这个地方usp的一个变化呃,执行之后呢从1c啊变到二八,那么证明他的这个参数的话还是比较多的,那么我们再次来看一下嗯,现在的usp呢是ec啊,然后呢我们按一下f8 。
那么这个时候呢是二八,那么他一共呢有从这里来看的话,它一共有三个这个参数啊,这里是二八,那么呢这里是ec,那么中间呢它们相差三个地方呃,那么所以说在这里的话,我们应该是a a tp e s p啊。
0c好才对的才是对的啊,那么我们从这个地方呢把它弄啊,把这段过来,把它logo一下,嗯那么我们发现这个扩的话与我们的这个数据处理的话,好像是没有关系的,那么我们接着来往后来看一下吧。
看这个地方会不会执行,那么这个括我们来看一下它前后一个参数的一个变化,ec,按下f8 嗯,从这里的话看它没有没有相应的一个变化啊,数字的话,那么只有这个地方呢有一个变化,那么在这里的话。
我们可以直接把这个地方的logo掉,再看一下,那么对我们的画面的话也是没有影响的,那么我们继续往后来看一下,这个数值就比较多了啊,这个地方,看一下这个地方有没有被执行到,看一下它参数的一个个数。
按下f8 也没有变化啊,这里呢它是这个因为这个扩的话,我们可以看到它虽然说有三个参数,但是它是在这个地方评价的,所以说呢在这里呢这种困难我们可以直接落户,他们有这个影响。
那么证明影响到我们这个图像数据的处理的话,是有其他的这个扩,那但是这个地方的话又比较大啊,那么我们更新一下它的流程,从这个地方,那么可能这样更一下的话,可能会快一点,但是这个也不能够呃。
这里的话我们可以看到呃,他就是对我们的这里有什么3331,二一应当是在对我们的这个对象的话进行相关的一个分类了哈,这个是我们呃比如说我们的灵异啊,3331,这都是我们的usp加八这个对象相关的这个数值。
那么在这里的话,它应当是对我们这个这个对象的数据的话再进行一个分类啊分类,然后呢在这里呢来调用一个相关的一个扩,那么这这应当是我们的呃周围的可能是一个怪物的一个列表,然后可能是从这里。
然后呢再进去进去啊,那么我们按减号再退回来看这个库会不会被执行啊,那么这个库呢也会被执行,那么他呢嗯我们看一下里面的一个返回值呢,14,那么我们要屏障的话,这个地方呢我们需要a d d e s p加四。
好的,那我们再来看一下它的一个变化,那么我们发现了这个时候呢依然黑屏了啊。
那么这个呢也是一个我们可以跟他取名一个啊黑屏相关的一个扩,那么证明我们的这个画面数据的话,可能就是由这个库来处理的,你中画面处理相画面相关数据处理,弄不掉这个黑皮,好的。
那我们要把这个相关的扩展进行一下注释,那么我们进去看一下它有几个空,那么这里呢进来又有好几个括哈,这里是复习一个零,那么这里呢也有一个括号,可能有两三个括,那么我们在这个地方呢,先下一个断点。
好像没有断下来,这个地方也没有断下来,这个地方还是没有断下来啊,这个地方断下来了嗯,那么这个地方断下来的话,说明这个地方的卡性比较大,那么我们进去看一下,但是这个地方断下来之后的话。
他就只有短短的一句话,那么我们先把它弄不掉看一下,那么这个看起来实际上它实际上不像啊,因为它这个涉及到的指令太少了,那么看起来的话,这个过来与我们的这个界面的话没有太大的关系,那么应当是前面的几个空。
那么我们返回去再看一下,这里会被调用到,我们按f7 看一下它执行的一个流程。
那这里有点奇怪啊,看起来这个地方好像是很像,那么有可能是它的一个返回值啊,这里好像是一个循环,它在循环的执行这个扩,那我们再分析一下,那么这里呢是一个大的一个循环啊,那么循环的话可能会执行到这里。
那么我们先把这个过来啊,这个扩呢会执行到,那么说明的话可能这个扩的可能性呢还要大一些,反复的会执行这个空,那么我们看一下ec x是什么,那么就这个意思。
x的话是我们的人物角色的这个空啊,这里也是哈40f这样进去,那么最后呢他好像还有一个返回值,也会对它进行一个影响,那么我们先把这个这个扩呢,先把它呃做一个加配,这本来跳过这个扩折执行。
我们来看一下7f6 k30 ,那我们就跳到这个后面来执行,跳过之后我们来看一下,这个地方呢它也会被执行到,那么证明这几个课的话可能都有啊,都有相关的一些,但是我们刚才的这个扩的话。
看一下它与我们的黑屏的话是没有关系的,我们做江北这个地方到哪里去了,我们看一下,乱剪好吧,再退一下,这个地方我们做了一个价格,那么我们再回到上一层去看一下,请下一,这个扩也没有啊关系。
那么可能还是7f6 这个括号嗯会伪黑屏,那么我们在听到这个框里面去看一下7f6830 ,就这几个货呢,我们再进行断点啊,下一下断啊,最终呢是断在这个地方,啊反扑的是断在这个地方。
那么我们在这里注释一下啊,好是这个孔,那么当然这个库的话我们还是看到的,刚才好像我们已经修改过了这个库,它好像,代码太少了,可能不是,那我们再看一下它的一个走向,回到7f6 这个地方调用的,再按f8 。
我们往下跟一下,哒哒哒,零二往下,那么这个地方呢是黑屏7f6 ,然后呢我们再往下执行一下,那么这个库的话应当是相关的一个库啊,但是呢我没有找到他,就是直接的与我们的这个建筑物相关的。
那么建筑物相关的话可能是另外一个空,那么我们再跟一下它附近相关的,再按下f8 ,但之前的话我们看到他又没有执行其他的这个扩嗯,这个地方好像执行了一个括,这个框有没有被执行,只做了一些比较啊。
这个地方那么可能取决定作用的是是这个ex的一个返回的一个数值,可能是,那么我们看一下它的返回值有一些什么特别的地方,那么这个ex返回值的话,看起来像是一个对象,这里看起来的话像是一个对象的一个地址啊。
这里是3亿,再看一下,那么这里是五八,那么我们从这里,我们下一个路程断点看一下,啊这个断点我们取消掉,那么从这里来看的话,它可能是呢呃这里到一个循环里面去了啊,我们就是这里呢是一个对象加八的这个位置。
那么也就是我们再退回来,那么这个扩展功能的话,我们大致我们是知道了它返回,最终呢它返回一个呃ex,那么这个ex呢是一个对象,我们再来看一下是不是这样的,那么我们先把内存的访问断点呢先取消掉啊。
这个时候呢ex那我们找一下这个ex它的一个来源,那么这个ex的话上它是来源于我们的e s i诶加四这个地方,而e si加s的话,它是来源于上一层的这个e c x,那么大概呢他就做了这样一个市场。
这个扩的话,那么就是从这里来,从这个e s i里面把我们的假设这个地方呢,把我们的这个对象取出来啊,这个时候就取出来一个对象,五八这个这个响应,那我取出来之后呢,然后实际上就可以返回了,从这个地方。
那么后面的话相当于都没有做其他的事情,那么这个库里面可能做了一点点事情啊,但是这个扩的话它也没有改变我们的ex的值,那么ex的话来源于我们的,我们看一下f7 ,不过了,1a x。
那我们再再到这个地方来下一个断点,再看一下,这是ex的数值,那么我们看进到这个库里面,它有没有改变,那么我们发现的话,这里的话它也没有改变我们ex的数值,那么所以说这个空呢它好像是无关紧要的好。
然后就返回到上一层,然后我们再跟一下这个ex的一个走向,然后呢就每次呢把这个ex加八里面的这个数据的把它取出来,进行一个比较,那么会不会是这种情况啊,我们推想一下,他就是可能是不断的在骗你啊。
某个可能就是我们这个对象数组啊,周围的这个对象数组,那么这里呢可能是我们的这个周围的对象列表,那么我们进去看一下会不会是这种情况,那么看起来有点像这种情况,再加四,那么这里呢他看起来的话。
这个45f t60 的话就有点像是一个呃,可能是与我们界面相关的一些呃,需要绘制图像的一个对象,那么他把这个对象,然后呢呃是一个机制,然后呢传到我们的这个库里边,然后再取出里面的某一个对象。
取出来之后呢,可能他会做一些处理啊,就是说这个对象是否还需要绘制这一类的,那么这里呢他做一个判断,那么我们看一下,如果等于二一啊,或者是等于某一个数值,那么在这里呢它都有一个等号。
那么在这里的话我们看一下jn z啊,不等于co分零二,不等于零的话,与二进行比较,与三进行比较的时候呢,直接跳到这里来,那么我们把这个撤销还原看一下,三三嗯,312 亿都会了,来到这个地方。
那么从这个来看的话,可能是人形的这个怪物呢,它会到这里来来进行一个数据的一个处理,那我们看一下周一回到我们的城里边哈,看一下有没有人形的这个npc,啊这里有一些人形的npc。
那么我们看一下在这个地方的话,如果把它跳过了,我们人形的npc会不会进行一个绘制,这里跳到的是7f56 a30 ,那么我们看一下,这个时候的话我们看一下周围的这个npc的话,那同样是在的。
但是在的话我们有一点呢就是选中它的时候,它上面的这个血条没有了,那么这个的话可能就是一个血条绘制的啊,相关的,那么这个时候我们选中的话,就有一个血条,那么这个呢可能是我们的角色对象,和血条的一个形式。
或者是我们的选中,选中画面的一个显示,但是我们在这里看的话,它也没有存放这个数据的一个缓冲区,好像也没有改掉它的这个数据,那么一直呢它是在这里做一个循环,嗯这个有点看不懂啊。
那么我们再看一下后面这里呢还有几个空啊,那么这些空看会不会执行到,那么我们先分析一下后面的啊,后面这个框呢也会被执行到,那这个扩的话有一个比较大的一个循环,那么从这里的一个比较来看的话。
感觉的话这个扩的话可能呢更像一个呃,这个是我们的人物角色,这个是怪物啊,那么这个库的话看起来的话更像是我们的呃,相应的这个对象的一个绘制的一个空,那么我们先把这个框弄不掉,看一下。
看一下他e s p的一个数值,usp呢是128,然后我们按一下f8 。
然后看一下对象里面的一个变化,这个时候的话我们的e s p呢它没有变化,那么说明这个货的话,我们可以来。
都漏不掉,弄不掉之后呢,我们看一下它的一个变化,那么我们发现的话,这个困难它也与我们的这个图像的一个处理有关系啊,那么这两个括的话实际上都有这个律师的作用,但是我们不知道他们之间的一个关系。
那么这个库呢它不断的在循环里边哈,取出这个对象,好像是我们再来看一下嗯,ex的一个变化,那么我们在这个地方来看一下下个断点,那么我们可以看到的话,他应当是不断的从这个扩里边呢取出这个相应的对象而已啊。
然后把这些对象呢取出来,进行一个循环,可能进行了某些处理,那么我们再跟一下,ex注意ex相关的,ax,但是这里的话它就从这个ecx里边取这个数据出来了,好像这个ex的话没有多大的这个作用啊。
感觉你再看一下呃,ex是这个数值,那么看这个ex呢它有没有利用起来,但是每次呢它加的是ebx,在这里,然后呢这里呢它是从ebx里面取出来的,那么这里的话看起来的话,实际上是在偏离我们的ebx这个数据。
3d,那我们在这里来看一下这个断点,那么这些呢我们把它恢复一下,再听这个课来看一下吧,不断地取出来,那么我们关键看一下他写入的这个数值,也没有明信,这里呢做一些相应的判断,一bx啊。
然后呢是把我们的这个这里是传入了一个对象进去,那么我们看一下这个对象传进去之后,这个参数它做了一些什么,然后我们看一下啊,首先呢它把它取到di里面来,然后呢与我们的ex来进行一个比较啊,指示。
e d i,然后呢又与我们的这个e s i来进行一个比较,然后呢与我们的看一下这个ex是从什么地方取出来的,e b p加八,然后与我们的这个e s i加八来进行比较,我们看一下e s i加八是什么。
ex,好那么我们再往后边看一下,主要是看看一下他有没有写入的这个数据,1n x啊,bp加八,再看一下,我们全新的就是一个参数,bf 0这个啊也就是一bx,然后这个e bx呢在这里呢成了这个e d i。
它又传到这个扩里面去了,ex,一dx,5d,也是,加四。
那可能是我们忽略了某一些东西啊,这个课里面的话,应当是呢对我们的这个ebx这个对象的某一些地方的话,应当是进行了一些写作的一些标志进行一些区分,就是可能也是做一个距离的判断什么什么的。
然后就是说这个对象需不需要。
把这个进行一个绘制,那么真正的一个绘制的话,应该是在这后面啊,这个扩进行了一个处理,那么我们再进去看一下,如果看不到的话,我们直接分析后面的一个空啊,取出来哈,取到e d i。
e d i的一个数字bc 8,然后我们看一下di的一个趋向,di又进到这个库里面去了,bc 8,又到了哦,这里ex又传了一个数据进去,然后呢这里的b48 号到了e4 x这里。
那么e4 x呢又把这个相应的数据呢又进行了一次读取,那么读取之后呢,把它写到了这个ea x里边,那么这里有一个显著的一个操作,那么这个操作的话,那么可能是呢也就是排除那某些要绘制的这个对象。
可能是往这个ex这个列表里面起n e a x的话,来源于我们上一个参数看一下嗯,加c啊,也就是说它把它写到了这个e s应该是e s i加四这个地方里面,这个地址就明确了,好像看起来做了一些记录啊。
记录到我们的这个e s i这边,那么可能是这样的哈,也就是说它不断的对这个整个所有的对象哈,可能是进行周围的对象来进行偏离,那么哪些对象我们是需要来进行我们画面的一个更新啊。
那么在这里呢它进行一个偏离的处理,然后这里呢再对我们的数据来可能是进行一个更进一步的一个处理,那么我们在进到这里去看一下,在这里下一个断点,然后我们再往下面跟一下,311170,这个好像是所有对象。
这里有很多很多的列表,然后呢我们就进到了一个循环的里边,很大的一个循环,那么我们那么一般来说的话,可能是循环里面呢它可能会分开的啊,处理每一个对象的一个数据,那么我们找一下这个循环里面的这个扩。
啊这里有两个库啊,前面有一个,后面有一个啊,那么我们执行到这里的时候,我们看一下这个空,它里面管的是一个什么数据,那么我们进进来看一下这个框呢,它也没有这个相应的参数,看起来的话它是没有参数的。
至少这里直接return,那么我们直接把它落不掉,但是这里呢我们看ex它的这个后面的这个返回值,好像也没有被利用起来,那么我们再来看一下画面嗯,这个时候我们发现的话这个库啊我们找到了一些有用的数据。
我们看一下,那么所有有关窗口相关的,还有这地面的一些贴图的话啊,发生了一些变化,地面的贴图没有啊,但是cpu的占用率呢是没有下降的,那么这个时候我们的所以说这个扩的话应当是关于地面贴图的。
还有我们的背包的这些东西没有菜单没有了嘛,哈菜单相关的一个绘制按tab键盘,我们的背包也打不开了,下面的f一到f 10了也没有了,好那么我们记录一下,而且调用这个地方的话,调用这个库的地方比较多。
那么如果我们直接去看看有有什么效果这个地方,那么我们再进入到游戏里面,那么我们看一下这个时候的话,实际上人物角色所有的这个画面的话都不动啊,都不动了,那么说明的话应当是这个扩的话。
它关系到关系到我们它的参数不一样的话,可能是关系到我们所有的这个对象的一个数据的一个处理啊,可能都是在这个框里面的这个地方,那么目前确定的是这个菜单以及我们f一是f 10,还有我们的背包。
那么这些数据都是由这个过来会来进行这个处理的,还有地面的一个贴图,那么可能是由于参数的不一样,它可能还有其他的一些功能,那么这个扩的话,那么我们再来看一下前面这个框呢,哦1310啊。
这个是我们看一下e4 x,先看一下e4 x是什么,那么在这里的话,我们暂时来看不出来这个ecx是一个什么数据,但是我们看先看一下这个堆栈,按一下新号啊,在在这里定下定位到我们的e s p嗯。
e s p来应该是120,看一下好ac就是这个地方,那么我们按一下f2 之后啊,它的参数也是0c啊,那么我们在这里的a d p e s p啊,加上零碎啊,在前面这个库进行一下处理,看一下它的一个效果。
那么这个时候呢直接的出错了,说明我们这个破的话,可能他有一些数据呢需要到二需要用到哈,进行处理之后呢,后面的地方可能会用到,那么我们再来看一下,是这一句啊,因为我们在这里落魄掉之。
后呢后面这个语句呢受到了影响,那么所以说呢造成出错,好那么这节课由于时间的关系呢,我们呃就先分析到这里,那么下一节课呢我们接触这个地方呢,嗯继续分析。
P121:132-隐藏人物分析 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们接着第131课呢,呃继续分析怎么隐藏我们的这个建筑物。
那么首先呢打开我们的ood附加到游戏里面。
那么这是上一节课哈下的相应的一个断点,那么我们先把所有的断点呢先取消掉。
然后呢我们接着上一节课的数据来再分析,那么上一节课的话。
那么我们继续从这个位置来下断点,我们继续从这里分析,那么首先呢我们跳过这个扩的执行啊,直接啊这里有一个跳转,我们可以从这里呢呃修改,让他这样陪跳啊,直接就跳过了啊,就不会执行这个扩了。
那么我们再来看一下它的一个效果,那么这个时候的话我们发现了没有任何的这个效果嗯,那么我们继续的往后边看啊,呃这个地方的话我们当时的一个注释是大概是f一到f 10,一个贴图,那么我们继续啊往下边看一下。
那么再往下边的话就移到这个或者这个尾部了啊,这个地方我们还没有标记过,我们在这里下个段看一下,然后注意usp的一个变化,那这个usp我们发现它没有变化,说明这个扩的话里面呢它不涉及到相应的参数。
我们把它哈lap掉了,那么这个时候的,话仍然看不出相应的变化,那么我们在这个时候来到这个循环里面,来找这个相应的这个空,那么我们在这里下段啊,看这个地方会不会执行。
然后呢再往前面找一找一下这个地方我们也下断,然后我们看一下usp有没有变化,执行call与执行这个扩之后,那么没有变化呢,我们可以直接在弄不掉这个空,然后把断点取消掉,那么这个场景呢没有任何的变化啊。
那么我们在望着前面看,那么这里呢我们也可以把这个j一可以把它改为降低,让他跳过这里啊,那么这个框呢也不会被执行了,我们可以在这里下个段,他永远都不会断下了啊,因为跳过了。
那么也那么这个扩的话也不是我们这个建筑相关绘制的这个扩,那么我们继续往前看啊,那么这里呢也有一个扩呃,那么这里有个扩的话,它从上面这个地方啊跳转下来,那么我们可以在这里的时候来直接跳过啊。
这个后那么我们看这个循环里边呢一共有两个括,那么我们甚至还可以在这个地方修改啊,我们加深一下看一下,那么这个时候是小于的时候不能拆跳转,那么我们把它改为一个绝对的一个跳转。
那么在这些地方的话就断不下来了啊,那我们再来看一下,那么这个时候的话仍然没有任何的变化,但是有一点点变化的就是我们的,人物和我们的这个怪物呢,它相应的这个选中的这个血条呢不见了啊。
那么这个的话有可能这个地方呢就是我们嗯这个人物啊,怪物的选中状态的显示啊,其实啊这个相应的画面层,那么这个地方也与我们的这个建筑的话不相关,那么我们继续往前边看,嗯这里呢还有一些空。
那我们也跟他下一个断点注意一下啊,e s p的一个变化,按一下f8 ,那么没有变化的话,我们直接落户电话,好把这个点取消掉啊,再进入到游戏里面看一下,仍然没有变化,那么接着是这个库。
那么这里呢我们可以来直接这里下不来就把它跳过,跳过之后呢,呃就一直会执行到这里,那么这里呢我们下段的话就不会被断下,那么我们可以发现,那么这个时候呢我们的人物角色呢被隐藏掉了啊。
那么这个是我们人物角色的一个绘制,应该是可能是哈,但也不是绝对的,如角色,绘制,当然这个呢我们后边呢我们再做一个详细的测试啊,因为要把其他的那么也可能是由于呃其他的某几个啊跳转。
我这后面的这个跳转呢配合起来才把这个人物角色呃隐藏起来了,好的,那么我们重新可能是我们修改的地方过多。
那么我们重新再进一下游戏,那么我们这个建筑的呢,我们稍后再分析,那么我们刚才因为我们分析到,有一个地方呢可以隐藏我们的这个人物角色。
那么我们先把其他的断点呢先取消掉啊。
全部禁止,然后我们当时修改的是这个地方,它能够隐藏我们的人物角色哈,这个时候我们把其他的地方呢呃先就是先去掉单独的修改这个地方,我看能不能够隐藏,那么这个时候的话我们就能够隐藏我们的这个人物角色了啊。
看不到只能看到一个影子哈,这个时候好的,那么这个呢也算是一个功能,这些功能呢可能没有实际的一个呃作用啊,但是如果你是制作辅助的时候呢,它多一项功能呢也是一个卖点啊,这个挺忽悠人啊,看起来哈呃那。
么我们先把这个跳转啊,先把它备注一下,那么当然是。
实际上呢是通过这个扩哈,这里的话它调用的地方更多,那么我们直接在这个地方return的话,那么可能的话我们再来看一下效果,那么可能其他的玩家这一类的也可能会调用这个库啊,凡是是对象的类型是三幺的。
这里有三个参数啊,那么可能的话呃凡是对象呢嗯角色是三幺啊的这种状态呢,它可能都会隐藏,那么这里呢我没有看到玩家的对象,需要另外换一个区再看一下,那么我们这里呢我们换一个去看一下有没有玩家对象的地方。
我们再测试一下这个函数是不是可以把呃,所有的玩家对象呢都隐藏好的,那么这个时候我们换了一个区,那么这个区呢有很多的玩家在这里,那么我们再次把这个地方啊进行一个价码,看一下其他的人物角色会不会被隐藏。
那么这个时候我们发现啊,所有的这个玩家的角色呢都被隐藏了嗯,那么我们进到这个框里面去看一下,看还有没有其他的地方调用这个库,嗯但是在这个地方的下段,呢突然他就出错了啊,那么我们再次进一下游戏,好的。
那么我们再次来在这个地方下断啊,这里呢我们需要它的返回参数是三个,这个地方,啊前面要占了三个参数,调用的来源呢也不一样啊,我看一下调用的来源,我们选第三个吧,其他的地方也有调用。
那么我们先在这里下个段,先退回到这个地方啊,我们把它注释一下啊,这里呢我们修改为j一呢我们修改为jup,嗯可以达到一个隐藏,玩家的一个效果。
那么我们先把这里先改一下啊,这样的,那么但是呢另外还有地方来调用到这个地方啊,实际上武器呢没有被隐藏,那么说明这个武器的话,它另外还有呃,另外有地方呢在绘制,那么这里呢我们也turca看一下效果。
那么这里修改之后他出错了啊,那么证明这个参数的话,可能呢540c,那这里呢看起来它是三个参数,那么也可能它的ex这个参数呢有用到,那么我们移到后面来看一下,这个扣比较大啊,有很多循环啊。
前面来看的话是零碎,它的返回值,那么下一次我们分析的时候呢,先在这里下个段,看其他有什么地方啊,调用它,可能它的参数呢嗯还有其他的意义。
那么我们再次转到刚才的这个地址,那我们再进去看一下,在这里呢我们先退回来,在这里呢我们修改一个键盘啊,跳过它,然后我们进到里边呢,我们下一个断点。
那么这个时候呢有可能是这个插件呢它引起了一些冲突,那么我们把多余的这个插件呢把它移除掉,这个是高亮的这个插件啊,这个是命令条嗯,还有这个时装o d来把他留下啊,那么其他的这些插件的话。
暂时对我们没有多大的用处啊,那么我们先把它移动一下,移动到这里来进行一个备份啊。
然后我们再次附加我们的游戏。
首先这里我们把它改为下吧,那么实际上这个时候的话,我们的效果的话基本上已经达到了啊,那么这里所有的玩家实际上都已经隐身了啊,只是他的这个武器呢还没有隐身啊,那么我们嗯切换到这里的时候,他还是会出错啊。
啊那么我们看一下我们的断点,还有我们的硬件断点有没有设置,以及我们的内存断点了,都没有这个相应的错误哈。
那么也有可能这个游戏呢它的这个全局的这个钩子呢,被我们给它卸载掉了啊,也就是我们用的这个工具哈,可能是这个工具有问题啊。
我们再来啊,再重新的附加一下,让我们再次哈附加一下游戏,转到刚才的地址。
那么我们再次哈在这里来修改相应的这个跳转,然后再看一下嗯,我们进去啊,进去之后呢,这里我们不能够直接的修改啊,很明显,那么我们再来分析,按按减号再退回来,看一下它另外的呃几个地址。
那么这个地址我们是跳过了,再看一下第二个地址,那么这个地址呢我们也要把它备注一下啊,这个是我们人物角色绘制的,再重新进去一下啊,嗯这个过呢我们从这里呢也可以给它给它跳过哈,相关的这几个函数啊。
我们可以一起给他跳过,这个地方也可以修改,这是第二处跳过的。
那么上面这里呢是第一处,那么我们看一下,另外还有地方调用这个库,那么这里呢是第三个地方,那么之前呢它都会有一个判断啊,从这个地方开始,那么实际上我们看到啊,这前面这个库调用之后呢。
后面这里这个库呢它也用到了一个相同的一个呃,这个机制可能也是去骗你相应的这个对象,那么有可能是这种情况啊,可能必须要前面啊经过这个过来处理了这些数据之后呢,在用这个库来来调用,不会出错啊。
不然的话从这里调用的话。
它可能会出现一些未知的错误哈,那么这是一种猜想啊,那么我们也把这一段了啊,可以把它备注一下嗯,那么还有一个地方也调用了它,这是第四个位置,那么这里呢也有一个跳槽,好的,那么我们再次来重启游戏之后呢。
我们不修改这个扩,那么我们直接修改这个跳转来进行尝试。
那么首先呢我们转到第一个地方进行他的一个跳转的一个修改,那么这里呢我们改为降配,然后我们再这个时候的话,实际上呢我们的这个人物就已经把隐藏掉了,那么我们主要是来测试一下后面的这个功能。
但是我们发现修改这个地方的话,直接的修改的话,它也会出错啊,这个地方看来它是不能够直接修改的,他还有其他的一些观点。
那么我们再转到第一第一个地址啊。
再进行一下测试,那么可能是我们的这个扩呢,它他处理的这个数据哈,有被其他后面的这些代码呢所利用啊,所调用这个相应的数据,那么如果我们这里直接loop掉的话。
那么可能后面他在读取我们之前的这个数据的时候呢,就可能产生这个相应的异常,那么也有可能呢是我们的这个游戏本质呢,它有相关的这个检测哈,对这一类的括号,那么有如果你在这里下了断点。
那么呢他直接就给你报异常了啊,那么也也是也可能有这方面它对于一个关键,的代码呢有一个保护啊,有一个检测这一类的,那么各方面呢都有可能,那么我们先刚才呢我们是跳转到这个地址啊,那么跳转到这个地址的话。
那么这个框呢它也可能调用到前面的这个数据,那么我们从这里来直接跳过啊,跳到这个地方来执行看一下,那么我们看一下这里,那么这里有个a d d e s p0 c,嗯这个是什么意思,我们看一下。
那么也就是说这个扩的话,它实际上是可以直接的落魄掉啊,他压了三个参数之后呢,这里呢是直接return的,那么这里的话我们直接要跳的话,要跳转的话,就应该要跳到这个位置,跳转到这个位置的话。
这里有一个a d d e s p,或者说我们连这个过来一起落不掉啊,然后呢在这里呢再加上这个跳窗,看这样会不会报错,运行一段时间,那么这个词至少来短时间没有报错啊。
那么这个时候呢也能够达到一个隐藏的效果,那么如果这个功能能够达到了其他的地方呢,我们就可以不修改,那么这么久都没有出错的话,那理论上是可能不会出错了啊,那么出错的话可能就是我们这里呢这个括。
它调用了到了前面的这个相关的这个数据啊,当然现在的他还是出错了啊,关于这个出错这个问题呢,我们留到了下一节课呢,我们在再具体的研究一下啊,那么这种错误的话要诊断的话非常的麻烦,也非常的费时间。
那么具体我们定位的这个功能的话,隐藏建筑的话,那么都应当是在这个循环里面了哈,看来的话嗯那么这个出错的这个问题呢,我们在后面一点呢,再解决,那么如果我们是修改代码的方式,我们不能够实现隐藏这个人物的话。
我们也可以从这个列表里边啊,这里有一个列表呃,应该是一个机制,它可能是一个数组啊,这个啊那么我们可以进到他的库里面去看一下他的这个e s p加四,这个参数放到了e c x这里来,再退回来看一下。
那么这里的话进去的话,你这个参数来是sp加4+8+4,那么加四的话它放到了ec x,而ec x呢它放到了e di里面去,然后呢在这里的它会像这个e d i里面来写出一个al的这样一个标记,e d i哦。
然后呢你不可能产生跳转,也可能不产生跳转,d i e,那么如果我们看产生跳转的情况,那就走到这里啊,也是要往这个e d i里面呢进行写入一个什么数字,然后再让e d i来加一。
那么这个呢只有我们后面再具体的分析,那么如果我们修改代码的方式,不能够实现相关的这个正常的一个隐藏的话,那么呢我们可以分析它的这个数据啊,看它是通过哪些数据来判断的,那么我们也可以尝试修改它的这个数据。
好的,那么我们下一节课再解决这个问题。
P122:133-隐藏人物建筑物分析OK - 教到你会 - BV1DS4y1n7qF
大家好,我是虞姬香老师,那么我们修改他的代码的话,呃它程序会崩溃啊,会出错啊,那么这节课呢我们接着上一节课的嗯,这个分析的接口呢啊继续啊分析,那么首先呢我们看一下转到这个地址。
那么当时我们是修改了4354比零,还有修改的这个跳转哈,呃都会出错哈,运行一段时间之后。
那么根据我们的分析的话,这个过来肯定是与我们人物角色啊,这个画面更新啊,相关的一些数据的一个处理,它一共有三个的三个参数,那么接下来呢我们再分析一下前边的扣哈,因为这两个库的话,我们在呃跳转之后呢。
我们发现的话他这个数据呢会出错啊,那么我们再尝试一下呃,更改之前的这个判断,那么我们再往前面找的话,就到了到这两个位置啊,那么我们从这个位置上面呢,呃它这里也有一个判断,这里的话从这里来看呢。
它是一个数组,那么我们先来看一下这个数组里面是什么东西,然后我们转进转进去看一下它的类型,那么这个是三幺啊,是玩家的对象,那么我们再看第二个,第二个是怪物,那么这个好像是我们周围的这个列表。
这个也是玩家好的,那么我们先让它跑起来,然后呢我们到我们的机子单元看一下。
那么我们看一下更新的,呃周围的这个怪物对象,找一下,附近的这个对象,我们找一下,哦这里啊应应该是450f20 这一个,那么我们看一下这个,那么这个的话恰好这里显示的是我们的呃。
路径的怪物对象应该是附近的怪物呃,人物对象数组,对象数组,好的,那么既然是与它相关的话,那么也就是说在后面的话数据的一个处理的话,那肯定就是与我们的怪物,与我们的人物相关的这个数据。
那么我们把这个地方呢他这里比较的话,也就是说这个数组里面呢有没有这个怪物,那么如果我们直接让他跳转了,也就是告诉我们下面的这个呃扩的话,也就是说周围呢不存在这个怪物,那么我们再进去看一下。
那么所以说这个时候的话,可能是周围的这个人物和怪物呢全部都隐藏掉了啊,都隐藏掉了,但是隐藏掉了之后呢,它实际上还有一个,问题啊,那么就是我们在移动的时候呢,它也会受到影响。
当然这个功能的话虽然说有隐隐藏我们人物怪物的这个功能,但是呢呃具体的话应该说没有多大的作用啊,这个,好的,那么我们把它注释一下,这里呢我们能够呃隐藏周围的对象,当然周围对象在这里呢只是我们的人物啊。
怪物,还有就是玩家这几个对象呢,他们都隐藏,那么建筑物的这个隐藏的话,它也嗯可能还有呃另外的啊,那么我们再往前面找一下,那么这里呢也有一个判断,那么但是这个判断的话来源于就是我们的这个3117808。
这个机子的话,好像我们是没有见过,我们看一下。
好那么这个机子的话我们当时没有见过呃,这里呢它也有一个比较啊,那么我们看这个括它有没有被执行呃,也有被执行哈,而且它执行的地址的话,我们看它每次会不会变哈,是这个地方这里,因为它是从这里的话。
他应该是从这个对象里面取得加四这个位置的,不断的在取,那么我们再次运行,注意这里edx的一个变化,那么我们运行几次之后的话都没有变化了,那么可能这个扩的话,他可能就是调用到这个地方。
那么我们在这里呢也给它加一个jump之后看有没有啊,跳过它嗯,啊那么这个e4 x它的这个类型的话,这里是等于八啊,那么等于八的话,我们也不知道是什么类型,那么我们看一下啊,e c x等于八。
那么1b x这里呢他是把我们的ebx进行压榨,那么一bx的话,那么我们就来看一下ebx是什么,那1b x这个时候是零啊,因为我们的零七型比较,那么这两个参数呢我们也给他注册一下,不是平。
那么我们再来看一下啊,下面这个这个库,那么这个库的话,它实际上是把我们的呃隐藏周围周围怪物人物的这个,那么实际上呢他是把周围的所有对象的话呃,都调用了它的一个呃,相当于是一个对象的一个成员函数哈。
加四这个位置的成员函数,然后这里呢也是传递的同样的一个参数,那么可能的话它调用的库的话可能也是同一个扩,那我们先把这个地方呢取消掉,在这里我们下一个断点看一下。
这个时候我们发现呢它调用的地方实际上不一样啊,这个是417b0 ,那么我们,再次运行一下啊,一dx,那么这个时候e d x呢它不断的在变化,好像是,那么我们再取一个e d x的值。
因为每一个对象它不一样呢,它对象的里面的成员函数的话就不一样,兵临,b0 f0 ,那么b0 和f0 的话,那么极有可能就是来看一下它e4 x呃,那么从这里来看的话,b0 的话可能就是我们的玩家。
那这里是三幺,那么我们的f0 呢,那么看一下f0 e4 x f的话,这里是二一,那么是怪物啊,那么也就是说这这个扩的话,它可能是处理我们呃这个怪物和人物的这个相关的一个数据啊。
刚才我们已经有过了呃这个测试了,那我们再往前面看一下这个地方,我们把它loop之后,看有什么效果,那么这个地方我们落魄之后呢,就不能够走动啊,呃但是我们有关的这个建筑的话,它很大一部分来隐藏了。
那么这个的话可能就是我们这个建筑隐藏的这个库,可以隐藏这个建筑啊,那么这个功能的话可能还要实用一点,但是这个建筑隐藏的话看一下,但是呢他又没有隐藏的完全哈,这里还能够看到一个虚影啊。
那么我们根据这个扩去看一下,那么我们看一下这个括他能不能够把它弄不掉啊,呃从这里呢我们按f7 进去看一下,那么131,那我们在这里下一个断点看一下它是不是,那么我们可以看到这个一dx呢他一直没有变化。
那么可以就是说从这里来判断的话,我们初步的判断了这个地址的话,它不会改变哈,可能都是我们建筑啊处理方面的,那么我们先把它备注一下,这里呢是我们的建筑物,相关的分析相关数据,相关显示数据。
那么处理的一个函数啊,那么这个函数我们不处理它的话,那么建筑物呢可能就不会被显示,那么所以说它能够绘制一部分这个建筑物出来,那么我们转到这个函数里面去,嗯,这个函数我们看一下再倒回来啊。
我们看一下它的参数的一个个数啊,注意观察e s p的一个变化啊,d a c,好按下f8 之后呢,这个时候啊线程被挂起来了,那么再次按下f8 ,那么按下f8 之后呢,我们执行到这个位置的时候呢,他从b呃。
他从a c变成了b8 ,那么也就是说它在原有的基础上面加了零碎啊。
那么也就是说它的参数呢是三个啊,从这里实际上也能够大致的看得出,然后呢我们按f7 啊,跟着这个头部,那么我们尝试在这里更改,看会不会出错啊,然后再进游戏看一下,那么这个时候的话我们可以看到啊。
建筑物的话就没有虚影了,那么这个呢能够完美地隐藏我们的这个建筑物,那么所有的这个建筑物的话都被隐藏了,而且不影响我们挂机的这个功能,好的,那么关于人物的人物,怪物的隐藏的话。
我们之前有分析一个呃这个相应的一个距离哈,那么我们只要把那个距离改为零的话,实际上我们也能够达到完美的隐藏这个人物啊,那么实际上我们可以不不用啊。
不用来更改这个代码就可以实现,那么所以说这个人物和怪物的这个隐藏的话。
那么实际上在我们这一刻的话,实际上就已经完美的完成了。
当然我们可以看一下之前的这个人物的这个隐藏,那么之前的121这个地方。
啊在这个课里面有这个相应的机制,我看之前的有没有找出来,这是相应的一个特征码,我们已经进去看一下。
啊这个时候的话他应该说那个特征码呢有了一定的变化,那么这之前这里呢我们取了一个特征码啊,进行一下搜索,打开我们的c工具,那么看一下新的这个机子到什么地方来的。
对了呃,这里呢我们已经有有更改这个有搜索它的这个机制呃。
把它这个相应的特征码已经添加到这个机子列表里面了,我们直接在这里看,您应当进行,那么也就是这个地方,我们用c来改一下,那么它是否点类型的,那么一共有两个,那么这个时候呢我们把这个300改为零。
那么我们再看一下,那么这个时候的话,周围的啊除了自己之外的话啊,其他的呃这个玩家全部都已经隐藏了哈,那么这个隐藏的话比我们的代码隐藏呢呃更加的方便一些啊,那些当然也可以通过这个数据的话。
可能也能够找到啊,其他这个完美隐藏的这个扩应该也能够找到啊,这样的话我们的这个怪物人物啊都隐藏了,但是我们的自动挂机的话,应当说呢他还是可以用的啊,自动挂机的,因为我们嗯挂机的打怪的这个代码呢。
他是读的内存,的数据啊,而不是这个显示的这个数据好的。
那么这一节课的话,我们就到这个地方啊,呃那么顺便呢我把这个相关的特征码给大家。
在这个地方啊显示怪不得,那么这是它相应的两个特征码,一个是这个地方啊,一个是这个地方,啊改为零隐藏,five 5,the four rg mtc。
啊还有我们的隐藏我们的建筑物啊,那么隐藏建筑物的话,我们再按减号回来看,这个地方是隐藏我们的建筑物,那么这里我们恢复之后,那么恢复之后呢,这个建筑物就不会被隐藏了,那么如果我们要隐藏的话,这个地方。
这样就可以完美隐藏我们的这个建筑了,那么或者我们的改机器码的话,就是c201 c00 ,那么可以看到这里的啊,那么我们先把它恢复啊,就是这个地方,那么我们就把这一段特征码也复制一下。
动画这里呢是隐藏我们的这个建筑物,那么这节课呢我们由于有前面的这个数据的一个分析的一个基础啊,所以说花的时间比较少,那么这节课呢我们就探讨到这里了,那么我们下一节课了再见。
P123:134-神奇的游戏内存优化-减少游戏进程内存占用 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们来探讨一下嗯游戏内存的一个优化,那么实际上这个内存优化的一个函数的话,它实际上呢是一个呃a api函数,它可以设置来把我们的呃这个物理内存的这个数据呢。
交换到我们的这个虚拟内存去啊,也就是用我们的硬盘啊这一类的来做一个虚拟对称,那么这是它的一个本质哈,嗯那么我们来看一下md的一个说明,那么其中呢它有这样一条哈,他说如果这个参数二和这个参数三啊。
也就是这两项,那么如果这两项啊同时为零,x f f啊,那么实际上呢也就是我们的整形的16进制呢,也就是八个f,那么如果为这个数字的时候呢,那么它的本质的话,实际上呢就是把我们的这个物理内存呢啊。
交换到我们的呃这个虚拟内存上面去啊,进行一个置换,那么从而能够达到一个少占用内存的一个目的啊,当然当然这个函数的话,嗯建议呢就是说呃建议在我们加载好游戏的时候呢,只使用一次啊就行了啊。
那么实际上它本质上是不能够真正意义上呃减少我们内存的一个使用,它只是把我们啊物理内存的一个数据来进行一个置换啊,形成一个页面文件呢保存到我们的硬盘上啊,那么如果呃这些数据它不是经常的使用。
那么我们可以用这种方法来进行一个转化,来达到一个有效啊高效地利用一个物理内存的一个目的,那么当然这个功能的话听起来还是挺神奇的哈,有不少这个软件或者是外挂了,它都有这样带来这样一个功能。
那么比如说我们现在来看一下,那么现在我们游戏的内存的一个占用占用率的话,大概是618兆,那么我们打开第128课的代码,那么我们调用这个函数来进行一下尝试,那么转到了测试啊,这里呢我们随便选一个按钮啊。
可以取名为内存优化,那么我们再看一下这个函数的说明,第一个呢它是一个进程的句柄,当然如果是本地进程的话,我们就直接用函数来取得啊,直接用函数来取得就可以了,那么这里的话我们就可以这样来写,get it。
我们获得当前进程的一个具体嗯,然后呢后边这两个数字呢为零,x f f1234 啊,那么还需要一个f,那么实际上也就是我们的-1,好的,那么这个时候呢我们编译生成一下。
然后我们用u o d r进去加载,来看一下它的这个参数。
这个时候呢我们在这个函数上下一个断点。
然后让我们进行一下出租。
那么我们看一下现在的内存占用的话。
嗯是625兆的样子,那么我们进行一下内存的优化,那么当然会先断在这里,那么这个时候我们可以看到它这里的话,实际上这两个数字呢都是等于-1啊,传进来的这个三个参数的话,三个参数来全部都是辅音。
那么实际上我们有一个简单的写法呢,也就是直接穿三个这个-1进来就可以了,那么我们看到usp这里,那么如果这里我们整数的有符号数呢就是-1,那么16进制的数呢就是这个f f那么一共有三个参数呃。
为什么我们的进程句柄也等于-1呢,因为我们的这个实际上这个辅音呢它是一个五句柄啊,也就是我们的所谓的这个解体,如果是当前进程的这个函数的话,那么实际上它就是一个啊,转到这个地方,先让它跑起来。
然后我们转到这个系统的模块,这里呢应当是我们的这个mfc,mfc里面呢有一个同名的这样的一个符号。
那么所以说它会定位到这个地方来,那么如果我们另外打开一个o d来看一下。
那么从这里过去哈,该体啊也就是我们的啊当前的进程的句柄过去的话,实际上呢它的一个返回值的话,从这里就能够看到,实际上他始终都都是返回的一个-1啊,做的一个5g品啊,相当于是这样的嗯。
那么我们这个我们把它退出一下,不管它,然后我们再来看一下。
这个时候执行完了之后,我们看一下它这个游戏的cpu内存的占占有率。
那么这个时候的话只有十多兆啊,那么刚才的话我们这个游戏进程呢,它一共有600多兆的这个内存的占用率啊,现在的话只有几十兆,那么这样的话看起来的话效果很明显。
那么实际上他呃对于我们就是说呃不明白这个原理的人的话,感觉呢很神奇啊,但是这个功能呢不要反复的使用,那么反复的这个循环使用的话,它比较伤伤这个硬盘,因为你经过一段时间的运行之后的话,这个内存的占有率来。
他可能还会逐渐的会增加上去啊,那么只是说我们在使用的当时呢,它看起来这里呢比较神奇哈,那么我们更实际上可以看到这个绿色的话,它会缓慢的增长,那么因为它要用到相关的数据的时候呢。
它实际上也要从我们的呃硬盘上来,把这个要用到的这个数据呢只换到我们的内存里边来啊,那么如果你的这个cpu啊内存比较小的话,就能够看到那个硬盘的灯呢会不断的闪啊,所以说如果说这个用的次数比较多的话。
那么有一点伤这个硬盘。
好的,那么这里也有个简写的形式啊,那么我们刚才通过汇编也看了,那么实际上呢我们这里呢可以把它写成写成好几个数量,这两种形式的调用呢实际上都是一样的,我们可以用符号数来调用啊,传入啊,三个-1就行了。
三个-1,那么第一个-1呢实际上就代表了这个啊当前进程的这个句柄,当前进程的句柄它是一个固定的一个词啊,那么这一点我们要注意,当然你第二次再调用这个函数的时候,实际上它就不用没有这个明显的这个效果了。
只有第一次调用的时候呢,它有这个明显的效果,好的,那么这节课呢我们就讲到这里,那么我们下一节课了再见,那么实际上我们所说的这个虚拟内存的话哈,那么我们说穿呢,实际上它也不是很神奇。
那么这个虚拟内存呢也就是我们这里边啊设置的啊,这个在硬盘上的一个呃分页文件啊,这个就是我们的虚拟内存,那么实际上它是设置在我们的硬盘上的啊,那么呃在win xp的这个系统下的话。
我们打开呃打开这个工具属性啊,我们把这个隐藏文件把它显示出来的时候,那么我们就可能啊就可以看到这个啊page file。s y s,那么这个就是所谓的啊所谓的我们的一个呃这个页面文件啊。
那么这个文件的话实际上我们内存大的呢,大的话我们可以把它取消掉啊,或者把它设置小一点,当然如果你这个页面文件设置为零的话,那么刚才的这个函数的话,可能执行就没有效果。
嗯那么这里呢我们可以把它自己手动的设置一下啊,这样可以节省一些呃硬盘。
好的,那么这节课呢我们就讲到这里。
P124:135-D3D9_HOOK黑屏优化分析及地址定位 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们将整理一下黑屏优化的一个特征吧,还有一个呃d3 d9 的这个动态链接库的一个黑屏优化的一个,相关地址的一个定位,那么我们先打开我们的ot。
大头那么实现我们的黑屏优化的话,呃有两个地方哈都可以实现一个真正的黑屏优化,那一个是我们跳过这个获得一个执行,在主线程里边实现。
那么一个是在这个地方,那么第二个呢我们是进到这个d3 d9 里面去,直接对这个动态链接库里面的这个代码进行修改,让它直接返回来实现黑屏优化,那么这两种方式的话,实现的原理实际上都是一样的。
也就是不让它真正的呃更新这个图形,绘制这个图形,那么以达到一个节省我们cpu占用率的一个作用,那么首先呢我们可以从把这两个地址呢把它落魄掉啊,呃这两个地址lop掉了。
我们可以简单的也可以来进行我们的这个真正的黑屏的一个处理,那么这个时候呢游戏的cpu占用率呢它也会下降得很低啊。
那么实际上这种优化的话,给我们的呃cpu的比另外一种cpu优化的方式的话还要好一些哈,黑屏的优化嗯,另外的那种cpu的话,它是呃让我们的这个cpu进行强制的一个休眠呃。
它数据的话得不到一个及时的一个处理,实际上,那么另外一种优化呢,呃当然我们先把这个呢可以记录一下哈,这一段呢我们把它落魄掉啊,呃萝卜条呢或者是把它写写成啊,相应的这个无用的指令都是可以的啊。
比如说我们把它写成木啊,e x e x啊这一类的啊也是可以的啊,那么这样它也能够达到一个cpu占用率的一个降低啊,只要我们指令不改错啊,那么这里呢他不会出错的,那么这个是一个真正意义的一个黑屏啊。
真正意义的一个黑屏的一个处理,这就是那么除了这种方式之外,我们也可以把它记录一下,这里的一个hook,这是我们的主线程的一个号口,和平优化,嗯嗯那么我们提取一下它的一个特征码来定位,那么这个特征码的话。
我们直接可以就从这个地址这里定位,定位后面的就可以了,当然实际上最好的提取方式呢是从这个地方开始提取啊,然后加上相应的一个偏移,因为这这段特征码的话,一般呢它变化的可能性比较小,那么我们从这里开始提取。
那么从这里提取的话,它具有一个比较一个唯一性啊,那么因为后面的这一段呢会被罗卜掉啊,所以说在后面的这一段的话,我们就可以不提取了,就用这前面的这一段就可以了,好的。
然后呢我们打开c看一下它能不能够正确地定位到我们的这个地址。
那么这样定位的地址的话,它有两个地方,一个是527,一个是528,那么我们这个地方呢是58呃,在这里呢我们还可以加上一个e8 在前面的,从这个地方开始定位,那么从这个地方开始定位的话,前面的是七四啊。
然后星星因为这个呢它可能最有最大的可能性啊,这种跳转的话他肯定有变化,那么这里呢是一八,一八,然后呢,12345678,那么我们最好的让他去有一个唯一啊,唯一性,那么我们再来搜索一下。
那么这个时候的话他收到的地方的话就只有一个了啊,58呃,e c a这个啊,但是这样的话实际上它的搜索效率呢也不是挺高的,嗯可以考虑加上这一句,啊那那暂时就用这个啊来作为我们的一个特征吧。
那么但是呢它距离我们这个后面的一个距离,我们来计算一下,那么它的一个偏移的话嗯,就是呢我们这个地址来减掉我们前面的这个地址,那么我们计算一下这个偏移是多少,那么这个偏移是16进制的幺五,十进制的二幺啊。
那么我们这里呢加上幺五,那么我们再来看一下,对不对,这样加起来加上我们的腰嗯,那么加上药物的话。
我们就定位到啊50f f d r r b啊,如果我们用d b a来看的话,更加的清晰,那么我们需要替换的就是这三个字节啊,那么这三个字节呢我们只要把它替换成全部的九零就可以了啊。
那么我们也可以用在c一里面呢来改它也可以好的,那么在这个定位之后呢,那么我们来看一下第二种方式的一个定位,那么第二个方式呢我们就是来要跑到这个dx里边,d3 d9 的这个函数里边。
但是d3 d9 呢它是一个动态链接库啊,如果我们每次重新加载游戏之后的话,这个函数的地址呢它都会变化啊,那么一种方式呢我们也可以通过呃定位它的一个机制呃,然后去搜索特征码。
那么另外一种方式呢呃更简单一些呢,就是我们加上它的偏移啊,啊在这里,然后下段之后呢,我们看一下dx现在的一个数值啊,那么这个数值的话来看他与我们上次这个第三,第九的地址的话就不一样了。
啊它为什么不一样呢,因为他每次他加载的这个模块的机子了,它不一样,那么我们看一下它模块的机制是多少啊,第三第九,那么它模块的机子呢我们可以看到是5f3 啊,后面五个零啊,那么这是它的一个入口。
那么它的机子是5f3 的话,那么这个5f3 的话,我们可以用一个low的library来取得,那么另外一种情况呢,我们可以通过两个函数来获取msd里边这个有个有个load lib。
那么这个呢它可以获取啊一个模块的一个剧本,那么这个句柄的话实际上就是它的一个机制,那么呢呃除了这个函数之外的话,还有另外的一种,还有另外的一个函数啊,还有一个getting more handle。
那么还有这个呢它也是一样的,也是模块的名字取得的也是一个模块的地址,那么实际上的话呃,这两个函数呢它都可以来返回我们的一个呃模块的一个地址啊,那么一般呢我们这个动态链接库已经载入之后呢。
一般我们是用这个get more handle,它取得它的剧比呢实际上就是它的一个呃机子,这个就是取得的一个机制返回值啊,那么在这里的话我们他已经载入之后呢,我们就直接可以简化的,可以不加啊。
不加他的这个路径名,直接呃取模块的名字就可以了,那么要取得他的机子的话,也就是那个53f的话,那么我们直接就可以了,在这里呢,加上一个第三个,第九个第lol啊,这样就可以取得他的地址了。
那么现在的话我们就这样呢。
就等于相当于等于我们的这里的这个五三,还有f啊,嗯5f3 这个啊,第三第九,那么它这个地址我们要怎么计算出来呢,那么实际上它等于这个取得的模块地址,再加上一个偏移,那么这个是偏移是多少呢。
我们需要跟他算出来,那么最终呢才能够得到这个地址,那么偏移的话,现在我们的模块地址就是3f00 啊,那么偏移的话就用这个来减掉我们第三第九的呃,不是呃5f3 d6634 ,那么他就得到这个偏移了啊。
那么在这里呢我们把这个公式呢把它带进去就可以了,夹在这个地方,那么我们也可以把它直接计算出来啊,加上我们后边这一部分,那么最终呢得到的值的话啊,就是这个它的一个机制。
当然这里呢我们也可以直接把它计算出来,计算出来的话我们就是前面的这个呃5f3 呢,我们把它去掉的后面的偏移就可以了,那么最终的公式呢嗯就是这一个,那么这两项我们加起来的话,就能够得到它的一个机子。
那么得到它的机子之后,那么我们怎么做呢,那我们先转到这个地址,那么我们当然因为他这里的话push ex它只有一个参数,那么我们可以按f7 跟进去,当然后面这里我们也能够看到它是return 04。
return 04呢就是一个c a20400 ,那么我们只需要在它的函数的首部啊,这个地方,那么前面的写上一个return啊,这个地方或者是这个地方都可以,因为前面这个是个瓜子粒,没有任何作用的。
它就是用来hook的时候呢,用来定位的,实际上哈就是hook的时候用来定位的,那么我们只要再把这个八bf f录不了,把它写成c20400 ,那么也能够定位之后呢,也能够达到我们实际的这个效果。
好那么我们复制一下这一段,那么这一段的话它也相当于是一个d3 d9 的一个特征码,前面他这个不是英特尔。
三是洛夫哈,这里它与我们普通的函数还不一样,好的,那么这个的地址能够定位了,定位之后呢,我们直接往里面嗯,写一个我们的这个c20004 就可以了啊,return 4啊,在这里呢我们也可以写入。
那么它的一个地址的定位呢,就直接根据我们之前的那个加法啊,但是呢我们在写之前呢,我们也需要把之前的这几个字节呢需要把它保存一下啊,需要把它,因为我们恢复的时候呢,我们需要用到这三个字节啊。
那么之前的呃我们这个地方呢它也是那也是处理了三个字节,那么把这三个字节落不掉啊,或者是做其他的都可以,那么这是呃这里的一个地址的一个进攻定位,他需要来搜索这个特征码之后呢,加上这个幺五啊。
那么一共呢有这两个地址好的,那么我们把它整理一下啊,这里那么在整理的时候呢,我们需要给它定义,就生成地址的时候呢,需要给它定义两个红啊,那么都是一个黑屏的一个处理,less black。
啊那么一个呢我们是主线程单元的一个hook来实现,那么这个地址呢到时候我们通过代码来生产,那么第二个呢我们是,vs,当然这个名字你可以自己定义哈,这是我的一个命名的一个方式。
当然后面呢它是生成之后的一个地址,那么这个地址的话我们可以通过它的一个特征码的一个定位来生成,那么一个是由特征码定位来生成,那么另外一个呢我们是呃通过,通过搜索这个特征码来生产。
那么我们把这一段冷啊复制之后呢,提到前边啊,那么这是我们的呃,第三第九啊,这是我们的主线程的二口,第一个通过搜索这段特征吧,然后加上幺五偏移呃,取得他的地址,可可的地址。
那么第二个呢也就是我们的这个地址,当然实际上我建议的话呃,用方式一可能要好一点,因为这个第三第九的呃,因为不同的系统啊,他的这个这个特征码它可能不一样,因为它的动态链接库可能不一样,因为它版本不一样。
这个第三地球的版本,那么可能的话,当然具体用哪一种方式呢,这个看你自己啊,那么这两种方法呢这里都给get出了哈,那么在这里的话它是写入一个return 4啊就可以了,写入这三个字节。
那么前面的呢我们是呃写入三个90就可以了啊。
九三个九零,或者是我们刚才这里加的呃。
mobiex啊,这个也看一下,或者是其他三字节的指令,或者是8b3090 都可以,那么我们把这两个呢都注释一下,在这个地方,那么要写入的啊,hook的数值,for the dead。
那么等于我们的呃8b c c0 ,还有九零,那么或者是我们的20x900 x90 ,这是九零,那么这两个参数作为一个合格的标准呢都是可以的,那么下面这种呢它的一个hook的一个数据的话呃。
要有一点改变啊,当然就是这个c2 ,我们的c200400 ,当然这个只是为了好看,那么后面这个小于八的数值的话,可以不加这个16进制0x的前缀也是可以的,当然后面的这个0x90 。
那这个备用的就不能用了,在这个地方好的,这就是我们的这个数据,那么我们在这里呢给大家留一个作业哈,那么作业的话就是按照第56课的哈,这个代码呢来生成最后的这个改写的,把后壳改写的这个地址。
把它自己的生存成一个,好的,那么这一节课我们就讲到这里,那么下一节课呢我们一起来完成这个作业哈,当然能够独立地完成是最好。
P125:136-自动生成黑屏优化基址BaseBlackScreen - 教到你会 - BV1DS4y1n7qF
大家好,我是俞錦相老師,上一期我們一起分析了怎麼來實現我們的黑屏優化的兩種方式,我們都進行了討論,一種是主線程的一個hook,一個是第三第九的動態鏈接庫的一個hook,那麼我們現在再來整理一下。
那麼第三第九的話,我們就是搜索特徵碼,特徵碼它一共有兩種方式,8B3090,那麼它實際上就是這兩條指令,我們在這裡再把它注釋一下,那麼如果是前面一種方式,它就是這幾條指令的一個機器,相當於是。
那麼第二種方式就是log,三個log來實現相應的一個hook,那麼但是要實現這些相應的hook的話,我們都需要先對它的一個機子來進行定位,那麼這一節我們就是要自動的生成這兩個機子。
那麼前面的一個機子的話,主要我們就是通過搜索特徵字,特徵字串,那麼我們在第56課的代碼,我們有講過,那麼我們再次打開第56課的代碼,那麼前面我們用到的機子的話,一共有21個機子,打開的文件打開錯了。
當時這個,機子定位的。
對了,我們還有一個機子定位的同一件,主要是在這裡面來實現的,那麼一件更新機子的,那麼之前的話,實際上我們已經有更新,第二,一共有21個機子,那麼這裡是第22個,那麼我們可以把它的代碼來進行一下複製。
修改就可以了,在它的基礎上,那麼我們把第21個機子複製一下,在這裡,那麼這裡來改為22,首先我們把特徵字串,這個字串複製進來,然後它的一個偏移,我們也給它加上,那麼這三行我們都可以加在這裡。
然後在這裡的話,我們只需要搜索一個就可以了,加上相應的一個處理,那麼這裡我們把它的特徵碼複製出來,放到特徵碼,搜索這裡,那麼另外下面這裡我們有一些改動,當然進程不需要改動,那麼這個地址我們需要改動。
那麼這裡我們取它前面的528,這三個數字,528,那麼這樣的話,我們是跟它搜索一個它的一個起始地址,搜索的,那麼搜索的範圍,我們在它的基礎上再加上1萬,那麼這樣的話,我們就能夠大大的節省搜索的時間。
不然的話它會搜索很慢,它整個進程都要搜索,它從400開始搜索的話就比較慢,因為距離它的距離比較遠,那麼我們以這種方式來搜索的話就比較快,就比較快,而且它的變動的話,如果你怕它變動的話。
這裡數字我們還可以設小一點,設成527都可以,這樣的話,它距離就比較近,距離比較近,那麼這裡設好了之後獲得這個機制,但是這個機制,我們它距離我們這裡還有一個15個字節的,一個的一個偏移。
那麼我們也需要把它讀取出來,那麼這個時候我們需要讀取機制加上,腰尾的偏移,那麼讀取完了之後,在這裡定義紅的時候,我們這個是主線程的,這個紅黑屏優化的,那麼我們在這裡需要改一下,那麼這裡是R2。
後面我們肯定這裡也要進行一個修改,黑屏優化,主線程,黑屏優化,機制,那麼在下面這一行,我們也需要同樣的進行修改,在上面這一行,我自己想,因為這裡它是顯示在屏幕的,那麼這裡修改之後的話。
那麼這下面它是寫到文件的,做了一些修改,那麼這裡,好的,那麼我們編譯生成一下,看一下它生成的地址是多少,對了,這裡還需要另外一個參數,它要需要寫到文件的詳益的指針,需要一個,好,那麼我們來看一下。
那麼現在生成的這個是多少,是8B2,這個明顯的是錯了,我們生成的地址,那麼正確的地址的話,應當是在這個位置,528110這個位置才是正確的,那麼我們看一下為什麼這裡它會出錯,再來檢測一下,那麼這裡的話。
首先它是一個掃描到的一個地址,那麼我們要看一下它這個地址是否正確,那麼如果這個地址準確的話,它在這裡再加上我們的要,出現成黑屏優化,那麼我們把它搜索到的地址,我們也打印出來看一下。
那麼我們看一下這個地址究竟是多少,對了,這裡我們不需要進行讀取,這裡我們多了一句,因為平時的我們這個機制的話,我們都需要了再加上一個讀取,那麼這裡我們應當是直接打印出來就行,這一行我們應該注釋掉。
這一點有一點不同的,實際上這裡我們就是直接打印了,搜索的地址,應該就考驗了,因為平時我們要讀取這個機制的話,是因為在這個位置它還需要讀取的,這種它還有一個括號,那麼我們才需要從這個地方開始我們的讀取。
比如說F5F930,這種我們才需要這種讀取方式,那麼我們再來檢測一下,這個時候應該就對了,528ECA,528ECA,對,它搜索到的地址,那麼我們應該加上,還要加上一個遙股,但是我們加上之後。
不需要把它讀取出來,那麼這裡我們需要做一個改動,那麼這裡我們不需要這個函數來讀,那麼我們直接加上就可以了,像這裡,直接加上偏移就可以了,那麼我們審閱讀取的這一步,528EDF,528EDF。
那麼這個時候地址定位就準確了,那麼然後我們就可以往這裡寫入3個90,就能夠實現我們真正的一個黑屏優化了,那麼這是第一個地址的一個定位,當然我們在這裡的話,還有另外的一個地址,我們也需要進行一個定位。
當然這個定位的話,我們就需要在我們的動態鏈接庫裡面,加入我們的代碼才可以,那麼這個的方式又有一些不一樣,因為它是動態生成的,實際上我們不需要生成這個機制,不需要生成這個機制。
那麼這裡我們可以了把它進行一個初始化,也就是在動態鏈接庫,這裡我們可以把它定義成一個全局變量的一個形式,那麼這個變量,那麼這個變量的話,我們在動態鏈接庫載入的時候,我們把它進行一個初始化,那麼好的。
我們把這裡另外打開一個,這裡我們的生成已經成功了,成功的時候,我們再來看一下,獲取一下它的一個機制,那麼這個時候,我們就能夠自動的出現成黑屏優化機制了,自動就可以出來,當然另外一個的話。
我們需要了打開134克的代碼,那麼因為這個地址,它不能夠在我們的,它不是固定的機制,所以說我們不能夠把它生成一個紅,我們需要動態的進行一個定位,那麼動態定位的話,我們就把它寫在測試1這裡。
那麼動態的定位的話,我們來看一下,看一下我們的資料,就是這一段,然後把它注釋掉,注釋掉之後,我們首先取得它的一個模塊的機制,再加上這個偏移,實際上就是這一句,那麼我們在這裡給它定義這樣的一個全局變量。
然後對它進行複製就可以,那麼全局變量,我們在一個地方把它進行一個初始化,就等於這一句,好的,然後我們獲得了它的一個機制之後,我們打印出調試信息,好,那麼我們在這裡也把它編譯生成一下,那麼看起來很簡單。
也就兩句代碼就完成了,關鍵是要明白它的一個原因,那麼在這裡,我們還需要對它強制的進行轉換一下,因為一個是Trivial,一個是Dword類型的,那麼實際上它本質的都是同一個類型。
那麼只是這裡邊它需要強制的進行轉換一下,對了,這裡它也需要,如果是這裡是-1的話,它也需要進行強制的轉換一下,Handle,這是上一期課,那麼本質上這兩句代碼也是一樣的,那麼我們打開調試信息的查看工具。
點一下測試。
那麼我們再來看一下,這裡可能沒有完全的編譯,重新再編譯一下,編譯生成一下,那麼這個時候我們可以把我們的OD退出來,因為這個時候地址是沒有變的,就是79F的要重新啟動遊戲之後才會有變化。
那麼這個時候我們可以把我們的Od退出來,因為這個時候地址是沒有變的,重新啟動遊戲之後才會有變化,那麼這個時候我們可以把我們的Od退出來,因為這個時候地址是沒有變的,重新啟動遊戲之後才會有變化。
那麼這個時候地址是沒有變的,重新啟動遊戲之後才會有變化,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,那麼這個時候地址是沒有變的,所以我們可以把Od退出來。
那麼這個時候地址是沒有變的,好,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來。
那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來。
那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的。
所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來。
那麼這個時候地址是沒有變的,所以我們可以把Od退出來,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來。
那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的。
所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來。
那麼這個時候地址是沒有變的。
所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來。
那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的。
所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來。
那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的。
所以我們可以把Od退出來,那麼這個時候地址是沒有變的。
所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來。
那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的。
所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來。
那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的,所以我們可以把Od退出來,那麼這個時候地址是沒有變的。
所以我們可以把Od退出來,(音樂),(音樂)。
那麼可以看到,5F300就是它的機子,這裡它取得的,那麼如果它加載的機子變了,那麼這裡它會跟著變,那麼只要我們的偏移對了,它計算出來的地址,始終都會是對的,好,那麼這幾個我們暫時就討論到這裡。
那麼機子我們既然定位好了之後,那麼下一節我們就一起來看一下,怎麼來實現我們的hook,那麼實際上實現hook也比較簡單,就是往地址裏面寫入數據就行了,那麼大家自己下去先完成一下,那麼這裡就是自己寫代碼。
代碼完成兩種方式的APU化,取消這個優化,也就是一個hook,與我們的反hook,hook與hook,那麼也就是說我們要優化的話,那麼有時候我們不需要優化了,我們需要還原,那麼這兩個功能。
大家把它寫成函數,把它寫好,當然兩種方式的都把它寫一下,好的,那麼這幾個我們就講到這裡,那麼這裡我們就把它寫成,優化就這樣也可以,代碼我們把它複製出來,那麼我們就把它複製出來,那麼我們就把它複製出來。
那麼我們就把它複製出來,那麼我們就把它複製出來,那麼我們就把它複製出來,那麼我們就把它複製出來,那麼我們就把它複製出來,那麼我們就把它複製出來,那麼我們就把它複製出來,那麼我們就把它複製出來。
那麼我們就把它複製出來。
那麼我們就把它複製出來。
那麼我們就把它複製出來,那麼我們就把它複製出來,那麼我們就把它複製出來,那麼我們就把它複製出來,那麼我們就把它複製出來,那麼我們就把它複製出來,那麼我們就把它複製出來,那麼我們就把它複製出來。
那麼我們就把它複製出來,那麼我們就把它複製出來,(音樂)。
P126:137-完成2种方式的游戏黑屏优化与取消优化代码设计 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们嗯来完成了两种方式的一个黑屏优化啊,与其取消这个优化,那么首先呢我们,打开136克的代码。
那么首先呢我们把之前呃自动更新的这个图文件啊,把它复制过来,因为这里边呢以我们最新的这个基地址,好了,然后呢转到我们相应的机子单元,那么这里呢能够找到我们合格的地址,那么我们可以开始写第一个函数。
那么但是为了区分好的话,我们把它放到这个功能封装这里,那么这里呢我们可这里的函数呢我们可以直接调用化,无用呢,呃挂在我们的主线程单元啊,像这什么函数,那么在这里呢我们写一个hot函数,bug黑屏来。
那么黑屏的时候呢,这里呢我们把这个hook呢圆hook呢写在一起啊,这里我们给他写一个hook的标志,the flag,那么写好之后呢,我们相应的代码呢我们需要转到cp p单元来完成。
那么这个符号呢可能就会出现重新从定义,那么设计的思路的话,还是进行on ho,那么如果标志为真的话,我们在这个位置进行了黑屏处理,放开,那么如果标志了五角,那么我们在这里呢进行了hook on ho。
恢复显示,那么在这之前的话,我们需要来打开135克的代码啊。
获得他的一个修改的一个数字,或者是136克,这里也有准备,这里是要hook的这个数据,hook代替。
那么机子有了我们第一个写的时候呢,我们需要一个hot代替,就是我们要hook的这个代码啊,这些代码或者是全九零,或者是前面的这个指令啊,move ex到ex还有logo,这两条指令呢加起来一共是三字经。
当然这里呢呃你by条类型,然后呢我们进行写入就可以了,但是呢这是我们hook的这个数据,hook代替我们讲,那么另外我们还需要一个数组用来还原。
应该叫fia on hot dt或者叫恢复恢复显示的这个数据,那么也是三个字节,那么这三个字节的提取的话,我们需要来,到135克的分析里面能提取相应的代码。
那么首先呢我们可考的是这个位置,那么它原始数据呢是50f f第二,那么我们需要来把这个五零,f f d2 啊,放在这个地方,这里是50f f d2 ,好的那么放到这个地方之后呢,我们就可以开始处理了。
那么hook的时候呢,我们是写入数据,on hook的时候呢,我们也是写入数据,只是写入的数据的不同,那么这里呢所以我们去外滩啊,呃跨进程呢写入就可以了,那么之前我们讲了有一个伪距比啊。
当前进程的聚丙它都是-1,那么所以说在这里呢我们可以直接的转换一下安全就可以,不用调用这个函数了,直接写不移就可以了,嗯然后后面是我们要写入的机子,应该是头文件的这个啊,我把它复制一下b,嗯嗯。
那么这里呢我们把它转换成指针类型,要写入的数据的话,就是我们的hook bey,好,后边呢是我们要写的字节数啊,三个字节就可以了,嗯然后最后这里呢我们实际上写入的字节呢我们可以制空就可以了。
那么另外我们要恢复的时候呢,我们也很简单,直接在这里呢写入on hook代替就可以了。
好的,那么这是我们第一个函数,那么写好了之后呢,我们先编译生成一下,这里呢少一个分号啊,这里在报错,啊默认参数呢只能够投文件的时候呢,我们在那里定义一个默认的参数就可以了,再看一下什么地方有错呃。
需要再重新再编译一下,好的编译成功之后呢,我们直接就可以调用这个函数,那么调用的时候呢,我们可以在测试呃,测试窗口呢添加我们的添加一个框架啊,复选框控件,按这个框架来给他关联一个变量,布尔类型的直接。
好测试关联的这个变量,那么我们双击进去,在他的单机事件里面呢,我们给它添加代码,首先我们把窗口的呃数据来更新到我们的变量里面,然后呢直接用它来调用,就可以,hole black ray啊。
然后直接把这个控件的值传进去,用它来做一个参数,这样呢就能够进行的一个黑屏的一个优化,那么实际上这个呢也不叫黑屏的优化,应当是说呃关闭我们的显示的一个更新啊,这样可能更有活力一些。
因为它是实际上不是说是关闭的,这个这个时候我们看到整个画面就不动了,那么实际上呢它是一个显示画面的话已经关闭了,那么这里的话占用率的话是非常低的,这个时候但是呢它不影响我们的走动啊,跑动啊这一类的。
比如说我们在这里左上角这里点一下,或者是调用了寻路的函数,它应当呢还是在跑,但是这个时候你看一下,我们如果这个窗口与遮挡之后呢。
它的画面,呢就不会更新了,当然如果我们是把这个呃啊hook了。
你看一下它实际上是实际上是在走路的,然后比如说我们再关闭一下,再点一下这里他应该也在走路啊,我们再把这里关掉啊,可以看到了它能够正常的行动,能够正常的使用,好的,那么第一个函数呢我们已经测试成功了。
那么第二个函数我们应当怎么写,那么我们还是呃先转到定义声明这里吧,那么我们这里来写成两个函数,那么这个呢我们把它改一下名字,或者后面这个呢我们给它加一个后缀法,d3 d请推这个户口。
那么第三第九在这个赫课呢,我们在他前面的基础上来进行一个修改,复制一下前面的这段代码,那么这里加上一个第三第九,那么在后面这两个人我们都不需要改改的,只是我们hook的这个数据。
那么我们从第135课提取它的这个代码,那么我们可以看到应当是这个位置把比f f5 ,这是它的原始数据,也就2号这个数据,8p f f,然后呢我们的第二个数据hook代替这里的呃,应该是return啊。
c200 c20400 ,c2 ,零四,零零,那么这就是它的这个hook的这个数据,好的,那么我们第二次啊,第二种方式呢我们也进行一下尝试,在这里呢当然我们也可以另外添加一个框架。
也可以来直接就用这个框架把之前的这个复制一下,然后呢,复制一下第三第九,当然还有一点需要改,就是他要写入的这个机子的话,实际上不一样,也就是这个地址,那么这个地址的话,因为它是动态加载的呃。
我们需要动态来的定位这个d3 d9 的动态链接库,那么136克的时候,我们也给出了这个方法,也就是呢我们可以定义一个变量,等于它加上它就可以,当时我们是这样写的啊啊这一句的啊,复制出来。
好那么这里我们把它写写好之后呢,进行一下相应的替换就可以,每次我们都需要进行一下呃这个数据的一个定位,那么注意要注意的一点呢,是这里的它返回的数值我们需要转换一下,不然它是指针对型。
再来加上这个偏移的话,呃可能呢就会偏离我们原有的这个机制啊,因为我们知道呃不同的类型,比如说呃英特尔行二好,这个i加加之后,比如说i的初值等于零的话,那么这个时候i加加了实际上是加的四啊。
它这个这个指针类型的话是加到四,它是本身它类型的一个呃长度这样的加群,所以说这里呢我们一定要小心一点,啊这里我们需要重新再编辑一下,语法错误,这里多加了一个等号,然后这里我们调用的时候看有没有错。
再重新编译生成,好的,那么我们现在看一下cpu的占用率40%的样子。
那么我们关闭之后呢,所以有时候我们看一下它的占用率的话,只有23%左右吧,最高呢在4%,差不多下降了十倍的样子,然后呢这个时候如果窗口一刷新的话,它就是黑屏的啊。
这样我们也可以给他给他刷一下这些所有的显示了,他都不会来更新的,就是上一次它显示在窗口界面上的这个画面。
当然如果我们这里应该应该啊这个相应的画面遮挡的话。
那么呢它就不会更新啊。
好的那么这两种测试方式呢,我们看到它效果都是相同的,只是呢你呃后面一种呢它对不同的游戏啊,可能都有一定的通用性啊,对过程不同的游戏来可能都有一个通用性。
而前面一种呢它需要呢呃针对了我们具体的游戏了呃。
进行了具体的一个分析啊,这里,好的,那么我们保存一下我们的代码。
好复制一下,那么这一节课呢我们就讲到这里,那么第二种这个方式的话,应当来说这个函数的话它比较有通用性,但是这一点呢他就是说还要最好的是还要加上一个判断,就是防止了这个第三第九的中端链接过来。
他没有加载的时候,最好来做一些相应的提示信息,那么还有最好是做一个版本的一个检测,那也有可能这个动态链接库它版本不一样,那么所以说它这个偏移的话也可能是不一样的啊,那么这一点呢还需要自己下去测试啊。
那么这里的教的只是一种方法,但是呢要活学活用好的。
那么这节课我们就到这里,下一节。
P127:138-分析游戏气功对象数组及属性 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课我们主要分析一下气功对象的数组,那么以及它的属性,那么在分析之前呢。
我们先把137课的代码里面的有一个bug改一下,这个先选中我们的内视图one table,然后这里read combo代替profile,那么这里添加一个判断文件是否存在的代码。
那么如果这个这个文件它已经成功的打开了,我们才继续的执行后面,那么如果没有成功的打开,那么我们就直接返回,如果没有再去判断的话,那么在后边的这个循环呢可能就会一直的执行啊。
那么造成了我们的这个窗口界面呢显示不出来啊,嗯会一直的循环好的。
那么接下来呢我们开始分析我们的数据,那么打开我们的c e不加到游戏里面,那么附加到游戏里边之后,我们来看一下哈,在分析之前呢,最好所剩的气功的点数的话,最好是嗯多一点啊,方便我们我们分析。
那么一般来说呢我们的这个对象的这个这个点数的话,呃,在这个对象属性里面,可能它也会存在这样一个属性词,那么某一个气功它加了多少点,当然在最前面的课程里面呢,我们已经分析过呃。
有两个数组它都都是以字节类型的,用来存放到我们的这个气功的点数,但是气孔的这个对象呢我们还没有分析,那么今天呢我们以这个以花钱供嗯这个气功能为例,那么现在的点数呢是14点。
那么在这里呢我们选一次角搜一下14,然后我们再让它点出来,加一点收腰五呃,那么收两下之后呢,这个时候就出来了哈,它相应的这个数字就出来了呃,出来之后我们来看一下它的一个访问,那么前面这两个机子的话。
好像是我们之前分析的这个气功点数的数组,我们先来看一下它的内存区域,那么它的内存区域的话,我们这里呢一五是零,f表示移花接木,那么前面的这个年龄呢应当是幺五,这里有个ea,e a e c。
这个看不太出来啊,这个我们暂时做一个标记,这个可能不是数据,那么我们再来看一下这个数字,它的热情区域,那么这里是零五,一四来代表前面的这个狂风万破,它加了20点,这里0c表示这里的破天一剑。
加纳斯12点,这个零六表示的莲花灰灰飞舞啊,加了六点,这个是九点啊,这个幺四呢16星级的幺四代表29,那么这个是气功点数的输出,3333,那么我们再来看一下这个的类型区域,你们俩要,冥币呃。
这个的话看起来有点像是一个我们的对象,但是不知道是不是,那么我们先在这里呢加上一个访问啊,然后这个呢我们也加上一个访问,包括这个气功,气功的数组呢也加上一个访问,好,这下面的也加上一个访问。
然后呢我们再次,呃更改它的数值,那么首先我们来看一下气功数组2f这个,这个呢他没有访问,我们不管他,那么这里呢也是一个读取的访问,那么我们应该是要找写入的。
那么这里的话也应当是一个我们看查看一下反汇编嗯,也是一个赋值的一个语句啊,然后下边呢有一个呃数据的一个移动啊,sd啊,数据块的一个移动,从1i i来移到我们的d i d点,那这个2806。
机库呢它移动了015啊,一共呢也就是0~15了,一共有这里一共有16 16个单元,那数据的一个移动,我们看一下这个18118,看一眼看一下这个8118是什么,8118好像是这个。
那这些的话都不像是我们的对象啊,那么可能的话我们是搜错了,那么说错了的话也有几种情况,也有可能我们是收的时候呢不小心哈漏掉了某些数据,那么还有另外一种情况呢,可能就是连他的对象的话也是随机的呃生成的。
那么我们在这里单击了某一项数据之后呢,它的这个对象呢可能是重新生成的,那么这样的话它来达到一个保护数据的一个物体,也可能是啊,那么我们先尝试一下,搜一下变换的一个数字,那么我们再重新搜一下,收未知的啊。
首先呢我们修一下四字节,然后呢我们说一下啊,v变动的数值,那这样说的话比较多,那么然后呢我们点一下这个移花接木,然后我们搜一下变动的数值,然后呢再反复的时候未变动的数值,这里我们说错了,我们当时。
我们应当是收四字节才对,这个地方,那么再重新搜一下公共支出是,然后呢在这里点击之后呢,我们搜一下变动的数值,然后再使用微微变动的数值,而且这个数字的话我们看一下呃,如果是对象的话。
它是一个地址肯定是大于一八,那么如果呢是我们表示的点数呢,它也应当要大于一七,那么这里呢我们搜一下比一五大的这个数值啊,或者是比17~17大的这个数值,好然后呢我们再改动一下它呃。
这个时候呢搜一下变动的数字还是比较多一点,然后说一下未变动的数值,那么我们再走动几步啊,这个时候呢再来说下未变动的数值,啊然后呢我们再最后一次啊加一下这个对象,20搜一下电动的数字。
然后呢再设未变动的数值,但是这个数量也太庞大了哈,那么这种方法的话可能也不可取呃,不可取的话,我们可以来呃换一种思路啊,呃搜一下我们发包的时候啊,因为我们在,我们在点这个加点的这个气功的这个扩的时候呢。
嗯加点的时候应当它有一个数据向我们的服务器发送,那么在发送之前呢,他肯定也应当也要访问这个对象,因为他要从这个对象里面去取一些数字来表示啊,是呃对某一个气功进行了加点,那么也就是说这个对象的话。
它里边应该有一个身份的一个标识的一个i d,那么我们可以尝试从这个id呢来进行入手,那么如果这样我们是搜不到的话,那么我们关掉啊,关掉我们的c,那么从这种情况我们看来好像是搜不到的嗯。
搜不到的话,我们用g来来附加,当然这个时候我们的游戏的点数呢,嗯气功的点数也用完了,我们需要另外换一个角色对象,另外换了一个对象之后呢,我们附加到游戏里边,然后我们移到我们的发包的函数上面,移动两次啊。
这个时候移动到这里之后呢,我们在上面下一个断点,然后进入到游戏找一个地方来进行加点,当然这个时候我还没有断线的时,候,还没有加点的时候,它就断线了,肯定不是的,那么我们点一下的时候啊,断下呃。
倒下之后呢,因为我们剩余的点数有限啊,那么我们把它的这个soc这个数字呢给它治理,那么发送这个包的话就不会成功,那么也就是说加点呢不会成功,那么这个时候呢我们返回集成找到他呃,加点的这个地方一层。
这里是发包的啊,然后呢再次返回,那么这个就应该是一个比较关键的位置嘛,嗯也就是我们发包数据的一个来源,那么在上层的话一般就是我们的这个相应的嗯加气功的这个扩了啊,可能就是那么我们再次返回一下。
那么这个地方的话可能就比较关键了,这个地方那么我们在这个地方呢下断,那么下段之后呢,因为他发包的话是从这个地方发出去的,那么这个参数的话,前面呢有一个谱写,它应当只有一个啊,return 04啊。
只有一个参数,那么只有一个参数的话,这里呢我们直接的a d d p s p让dsp的是来加四,或者把这个谱系啊铺起来,弄不掉,这整个几句呢low不掉,那么我们就不会调用这个功能了啊。
达到了我们的一个占地址的堆栈地址的一个平衡,好的,那么我们再次来看一下呃,比如说这个地方我们加点的时候看一下它的参数,那么我们顺便就分析了这个空,嗯1d i的数值是12d啊,不是我们所想象的啊。
一那么如果是一般情况下的话,我们数出来它的数数据应当是一啊才对,嗯,那么我们看一下它有没有区别啊,另外我们第二个哈下标应当是1012啊,这个地方应该是一,但这个时候呢他从12d来变成了121啊。
它在原有的基础上加了一,它也有一定的规律,那么我们再来这个是下标的是第四啊,第四的一个那么130啊,那么它都是从之前的这个d e f,然后三零这样加起来的,那么所以说它还是有一定的规律呃。
那么我们来看一下它的一si是一个什么数值,那么1s2 等于零一啊,那看来的话它应当是一个对象,那么我们看一下这个对象,它有没有名字,那么是不是我们想要的,这个对象的话看看来的话。
它也不是我们的这个气功的对象,嗯,那么我是气功对象呢,我们转到这个库里边去看一下呃,因为在发发包之前的话,距离发包点比较近的地方啊,在这个地方的话,我想的话应当他是要访问呃这个这个技能的这个对象的啊。
气功的这个对象,那么我们再来看一下它ec x的一个数据的一个来源,280c,280c往前面看一下,那么这里有个2806,dx那么这里的话看起来呢它像是一个数组,那么410的话,我们之前的呃。
这个数组的话一般都是从410开始的,然后呢他把它放到e4 x等于1x1 x x加四嗯,这里边进行了一个处理,相当于然后这里的ax的取出来,写到这个二七ca这边,那么二七ci的话。
实际上它就是这个2804里面的一部分啊,因为这个负数的话,我们都知道它的这个绝对值越大的话,它反而是越小这个地址,那么这个地址呢是在他后边的啊,这两个地址都是在在他后边的,那么在这里呢他取了一些数据。
那么极有可能的话,因为我们的数组的话,4105我们都知道呃,从这个游戏的一个分析来说的话,这个410呢它就是象征着我们象征着背包的这些数据啊,或者是f一到f 10这一类的,那么都是这种数组嗯。
那么我们在这个地方下段看它会不会断下来,当然我们也把这个地方呢也进行know u d d e s p假发啊,让他发送啊,失败也就是我们才有这个剩余的点数供我们做一个测试啊,这个时候来断一下,断一下呢。
我们看一下取出来取出来的ec x是不是我们的这个气功对象,那么这个时候来是d,那么按照我们之前的背包里面的对象以及技能对象啊这一类的,它的名字的话应当是在5c这个位置。
那么我们看这个地方的不是没有名字这一类的,那么这个时候呢呃5c这个位置呢它是一个正骨正骨绝技,那么这个的话恰好了,也就是我们的刚才选中的这个气功对象啊,那么如果我们在连环飞飞虎这里来的下段。
我们再来看一下执行到这一行莲花啊,这个时候呢我们看到它所取出的对象呢就是这个连环飞,嗯,然后呢我们看一下最后他在这个ax是什么,x等于c c的话是一二,返回只是幺二法这个地方,嗯,那我们再看一下啊。
另外的情况啊,如果是这个摄魂一击,他执行完了之后是什么,也是b这个是幺幺,那么如果是这个的话,就应该是a b c d e啊,这个应该是一,它也是一个序列,a b c d这个时候是幺三啊,这个有点奇怪。
幺三的话,都是一个不同的一个数字啊,按照这个时候我们再来看一下ex啊,稳固态三,那我们看一下里边它有没有一个属性等于一三的,那么是他是这个地方呢,等于一三,5c,那么这是它的起始地址,一三这个属性的话。
在4c这个地方呃,那么4c这个地方的话,我们呃记得了他之前的话呃,4c还有八这两个位置的话,那好像是我们的这个物品的分类编号i d,然后也就是说它发送到这个地方的话,可能就是我们的呃气功id。
啊松动标识,身份的一个标记啊,不同的,那么这个可能不是我们的下标啊,它是一个标记,这一类是在这个地方,那么如果我们要修炼的话,要修炼气功的话,就可以在这里发包哈,然后呢填充它相应的这个数据吧。
可能嗯也是可以修炼这个气功的嗯那么另外一种方方方法的话,就是找他的这个上层的这个库来调用,那么我们还是先把这个数组啊分析清楚啊,其他的我们先不分析,就在这个地方,我们再次下下个断点看一下。
看一下dx的一个来源,那么tx的来源呢弹离他比较近,那么又来来源于另外的一个公式,这个地方,那么我们再一次呢嗯这个是好像看一下,这个时候还没有读取出来,我们看一下e d i的数字呢啊是等于零。
那么e d i等于零,那么这里呢又像是一个数组呃,这是一个数组里边呢它再次向了一个数组,那么这个为零的话,这个我们就可以相应的可以省略,那么我们再多做一下测试呃,另外看一下这个地方它是否文明。
e d i也是为零的,那么我们看前面这个呢e d r还是没有变化,那么我们暂时来可以认为呢,呃它的偏移来源的话就是这样的一个公式替换进来,1b x加上5x368 加上4x0啊。
也就是4x0呢暂时可以忽略哈,这是我们提示啊,提示自己呢它这里呢可能是另外的一个数据,那么后边呢这个e d x呢用来加上410,再来加上一个四乘以我们的相应的一个下标,然后呢是一个对象。
那么这前面的话应当是一个对象的一个数据,我们来看一下是不是这样啊,当然e bx的值呢我们需要给它取出来,看一下e bx 1 b x的值是多少啊,是这个数值,那么我们先把它复制出来。
把ebx使得数数值呢带进去,那么我们可以看到一共有八个对象,那么这个八个对象的话,我们用dc来看一下,那么其中的一项属性呢,我们已经知道了是5c。
那么第一个呢是力劈华山,那么第二个呢是摄魂逆期,第三个连环飞舞飞舞,第四个是狂风万破啊,稳如泰山,那么知名度的话,这个呢就是我们所要找的嗯,这个数组它的属性呢加五色。
这里呢是名字,其功也不错,那么加上我们的还有一个地方好像是18还是多少,刚才我们看到有一个一三的这个标识id,40啊应该是4c这个地方。
那么是在这个地方的话,可能是他的一个,id身份的一个标识,那么我们有了这个i d的一个标识呢,我们才知道他是跟某一项气功啊进行了加减,进行了对某一个对象来进行了一个操作啊。
像我们的人的身份证一样,那么而且它的每一个id的话肯定肯定都是一样的啊,比如说我们第三个他的家四线这个地方,我们来看一下啊,这个地方它的标志呢也不是一样的,再看一下第一个地方是谁,第一和第三,b1 。
那么我们再看一下那么难听,加上是在这个地方,那么零呢这里是a b啊,前面的编号是a做的好的,那么我们继续来找一下这个bx它机子的一个来源,那么这个e p x的话,我们就可以直接借用这个c一工具搜一下。
那么最后呢只有这一个地方,这个地方我们看一下它是否是一个机子,三一多少多少,那么我们搜索一下这里边,那么既然我们搜索不到的话,可能呢这个e bx的话嗯,它就不是一个机制。
那么我们看一下还有没有其他的机子,那么其他的话这里呢呃暂时还没有发现其他的这个机制在这里呢,我们先下一个断点访问一下吧,那么这里的话我们看一下它是三一db c8 。
然后e x那么ex呢是我们所有对象数组的这个下标,这个值的话,b c8 的话应当是我们所有对象数组,那么所以说这个的话应当不是的,那么这个呢我们先排除掉啊,我们直接从我们刚才的位置往前找一下。
看能不能够找到其他的机子,这是我们的1b x,我们往前面找一下,找一下ebx的来源,从这里来看的话,它的来源是e4 x,那么上一层的我们再到上一层找一下他的e x来,来源于e s i。
所以它也是来源于我们上一层的e4 x,但是这个e4 x的话它就怎么了,就断下的地方就比较多啊,可能是找不到的,你再回过头来看一下它,那么我们先把我们的这个特征码先把它抓取出来,按减号退回来。
嗯在我们现在是找到了这个地方。
只有。
好的,那么我们把所有的断点呢先取消掉啊。
禁止先取消掉,退出来,我们再借助我们的c a e来找一下,看能不能够找到数组的这个机制,那么如果找不到它的机制的话,我们可以通过他对象的一个属性呢来进行一个相应的一个判断。
那么这个是堆栈里面的,我们先关掉啊,然后第一个地址呢我们先访问一下,这一共有100多个啊,这个比较多啊,应该说这个能够找还是能够找到的呃,使用的地方越多的话。
证明它的这个它一般都会听一个指针来保存相应的这个数据,那么没有的呢,我们先删掉,那我们主要是看一下这里面的对象有什么地方,他会反问他,这个对象的话可能应当来说的话,它还是有它的指针,那这种的话太多了啊。
很难找到啊,那么我想的话刚才的这个地方呢,它可能也是在我们所有对象数组里面去把这个对象来取出来的,那么我们可以多返回几层再再试一下啊,因为这个数量太多了,用我们的o d或指c来找的话都不是很方便。
那么再转到我们刚才的地址呃,我们下一个断点让他多回溯几次,多立项几次啊,这个地方,那么我们主要是找一下e bx啊,d c d啊,这个数这个数据,然后我们返回到上一层,来源于我们的e si,这个时候。
那么再上一层,我们再看一下嗯,这个时候的ei,我们再来看一下这个时候堆栈还有没有这个数据的存在,那么如果是来源于这个地方的话,我们在这里来给它下一个条件的一个断点,把这个数据啊复制出来。
在这个地方呢我们下下一个条件断点,我们让他断一下,好那么这个时候呢e4 x呢它断下了呃,我们再返回两层来找一下它的一个e c x的一个来源,这个时候呢但是呢又找到我们的这个e si加四里面去了。
从这里来看的话,我们再来看一下vs 2段,e s i d e4 ,那么像这种呢我建议的话啊,是就直接用这个对象属性来判断,因为它在所有对象数组的这个列表里边啊,我们直接搜索它也是很方便的。
这样去找机子的话呃,可能也找得到啊,但是能够找得到的机会啊非常的小,那么我们再继续找两层看试一下js i我们看一下来源于什么地方,又是来源于我们上一层的ex。
那么这里呢我们也需要再次的下段对这个ex进行一个条件的一个断点,那么呢它又来源于我们上一层的参数,一bp加八,那么也就是我们上一层的第一个参数应当是,这个地方就比较多了啊。
那么我们需要在这里来下一个断点,断点就是e p p加八等于这个数值,那么这个时候的话它也会不断的断向呃,我们看一下e c x的数值,148啊,e p p啊,应该是这个地方的数值上一个扩大。
这个参数我们返回去再看一下它的一个来源来源于我们的ex,而ex来来源于我们的ei,而e s i呢,我们又跳到这个所有对象数组这里来,那,么所以说最终的结果呢。
我们还是要通过这个所有对象数组来进行骗离我们的嗯,这个相应的对象,那么我们直接是访问不到的,好的,那么这节课呢我们下一节课呢再编写一个相应的函数来分析,来获取这个相应的数组的一个机制,动态的来获取。
那么它肯定也有一些特征在这里,那么至少它加上410,这个地方的话,就是我们的一片这个数据啊,加上我们的410,那么这一票出去的话又是什么,加上410,很长的一片数据哈。
这里我们之前的话应该是加上的是368。
再来看一下我们的公司,加368,那么这里呢他也也也有一个数组。
这里我们应当是加368,那你加368,他在后面的话也有很长很长的一串数组,如果我们所要的可能是这两个,加上再加上一个410好,这里呢才是我们相应的气功的对象啊,这个数出来非常的立体划算。
这个数字呢非常的复杂,在这里呢我们可以加上四神一来看一下,还能加上我们的c,啧啧啧,那么这里的话我们可以看到应当是没有任何的数值,那么只有来这里的话是谁赢才有,20,二,那么4x2这个地方究竟是什么。
我们再来看一下,嗯,嗯,对象编号来,这里是1212,加上我们的c1 d看一下,那么这片呢可能是一个空指针啊,没有这个对象存在,那么这里呢也没有对象的存在,啊,那么只有这个第一个对象呢。
它有这个相应的数据,那么这样来看的话,它可能就是这后边这一片它预留的一些呃这个空间或数组,那么这里有16个啊,这里有16个备用的啊,或者说这些基本动作了,也可能是在里边的。
那么我们再退回来看一下它的这个所谓的机子对象,它有一些什么属性。
那么它的类型呢首先呢是为e0 e,那么这是它的一个类型,但是不知道他这里在后边的这些数字会不会变化,但是在后面的数值的话,实际上它都是一个大片的零,我们可以看到。
那么实际上呢我们可以就通过它的368这个地方呢来判断,这个地方它是存放着我们的这个技能对象,我们可以这样来判断,那么呢我们就返回这个地址啊,也可以这样判断,因为这里的这个对象的话。
它的对象属性呢是1d啊,我们可以看到这里的,那么它加上5c这个地方,就是这个气功的名字,好的,关于这个机子的获取呢,我们下一节课呢再设计相应的函数怎么获取,当然这个也作为一个助力哈,也对大小,坐垫啊。
这是过来适合数据,谢谢好。
P128:139-动态定位搞定找不到的气功数组基址 - 教到你会 - BV1DS4y1n7qF
大家好。
我是俞興翔老師,上一期課我們在分析氣功,宿主的時候,我們沒有找到它的機制,這期課我們再次用OT。
附加再找一下,如果是找不到的話。
我們就編寫函數來動態的進行定位,那麼先轉到我們之前分析的地址。
在這裡如果我們是選擇動態定位的話。
我們可以定位EDX,也可以定位EBX這個對象,或者是定位我們之前的+4的,這個對象都是可以的,到時候我們再來選擇一下,看定看片面是某一個對象,方便一些,那麼我們再次來找一下它的機制。
那麼既然我們之前的EBX機制找不到,那麼我們可以嘗試一下找一下EDX,這個對象,看還有沒有其他地方,有保存相應的機制,那麼同樣的我們把這個地方把它弄掉,這裡應該是8,前面有兩個參數,那麼好的。
我們來看一下,現在EDX的一個數字是多少,複製下來,然後我們用CAE來搜一下這個對象,那麼既然前面的找不到,我們看這個對象能否找到,那麼這個對象的話,它也是在31DE,這個對象也是在31DEEF8。
那麼這個的話可能也是我們所有對象,訴求裏面的一個數字,我們按訪問之後可以看到,在這裡的話,它也是311DDBZ8,然後EX的018Z這個地方,斷下來的,那麼所以說這個地方的話也不是我們。
所要找的相應的數據,那麼我們剩下的辦法就只有在這裡,來看一下它的屬性,我們從最近的開找,那麼EF開始找的話,那麼理論上的話,可以來省一些時間,因為它離我們的對象應當是最近的,那麼如果這個地方找到了。
我們只需要加上一個410就可以了,這個是運氣療傷,加上C,我們看一下,運氣療傷,對的,那麼這裡我們有兩種方法,都可以用來搜索到這個對象,那麼一個是我們直接把這個對象讀出來,再加上410,再加上4神隱屏。
用來判斷它的第一個對象,那麼判斷第一個對象,因為它的也有一個對應的一個類別,那麼+8這個位置等於1D,如果這個地方它等於1D,然後在它之前的對象+8這個位置,我們看它是多少,那麼這個對象我們是記一下。
氣功對象是1D+08這個位置,那麼1D是我們的一個搜索條件,這個是我們的條件之一,那麼在之前的我們在這裡備註一下,我們搜410這個,那麼這個對象等於1D,那麼我們再來看Base這個地方。
那麼它等於1F這個地方,那麼這就是我們的條件二,那麼這個這就是我們的條件一,那麼這個地方它+8,等於0X1F,那麼這是一個條件一,那麼我們看一下還有沒有其他的條件,再來看一下+8這個位置。
那麼我們看一下這個數字它會不會變,這頭兩個數字會不會變,或者這裡的數字它會不會有一些特別的一個數字,那麼比如說這兩個數字,這裡有一個1,但是這些數字的話,這個看起來像是一個地址,它就有一些特殊性。
可能也是動態的,那麼我們能夠利用起來的也就是這個地方,那麼這個地方它一般是一個,但是這個地方的話,遊戲更新之後,它也應當會變化,因為它是對象的成員函數,那麼唯一不變的。
我們就這個地方也是地址+4這個地方,那麼所以說這個地方的話,應當來說與我們之前的ESI的類型的話,它也是類似的,EF,那麼我們還是從後面的對象裏面來找答案,+410這個地方。
我們看一下它的裏面有哪一些比較特殊的屬性,加上我們的410,那麼這個它有沒有下標這一種,我們看一下,1那麼這裡的1它有一個1,那麼我們再來看一下2這個地方,的1它也是1,這是1D這個是-1。
那麼這幾個字應當都是固定的,我們把它複製一下,當然如果是加上它的成員函數的列表的話,我們應當就能夠搜索得到特征了,那麼我們再來看一下3這個地方,那麼也是1D,當然這個是它的一個下標,0EFF1。
那麼這一片都是相同的一個判斷,當然如果我們是加上這個列表的話,肯定是能夠收到的,我相信,它是一個相當於是一個機制,應當來說,或者通過它的對象的一個成員函數的一個地址來進行判斷,那麼比如說這個地址。
那麼這個它比較有利一些,那麼但是我們在這裏也需要定義,判斷起來就比較複雜,我們也需要把它的機制的話,也要動態的生成一個紅,然後每次對它加4這個地方,對象的加4這個地方再進行判斷。
那麼我們先看一下簡單的設計能不能夠參,再來看一下,這是3,那麼我們找一下它有沒有下標這一類的,這裏有一個A8是3,那麼我們加上4再加上A8來看一下,那麼4的話,這裏它的下標也是3,那麼,(畫面出現)。
理論上它還有一個,還有一個樹竹的下標的一個屬性,可能我想的話,這裡我們在裏面找一下數字4,那麼我們從這個地址用CE來搜一下,也很有數字4,下標這一類的,我們也可以做成是一個判斷,那麼新掃描。
然後搜一下數字4,然後它的其實地址是2310D620,2311離的太遠了,那麼我們再搜一下數字5,數字5沒有,那麼說明的話,下標的話,它不存在,但是不存在下標,它直接就是我們樹竹,下標就在這後面。
這樣計算出來,那麼我們先編寫函數,進行一下判斷,這個BASE,那麼打開我們138克的代碼,那麼我們移到測試的頁面。
然後開始設計我們的代碼,取測試1這裡,那麼在設計代碼的時候,我們需要對所有對象的列表來進行遍離,我們先把它的機子取出來,然後這裡我們需要的一個循環,我們看一下,它的對象的話,會有多大。
因為遍離到它的地方比較多,馬上就會斷下來,先把斷點刪掉,這整個樹竹的話,我們看一共應該有多大,那麼這裡的話,它應該是2710取出的下標,最大下標的話應該是2710,那麼我們在這裡也是2710。
當然也可以把它設置成一個文物,也就是說最大的數字,當然這裡我們暫時可以固化作用,或者說也設置一個文物,在這裡definesize for object list x2710。
然後在這裡define size for object list x2710,當然在這裡我們也加上一個異常的處理,可能是訪問錯了的話,我們就進行一下處理,異常處理的話,我們應該把它放在循環的裡邊。
那麼如果一旦有異常的話,我們繼續執行下一次循環,那麼在這裡我們遍離我們的對象,那麼先把我們的對象取出來,在前面我們需要建立一個NDRoboTank,我們先把它複製為0,然後我們在這裡來先取出對象。
那麼NDRoboTank,那麼複製為我們的白石,它的機子再加上一個神隱I,那麼這是我們對象的一個地址取出來,那麼取出來之後,我們就要接下來就是判斷,判斷是否是我們要找的對象,那麼樹主對象機子的話。
它有一個明顯的一個屬性,+8在這個地方等於EF,那麼所以說我們要先取出對象的類型,那麼type這個地方自然就等於8,把這個地方執行,那麼後邊的話,這裡我們最好這裡是把它設置成一個指針的形式。
那麼指針指向這裡,那麼這裡我們再強制的轉換一下,注意這裡一定要加上括號,不然就成了一個指針的運算了,後邊得出來的數據就不對,那麼在這裡我們再取出它+8的這個位置,+8這個位置,這裡恰好等於2。
+1是等於4,0、4、8,這個地方我們就取出我們的類型,取出+8位置對象類型,那麼取出來之後,我們就進行一個判斷,好,那麼如果0xef這個條件達成了之後,再判斷條件2,那麼條件2的話。
我們也是去+8這個地方,取對象的+8這個地方,它等於了1D,但是這個條件2的話,它需要有一個公式,那麼在前面的機子,+410再+4,實際上就是+410這個地方,再讀取這個對象。
那麼我們先把另外一個對象先取出來,那麼先取出對象1,對象1的第一個元素,那麼也就是我們把公式貼出來,也就是取得這個元素把它取出來,那麼也就是把這個地址實際上計算出來,那麼計算出來之後。
等會我們再讀取它裏面的+8的位置,那麼要取這個數據的話,我們這裏需要把我們的0。0。0。0。0這個地址,那麼這裏我們需要先轉換一下,410這裡,那麼我們需要把它轉換成Dword的類型。
再來加上我們的EX410,那麼這是了我們,然後在最後再轉換成真的類型,Dock大括號把它加上,這個時候我們就得到了第一個對象,也就是410的,也就是我們如果是正常的情況下,就會得到金鐘鋼器的對象的地址。
那麼獲得這個對象地址之後,我們再次取出它的+8這個位置的類型,那麼=NTobj,把這一句的複製一下,好,那麼我們在這裏再次做一個判斷,那麼這個地方我們需要它等於1D,這個時候判斷的話。
可能也有相同的對象,它這個地方也等於1D,所以說我們還需要更進一步的一個判斷,來看一下更進一步的判斷,需要一些什麼,當然我們最好是先看一下這個地方,如果這個1D它就是標明的我們的器工。
它的唯一的一個對象的ID類型,就是器工的話,那麼我們直接這樣就可以找出來,那麼我們現在怕的那些就是什麼,還有其他的對象,它也用到了1D這個對象ID來標示,那麼我們先運行一下,如果找到了這個地方。
我們先把這個對象的地址打印出來,那麼打印出來我們應該是哪一個機制了,我們來看一下,應該是加上應該是最之前的這個Space,那麼我們在這裏,另外另外定義一個變量來存放,這個需要是一個靜態變量。
Under Base器工,器工宿主,那麼最先我們把它複製為空或者是零,那麼當然在這裏的時候,如果是找到了之後,我們就把它複製為一個重新跟它複製,那麼第二次的時候,我們給它進行一個判斷。
那麼如果這個ND器工Base,它不等於空,那麼或者它本身取反,那麼我們就直接回燙就可以了,這個地方我們直接就返回,返回這個N的,或者是返回這個值,當然現在我們不是寫的函數。
我們最好現在把它放在一個函數裏面去,設計成一個函數,GWGAP器工Base,那麼如果執行到最後都沒找到,那麼這裏直接返回空,那麼或者這裏找到了,也是返回這個相應的數值,好,那麼我們再來看一下我們的設計。
那麼這裏還需要定義一個變量,定義一個變量,用來臨時的存放這個可能式的機制,那麼這裏我們取得的,如果是就是說我們運氣好,就會取得這個相應的機制,當然我們需要讀出來,實際上我們這裏需要把這個數值讀取出來。
複製給這個指針,或者這裏直接這樣寫,直接這樣寫之後,我們要做一個判斷,那麼如果這個值等於0的話,那麼我們繼續continue,繼續下一次循環,也就是所在了,它沒有這個對象,這個地址它是空的。
如果不為空的話,我們nbps複製為,dwc,那麼我們把裏面的對象的,那麼取對象的地址出來,311TTPCF,那麼我們這裏演示一下,311TTPCF,311TTPCF,311TT。
那麼如果這個地方它有數據,我們就把相應的數據,ERDF80取出來,那麼如果這裏它為0的話,我們肯定就取不出來數據,那麼這裏我們需要,那麼首先我們是獲得它的機制,+4+4這樣加走,加走了之後。
我們需要用這個語句,這個語句,我們需要這裏只是指向了某一個機制,指向了之後,我們通過指定的一個操作,需要讀出這裏面對象的數據。
比如說這個ERCF8,那麼讀出來之後,這個是另外的一個對象的一個地址。
就存放在這裏邊了,那麼存放在這裏邊之後,這裏我們再對它進行一個讀取的操作,+8這個位置讀取出來,進行一個判斷,判斷如果等於EF,那麼我們接著後面的一個操作,那麼這裏的話就應該是NDBS。
加上我們的410,那麼410之後,這個時候它轉換了,實際上也是一個指針,NDBS,這個時候它已經變化了,變成了相應的地址,加上410,然後再取對象的+8的位置,如果這兩個條件我們都達成。
那麼我們就給靜態變量進行一個複製,那麼就複製為我們的NDBS,那麼這個NDBS就是我們之前所取出來的對象,也就是列表裏面的某一個數字,那麼如果這個是的話,那麼它的+8這個位置就應當是我們的ED。
應該是EF,然後它在裏面+410這個位置是ED,取出來,那麼這個時候我們就把它,這裏就返回,Tab,好的,那麼我們看一下是否能夠取得我們正常的機制,如果不行的話,我們還需要加上其他的條件,好的。
那麼我們編輯生成一下,然後這裏我們需要強制的把類型轉換一下,那麼我們測試一下,這裏的話,所找到的數字是0,我們看一下為什麼會是0,正常情況下的話都應該不是0的,可能是我們的代碼有誤。
那麼首先我們是取得對象的地址取出來,對象地址我們+8的這個位置來取出來,那麼我們首先看一下,在這裏我們取出的數字對不對,Type,遍體的Type的這個類型,我們看對不對,那麼還有條件2,這裏Type的。
再重新生成一下,我先清零一下,21,然後這裏就出錯了,那麼可能是我們只遍體到了這一部分數據,條件2這裏它取出來的這個類型的話一直為0,看來是,那麼條件2的話一直沒有達成,這裏它的這個類型。
我們再來看一下我們的公式,那麼條件1取出來的這裏是正確的,那麼我們應當把它放在這個地方,EF這個判斷成立了之後,我們再把它的這個類型來打印出來,這個是我們的條件1,如果條件2達成的話,應該是在這個地方。
那麼看這個條件2的話,它一直來取出來的是0,沒有達成,那麼我們看一下語句的話,可能是出現在這個地方,首先我們ndbase,它是取出了對象的地址,對象的地址加上了410,那麼這裏的話,我們還應當要取一道。
要取這個對象的話,需要有一個讀的一個動作,那麼需要了先把它讀取出來,然後再進行一個條件1的判斷。
那麼這個時候來找到一個ES3710,那麼附加一下遊戲,那麼。
加上我們的410來看一下,但是這裏我們發現的話,這個也不對,這裏它為20,我們再來看一下,我們的信息,這裏應該是ES,我們這裏寫錯了,ES3710,這裏是EF,那麼EF再加上一個410。
那麼這裏可能就是我們的這個宿主,那麼再加上一個,我們用連線來看一下,金鐘。
剛寫,後來這裏再加上一個410,410,運氣療傷,4102,連環分離,4103,狂風萬暴,那麼看來的話是不需要我們其他的一個條件的一個,判斷了,那麼就是這兩個條件,我們就能夠找到。
當然我們再回到我們之前的這個地址,從這裏我們來做一下核對,看我們找到這個對象是否是正確的,這裏我們之前有下一個斷點,看來這個斷點被取消掉,幸好我們沒有修練這個氣功,如果是修練氣功的話,這裏就會異常。
就會退出了,那麼我們在這裏把它落空掉,這個地址,好的,我們再想辦法讓它斷下來,看一下我們的EBX找的對不對,然後我們在這裏隨便狂升降四,下標應該是6,7,1234667,7的話,它的下標是6。
然後我們看一下EBX的一個數值,那麼這個時候的話,EBX是前根的這個數值,那麼我們還需要了這裏有個EX,這裏看沒有被執行到,氣功ID,那麼這裏的話應該還有另外的一段數據。
但是我們這裏看一下我們原來的代碼是什麼,我們剛才複製出來的70870B,然後這是我們的715715,這裏是這段指令,我們把它恢復一下,那麼這裏應該是這段指令才對,然後EX。
所以說我們應該是找EDX取出來,那麼我們看一下EDX的,恰好就是我們找的ES什麼,再來對比一下,那麼這裏是ES37EB0,那麼恰好我們訴訟的機制是找對了,找對的,那麼就OK了,這個地方,好的。
那麼這節我們就講到這裏,那麼氣功的機制,我們就已經找對了,把它注釋一下,這個地方通過什麼樣的方式來獲取氣功的對象,那麼實際上我們不是找到的這個BASE,而是找到的這個地址。
我們已經把它的地址機制取出來了,那麼我們就通過這個公式來獲取它下面的這些數據,在這個地方,我們注釋一下,或者我們可以這樣的來表達,然後這裏加上C是氣功對象地址,加上還有一個4C,是我們氣功的ID。
當然還沒有發現其他還有用的,其他有用的數據,我們暫時還沒有發現,那麼這幾個我們暫時就只有分析到這裏。
當然我們還可以來分析一下它的其他的屬性,暫時還沒有發現有用的屬性,那這裏有個1,那麼1會不會是表示它的可用這一類的,我們來看一下,那麼這裏的話,它一共8個,倒數第三個的話,它的下標是5。
那麼我們看一下第五個是否可用,這裏也是1,那麼是否可用的話,它應當有一個標記,那麼如果這裏沒有標記的話,我們可以把它與之前的加點的這個數據給它關聯起來,就能夠獲得它相應的下標所在的位置。
已經加了多少個點,那麼我們在後面的分析當中來再完成,實際上我們之前很早以前我們就已經有這個數據,當然我們上一期的分析的時候。
實際上已經找到了這幾個數據,那麼這裏但是沒有記錄下來,好,那麼這幾個我們的這個數據的機制的話,已經通過我們的編程已經過去了,那麼後邊我們再來分析這個氣功加點的相關的函數。
複製一下。
那麼這樣寫的好處是什麼,我們還有一個就是修正bug,不需要了,那麼這裏我們用了一個靜態變量,它的好處就是了,不會反復的去騙你,那麼一空了,只要注入遊戲之後,我們只需要騙你一次,那麼第二次的時候。
它不會空,我們直接就返回這個機制了,那麼後面再多就省略了,這樣的算法的話就非常的優化,那麼如果不加上在前面這一段的話,那麼每次都會去找這個循環,那麼這樣的算法就非常的低下。
相當於我們在這裏是跟它人湊了一個機制。
好的那麼我們下一節課再見,這節課我們就到這裏。
【過去的事物】。
标签:我們,教程,这个,的话,郁金香,笔记,那么,那麼,我们 From: https://www.cnblogs.com/apachecn/p/18441506