郁金香游戏辅助教程笔记-七-
郁金香游戏辅助教程笔记(七)
P200:217-游戏多开补丁编写_old - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么上一节课呢我们简单的探讨了,那以下这个游戏多开的另外的一种原理,那么这节课呢我们通过上上一节课分析的数据。
然后呢来编写相应的代码,那么首先我们打开vs 2010。
然后在这里呢我们建一个动态链接库的程序,选动态链接库,然后这里呢可以选套出的符号。
然后在这里呢我们添加一个新建的新建的这个目录,这里边呢我们主要是多开支持的相应的函数,那么在这里呢我们先建一个源文件,多开的,然后呢再添加一个图文件,然后我们要写的话,大致我们需要写这几个函数。
那我们先把这几个函数来啊,复制到我们的重建里,那么首先呢我们要写一个关闭我们登录器的相应的函数,关掉登录器,也就是我们这个多开必须的这个步骤,那么如果我们不关掉这个登录器的话。
那么新的登录器呢将无法打开,那么所以说我们在打补丁的时候,客户端启动了之后呢,我们就找一下呃这个登录器,那么登录器的话我们需要知道它的进程的句柄,才可以关闭它。
那么首先呢我们可以用spi加加来获得它窗口标题,通过窗口标题的话,我们可以获取进程的id。
然后可以获取它相应的具体,那么这是他窗口的标题,那么这是我们登录其他的相关登录器的窗口标题呢,我们就可以通过它最终呢来结束这个进程。
好的,那么我们看一下代码应当怎么写。
当然为了节省大家的时间呢,往这里来,直接拿写好的代码做一下参考。
那么关闭登录器的话是只需要这一段代码就可以了,好的我们把它写过来,那么首先呢我们通过翻的windo来获取这个登录器的窗口句柄,获得这个窗口句柄之后呢,然后呢我们获得登录器的,登录器的话,进程p i d。
然后通过进程p i d,我们获取登录器的进程,具体,然后有了这个进程,具体呢我们可以来强制的结束这个进程,那么强制结束之后啊,当然我们就一个平台上啊,只要没有相应的保护措施的话,那么我们就可以了嗯。
结束掉这个进程,好了,我们编译生成一下我们的代码,那么在这里我们需要包含相应的图文件,当然我们这个调试函数呢我们也需要写上,因为我们写代码的话容易出错啊,所以我们需要写上这个函数。
然后呢把它放置在我们的头文件里面,方便在其他地方调用,那么在这里呢我们需要呢添加一下我们的字符串,直接拿去,好的,那么包含了这个string这个铜件之后呢,我们就可以使用相应的字符串联相应的函数。
那么接下来就是设计我们的,其他几个步骤,那么我们再来看一下,第二步呢,我们是要复制我们的这个保护的动态链接库,生成一个临时文件,用来在之后呢啊把它载入到我们的客户端里面去。
那么这个时候呢我们需要写一个啊这个copy file的文件,那么我们来看一下该怎么写,那么这一句的话相当的简单,只需要调用一下我们的货币发展就能够实现,那么copy的话,第一个呢是我们的源文件。
第二个是我们的目标文件,那么这个源文件和目标文件在这里呢我需要做一下相应的定义,那么在这里呢我们设置了相应的变量,那么我们也把它复制过来,那么首先呢我们这个呢是它的源文件,源文件就是这个文件啊。
那么它本身就是存在的这个文件,那么目标文件的话,我们在这里呢需要对它进行动态的一个修改,就是新生成的一个名字,每一个进程的话,这个名字呢需要不同,那么第一个呢可能就是零一,第二个就是零二。
但是有时候我们中途会关掉一些啊这个程序啊,那么所以说他可能是顺序的,那么有可能他是第一个位置,第二个位置,那么比如说我们那第二个进程它关掉了,那么这个位置就空出来了,那么所以说我们可以通过座位的原理呢。
来设计这个相应的这个动态链接库的名字,那么所以说在这里呢我用共享结的方式啊,在这里呢嗯设计了一个座位,那么这个座位呢一共有255号,那么开始了他全部是指民表示相应的座位的话啊,都是控制。
那么当某一个比如说我们第一个打开之后呢,那么第一个位置呢它就值一,那么第二个位置打开之后呢,第二个位置也是第三个位置打开之后呢,那么它数组里面第三个位置也是,那么比如说我们第二个进程它关掉了。
在退出的时候呢,把它殖民,把它殖民,那么所以说我们再次打开的时候呢,它会顺序的检查,检查到第二个位置位置呢就是控制的,那么所以说呢他会来嗯行占用这个位置啊。
那么这样的话就避免了我们这个位置来被占完的情况下,那么有时候我们反复的打开进程,所以说这里呢共享节嗯这个动态链接库的话,嗯那么这一片的路程的话,它都是共享的啊,能够共享我们的数据,好的。
那么接下来的话我们就是分配这个嗯座位的问题,还有就是我们当前进程的这个动态链接库名字的问题,因为我们不能所有的这个动态链接库的名字呢都是零零,我说了他第二个的话就是零一,第三个呢是零二的。
然后后边的呢我们依次类推,那么所以说我们也要写一个函数来获取这两位的这个字串,那么在这里呢我们也写了一个相应拿去,那么这个函数的话我们先来看一下,那么首先呢它是进行判断。
那么这里呢我们当前所在的位置呢是-1,是负数的话,表示呢就是说我们还没有嗯对这个程序来进行相应的初始化啊,这一类没有占占领相应的位置,那么所以说首先呢我们进入这个函数呢。
我们首先呢判断是否这个位置已经占领了,那么如果它是-1啊,显然这一段是不会被执行的,他会继续来骗你这个相应的位置,那么它偏离到某一个位置为零的时候,就表明这个位置呢是控制,那么控制的话。
然后呢我们就站在这个位置,那么在这个位置的这个函数呢,呃i这个位置呢我们负值为一,表示占占领这个位置,然后这个位置就是这个position呢,嗯就记录它的这个价标啊,这上面这个是index,这个是数据。
那么这里呢是具体啊,当前进程呢它所占领的位置,那么记住这个位置的话,他最终的目的呢是用来在退出的时候呢,把这个位置空出来,要写一个零啊,在这个地方,好的,那么这个位置计算出来之后呢。
我们只只需要两个字节,因为我们可以看到在这个空间的话,我们需要用这两个字体呢来替换掉,那么所以说我们在在后边格式化的时候,前面呢是这里是用了16进制来格式化,然后呢占两个字节,那么如果不出两个字节来。
前面我们是用零来填充,从这里可以看出来,那么然后呢我们把它写到这个size position,那么下一个position的话,它实际上呢就是我们的就会生成输入0102。
或者是啊k1 a0 这一位的16进制这个字串,然后我们把这个16进制的字出来呃,在初始化的时候我们追加到这个位置,那么所以说我们还涉及到一个变量初始化的一些问题,那么在这里呢我们也写了一个初始化的函数。
初始化变量,那么初始化变量的话,首先呢我们就是要活成这个标题,那么这个标题的话我们也是来通过之前的嗯这个郁金香抗下划线,那么后边呢我们追加的标题就是刚才生成的这两个字。
那么生成的字符呢它将会追加到这个后边,但是这里呢他不能够追加啊,需要直接修改它01234啊,第四位和第五位,所以说在这里初始化是这样写的,那么第四位和第五位呢。
分别呢由他取得了制服的第一一位和第二位呢来填充这两个字啊,以字符的形式来进行填充,那么前面呢这里呢我们是追加到它后边形成新的标题,比如说我们追加到最后跟他之前的这个标题的话,是这个标题,那么追加之后啊。
那么我们就可能形成危机零二这样的一个标题,那么同样的在这里的话,它被修改之后,他本来在这里呢是零零,那么经过了这前面这一句的修改之后呢,太可能了,比如说前面这一位他是一的话,这位呢就会改为一。
那么如果后面这一位,比如说这个地方它的字符呢是二,那么这里同样的不会改成二,改了之后呢,这里呢就是幺二,那么如果前面这里是零的话,那么这里呢它本身就会被改成敌啊,这样的一个形式当然是相应的字串。
那么最后还有一个呃,这个呢就是我们,我们来看一下啊动态链接库所存放的地址,那么这个地址我们就是上一节课所分析的那一个偏移啊,那么73121c啊,这一条,那么这个地方呢它存放着这一个字串。
那么这是它的这个偏移,那么偏移呢它相对于于是我们这个进程的,那么所以说我们获得进程的机制的话,用了一个,fty mode handon啊,这里面实际上是获得,过去看另一,那其实啊这个模块的机制。
然后呢最终呢加上这个偏移,那么最终呢它指向了我们之前的嗯,指向了这一个字串的地址,那么也就是我们上一节课说所分析的。
啊也就是这一个地址的,它加起来之后呢,最后呢会形成这样一个地址,那么修改了之后,那么我们这里所指向的就会变成一机箱零零这一类。
好的,那么我们接着看一下后边的函数。
那么另外呢我们就是要设置一个游戏的新标题,那么这个设置新标题的话,我们需要等待一段时间,这里需要用到一个循环,因为我们在载入我们动态链接库的时候呢,可能我们的这个窗口呢它还没有创建。
所以说这个循环的话啊,一定是需要,那么这里呢我们呃大概是每次来循环10ms,600次,大概是600ms,大概是需要六六秒钟的一个时间的来查找这个窗,因为他不如果是不用这个循环的话。
那么这里他可能窗口还没有创建,那么我们反的就是一个工具品,最终呢达不到修改这个窗口标题的一个目的,那么所以说这里呢是呢这个i的值要减一啊,最多如果我们一直没有找到啊,最多来循环600次。
那么当然也可以把这里修改大一些,好那我们复制一下这个函数中,那么下边呢还有一个就是要修改我们,这个位置啊,因为我们在这里嗯,它的这个保护的函数在y dem这里给我们分析的。
他会用这个final window来来不停的查找,那么所以说我们要更改这个地址里面的字串,如果是这个字串的话,我们把标题重重新设置过了之后,他就找不到,那么就会退出的游戏,那么所以说我们在修改之后的话。
要把它以我们的窗口标题来进行同步,那么所以说需要写出这个地方,好那我们来看一下这段代码,那么这段代码的话我们再来看一下,因为呢它也是相当于是这是它的偏移,前面的是他的机子,那么我们之前呢也强了一个偏移。
那么所以说我们首先呢用这个load lib保险一些啊,有可能就是说我们的这个动态链接库还没有载入的话,我们就用它载入一下啊,那么在用之后我们获得它的机制,即使获得之后呢,然后呢我们加上它相应的偏移啊。
这就是我们要修改我们标题的地址,然后我们用rider process memory来写入这个新的标题,那么新的标题的话,也就是我们修改之后的这个标题在后边加了相应的字串。
那么这里呢我们最好呢是要打开他的页面,属性为可读写的啊,好了,我们复制一下这段代码,然后我们看下一个函数,那么下一个函数来这里呢,就是我们的这一段,这个新的动态链接库,这里需要做相应的这个修改。
那么显得我们预期将零这一类的好的,后面要配置一下,那么在这里呢我们也是把这个新的字串名字,就知道之前的这个字串名字,而且它的这个初始化的话是在前边的这个全局变量这里,这里来实现,好。
那么最后我们来看一下,最后就是多开的啊,多开了,我们一次次关掉登录器,然后呢初始化全局变量,然后复制我们的这个临时文件啊,动态链接库的保证我们每个进程拥有不同的这个y g man。
然后呢我们设置在这里啊,我们设置这个新的要加载的啊这个名字啊,因为我们要做修改,把这个y冰棍呢改成郁金香啊,0002这一类,然后最后呢这里呢是设置修改之后的标题呃,这修改这一个地址啊。
那么最后就是设置游戏的标题,那么这个呢放在最后好的,那么这个函数就是我们的关键,可以设置成一个套出的函数,好的,那么这一段完了之后呢,我们还需要最后的写在一个函数。
我们要让他在一个单独的一个线程里面来来执行这一段拍,那么所以说我们还需要写上一个函数,那么最后呢我们就调用这个函数来来实现多开,那么这个线程最终会执行到这里,会一步一步的执行下去。
那么我们再次变成生成一下,那么这段代码的话,我们把它放到,这个动态链接库加载的时,好的我们再次给你生成一下,在这里呢我们包含一下相应的这件,那么在这里呢我们心里面生成,这里我们做一下相应的修改。
然后把我们这个动态链接库啊。
嗯复制到。
相应的目录下边,那么为了方便测试呢,我们把之前的这几个文件呢啊删掉。
然后我们再次来针对你的问题。
当然这段代码的话,我们请参考一下141,140以及207克的这个截止注入。
那么我们再次登录第二个,那么这个时候的话我们就能够实现网友的这个多开,这,好,那么我们用c来查看的话,我们就能够看到它里面的这个相应的字串的话已经被修改过了。
那么之前的计算应该是这个啊,那么这里呢我们不同的进程的话,我们做了不同的修改,那么这个是零零,那么下边这一个的话是零一,那么同样的这个地方它也是经过修改,那么这里呢我们另外一个进程,这里呢是年龄。
那么之前我们没有修改过的,应当是啊这个动态链接库的地址,那么我们要做的就是修改这几个地址,好的,那么这节课呢我们就探讨到这里,那么有什么不懂的地方呢,请给我的qq呢嗯进行留言。
P21:032-放置技能动作分析 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么前面呢我给大家留了一个作业啊,也就是把这个技能栏既能放置到我们的下面的这个快捷栏里边啊,那么今天呢我们就来分析嗯这个相应的库以及相关的数据,那么前面呢我们分析的分析的时候呢。
分析了一个技能数组,还有一个也就是选中的技能啊,显示的那个技能对象啊,有这一段数据,那么先我们打开c1 ,那么既然我们是要选中的啊,这个对象呢他会写到这个下面的快捷栏里边呢。
那么我们就从这个选中的对象来入手,那么首先呢我们把这个选中的对象读出来,那么这里添加一个指针,那么它的偏移呢是228,那么我们加上这个228的偏移,当然我们需要添加到游戏里面,那这里我们重新添加纸张。
二八我们添加一下,那现在我们选中了一个对象,这里面就是对象的数值,那么如果我们放入到这个地方呢,它这里会清零啊,会清零,那么也就是说他在在执行完这个扩之后呢,它会向这个地方呢做一个轻盈的动作。
那么我们就找一下他是什么时候对待新的零,他肯定是把这个数据用完了之后呢,再来做这个轻微的这个动作啊,那么我们先把前面的这个地址记下来,是6121380这个地方,那么先我们先选中一个技能对象。
那么这里呢他将写入我们的技能地址,那么然后呢我们再看一下什么地啊,改写了这个地址,附加调试器好,然后我们在这里呢按一下,那么我们发现呢写入这个地方的呢就是这一个地址,那么我们把这个地址复制出来。
把它记录下来,那么应该在这个库的前面,他在前边啊,前面的可能性就大,在它的前面的可能就是就有一个放置,这个技能是快捷栏的代码,那么这个代码呢可能是一个扩啊,也可能就是一句代码。
就是一个像我们之前的这样写,就一个对象直接把这个对象写到这里来,那么我们来看一下他写入的,或者我们可以分析一下他写入的这个对象,是不是刚才我们选择的这个对象,那么我们可以用这个为例哈。
那我们看一下这个对象的值是不是我们刚才选中的这个对象的值,那么现在这个技能栏的数据呢,现在是我们零零收一下,数十名,没有放东西,那么我们放上去之后呢,它是应该是一个极大的一个数值,比这个数值还要大。
或者说它就是我们刚才选中的这个对象的这个数字,你搜一下有没有这样一个数字,啊这里我们应该是一个精确的数值,那么在我们收精确数值的时候呢,我们发现呢这里他写入的呢并搜嗯搜不到这个对象啊,搜不到这个对象。
那么我们重新再来选中一下,选中的是这个对象c0 ,那么无望,这里放放下去嗯,他一共有四个地方,那么我们看是不是往这个地方写一个设定,如果是这样的话就简单了,我们直接就往这个地址来写入我们这个对象就可以。
但是我们把这个移开,我们看一下有没有变化,那么移开之后呢,这里没有变成零的啊,那么说明的话刚才这个地方的话,他写出的肯定就是我们这个对象,因为这里呢它已经变成零了啊,已经变成了平好的。
那么我们直接用其他的办法来进行分析,也就是刚才的我们看这个清零的这个地方,然后往周围来找,那么我们先把调试器切在掉。
打开我们的o d。
好那么打开之后呢,我们转到刚才的这个地址,清零的啊,这个地址,再传一次,那么既然他在这里清零了,说明的话,那么很大的可能就是我们放置技能的啊,动作呢已经完成了,已经完成。
那么可能就是在前面的这一段代码里面完成的完成的,那么也可能说是在上一层里面来完成的,也就是说在这个库的上面,它还有一个空,那么在这里呢我们看到了有一些代码啊,呃就来查一下字典是什么意思。
那么有时候我们这些这里面的这些调试信息呢,对我们也有用,或者是自创,啊就是落下,就是我们放下啊,相应的,播放,那么也就是说这里面有一个放置动作,那么他这里他说的这里是放置错误啊。
啊拖动什么放置什么错误啊,这的一些信息,那么我们证明的话,从这些字串来看的话,我们应该是找到了这个库的内部,那么我们在这里下一个段f,那我们再来执行一次,碰瓷呢放到f一上面。
那么我们返回到它的上一层去看一下,执行到返回,那么会到这个位置,那么一般来说的话,我们这里呢它是一个数组,那么数组的话它也会从01234键给它编号,那么我们看一下这周围的这些库,还有没有指定的这个下标。
那么比如说我们放在这个,它的下标应该是零,放在这个它的下标应该是一,放在第三格,它的下标应该是二倍,那么我们选择一个这个的话,我们放在这里呢,它下边应该是四,那我们看一下,那么寄存器里边也有两个四啊。
这里也有两个四,这两张可,那么我们再执行一下啊,我们换一个位置看它有没有变动,那么放在f8 上面的,它下边应该是七,那么这个时候呢一bx的自然是七,一bx恰好是在这里啊,这里呢可能是我们快捷栏数的。
或者说我们就叫做技能栏,这样子技能栏数据下降表示放置到某一格上面去了,然后我们再跑一下,再换一个对象,再看一下,那么如果我们放在f3 第二格上面,那第三个啊,它的下标是二。
那么这里如果我们把这里是压榨的这个参数,我们改这里如果是把它改为西红,看有什么变化,那么我们发现呢它放在f8 上面的这个对象,比如说这个对象我们放在f7 上面,第六个,那如果我们把这里这个六改为零。
我们试一下,这时候我们发现它放到了这个技能栏数组的第一格上面,那么所以说这个扣的话可能就是我们的呃放置技能栏数组的一个扣,那么这个库里面呢它有一个信息,还有一个信息呢就是我们选中了这个技能啊。
我们要有一个前提,要先选中这个技能,应该才能够啊才能够执行这个空,那我们来看一下其他的一个参数,在这里我们跟他下一个段,放在第二个,这个时候1b x为二,一cx为低,啊x d,那么dx呢我们看一下。
这里是,那我们看这两个数值是否会变化,但是呢它也有一个机子来源于这两个数值,那么或者说我们找一下它的相应的机制,找一下这个e d i它的来源来源于什么地方,我们看一下现在bi的数据是这个数值。
那么我们用c一来搜一下,那么它有两个机子承包了这个数据,那我们看看我们来看一下究竟是哪一个啊,我来改一下三幺,那么我们可以在里面直接下一个断点,用hi下访问断点,那么访问断点之后呢,它马上就断下来。
这里呢有一个88的一个机子,那么这里呢这个应该就是,因为这里面找到的是常亮的话,就是我们的基础好,先让他跑起来,那么另外我们一个我们看一下它是否没有截止,这里改一下3141,先去。
那么另外一个呢我们看它也会断下来,但是呢他来11a3 来源于我们的31c e740 ,那么这个的话我们知道3141740的话,它里面所有的对象都放在里面,包括我们今天的这些对象呢,他也放到了这个领域啊。
所以说这个我们不管他啊,然后我们把相应的按键断笔消掉,那么现在我们分析的数据的话,我们按减号退回,那么分析到了这里,那么这两个参数的来源也有了,一个是来源于腰六啊,零八也就是这个机子我们把它复制出来。
那,么这个机子呢加上168,那我们看一下另外一个呢是,腰臂地,那我们来看一下这两个数字,对这个是d啊,这个是四点,那么我们可以直接就用这个机子,那么参数我们这个呢就是参数二。
那我等于0x那么下面这个呢是我们的参数,一,那么这个是你那个四,四楼的参数与参数二,参数三,那么参数三呢,这里就是我们数组的下标,那么既然知道了,我们来,那么还有一个e d i,e d i呢。
刚才我们也查出来了,e d i就是等于这个变量,第二个,那么然后再调用我们可以用代码代码注入器啊,先进行一下测试,有一家人,然后呢我们把这两句给它复制下来,啊然后再做写复习我们的下标。
然后再push e4 x push 1 t x,然后这部e4 x一等于一加,最后呢往后,拖这个地址。
好的,那么它有一个前提,有一个前提就是我们先要选中一个技能,那么比如说我们把这个选中的技能放置到f7 上面,也就是第六个,我们来试一下,那么注入到游戏里面,那我们看一下它就放置到了第七个上面去了。
那么如果我们要把这个对象放置到第六个,那么这里就是那么也放置到相应的这个上面情况,但如果我们不选中对象,我们注入的时候看一下啊,它就没有反应,因为它自动的会去判断这个地址,过去判断这个28这个地址。
看这个地址,如果他没有选中,能心无人零的话,他可能就不会执行这个扣啊,如果就这样叠加的话,他就会啊不会去执行相应的里面的真正的这个内容,那么所以说这里呢我们还有一个前提,那么配合我们前边的代码的话。
我们还可以这样写,那么前面呢我们有一个技能列表啊,是319c90 c n90 c,那么这两个地址我们看它也是a组的,实际上一个是312848904元,应该都会有。
那么我们也可以直接从这里面取一个对象出来,比如说我们取对象二啊,我们可以这样写,就是那么取出来,然后加上410,或者是我们move直接意识点数组的方式来写,那么ex加上我们的四乘,以一个相应的一个下标。
是神隐,我们就取第一个取出来,取到ex里面来,然后我们再往这个地址里面进行写入啊,这像28,那么28这个呢我们看一下是多少,啊不知出了,那么是f41844 ,我们直接用哪个卡数据,自己。
好那么我们直接这里呢,我们就可以这样写,就v c x,那么再往里面行,就是把我们之前的ex在往里面写ec x加上28,然后写入ex,那么这个ex的话是它的下标是一,也就是这一个对象啊。
往我们指定的选中对象里面写入,然后我们放置到哪一格呢,这里我们第三个是空的,那么我们放置到第三个试一下,看有没有写错啊,我们再来检查一遍我们的代码,那么首先呢这里呢我们先。
地址还有一个我们要加一个410,我们都要加这里,我们还要加一个410,它的地址再加上你的400,那么我们再看一下这里面的对象,取出来往外八这个地方起,它的机制是应该是正确的啊,我们再来试一下。
那么这里呢这种写法可能不行啊,那么我们直接这样写,加四,那么这个时候呢我们发现啊他就放置到这里进去了,那么再来执行一遍看一下,那么如果我们要把它放到f放到第三个,第四个,那么那也可以啊。
那么直接用代码就可以实现了,这样好了,那么下一节课呢我们再把它封装成c加加的代码来实现,嗯,那么这节课呢我们就先分析到这里,下节课我们再见,然后我们把相应的代码呢我们备份出来。
那么这节课呢也给大家留一个作业啊,那么就是把我们下面的这段代码呢,把它封装成一个函数,嗯那么碰撞是什么函数呢,比如说就是啊我们的,放心啊,里面呢我们就是技能名啵啵啵啵。
然后呢下面呢是我们技能栏的一个下标,那么写成这样的一种类型,如果写成路是这样的一个形式啊,那么只要执行这个函数哈,后面我们放放技能名,相应的下标,那么相应的这个技能呢它就可以了,放到我们下面的技能呢。
比如说这个疾风烈火啊,那么我们要放置的话,我们直接就可以调用这个函数,嗯然后我们放置到某一格就可以这样写,第一个或者是放手到第二个,那么我们一般甚至可以把它定义成红,嗯,比如说f一放置到这里面。
什么都可以,当然前面我们就定一个红就行了,就翻,啊啊好的,那么今天呢我们就讲到这里。
P22:033-封装放置技能代码 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么我们在上一节课分析了放置技能的功能,这节课我们对相关的代码进行封装。
那么首先呢我们添加一个机子啊,这个是一个新的机子,这是选做技能对象的,那么这个机子呢可能在选中我们背包的机子的时候,可能它也有效啊,那么我们现在做一下测试,这个机子,会加到游戏里面。
来看我们打开我们的背包,那么我们选中这个药品的时候呢,我们发现呢这里呢看着也会有一个,选中药品的时候,还有选中选中我们背包或者是装备啊,这些呢它都贵,有一个对象的地址往这里写入,所以说这个它不是技能啊。
不是选中技能专有的,不是选中啊,选中物体专有的转移,选中物品或技能,但是呢这个呢他又不能够选中我们挂一部什么啊,比如说我们选中自己,这个呢它没有行业,或者是我们选中怪物啊,这个有选中怪物没有关系。
那么选中怪物我们是用的一个数组的下标,那么这个人物品和技能呢我们是一个对象好,那么我们添加这个机子,先展开我们的机子单元。
那么我们这里是选中的啊,物品我记得,那么然后我们再来添加下面的功能代码,在上节课呢我们已经写了相关的代码,这节课我们要把它转转化成啊c语言的这个代码,那么我们试一下这一段代码。
那么这个函数我们先展开我们的结构单元,看添加在什么地方呃,选既然是选中技能的,那么我们就暂时把它这个相关的函数呢,把它放置在我们的技能列表里,放下我们的技能对象,到f一再f10 。
那么这里呢我们要呃有应该有两个参数,一个是我们技能的名字,技能的名字,那么第二个参数呢,我们应该是放置在这个f一到f 10的这个数的下标,啊应该有这两个参数,具体放在某一格f一到f 10。
啊然后呢我们把这个复制一下,添加到我们的代码单元,那么首先的话我们是应该是要找出啊找出这个技能的对象,要通过这个技能的名字在我们的这个技能列表里边啊,找出这个对象。
那么然后呢把这个对象呢写入到加288这个偏移写入到这个地方,好那么我们还是把这段代码复制一下好吧,还会考,呼呼,否则最后我们注释掉,那么首先呢我们是通过这个名字找到这个对象啊。
或者说是取得还有相应的一个下标也可以,那么我们可以呃要偏离我们的技能数,首先我们在偏离之前呢,我们做一个初始化,在这里我们先初始化数据,然后我们再偏离整个技能内容,9898,然后我们取出它的名字。
那么这个名字来由我们传进来的这个参数的名字呢,我们这两个名字来放在一起进行一个比较,那么如果这两个名字它相同了的话,那我们就取出相应的一个对象,当然最好的办法是怎么样呢,我们这里还要去计算的话。
比较麻烦,最好的办法我们是在呃这个技能对象里面再添加一个属性,那么在这个技能对象里面呢,我们再添加一个属性,再添加一个什么属性呢,再返回一个它的一个对象对象的一个积极啊,就这样一个属性。
那么我们就用不着再通过下标去把它算出来,然后呢我们进入到它的初始化部分,那么在这里进行初始化的时候呢,我们首先呢就初始化它的嗯一个机制,我这叫错白,对不起。
那么这个机子的话就是我们啊取出来的前面的这个nd list,再把这个名字修改一下,把头文件单元,那么在我们编写代码的时候呢,我们就可以直接用这个机子了,在这个地方我们就可以直接用这个气质。
那么如果偏离到了之后呢,我们就直接就什么呢,就写入,然后就退出,就写作我们相关的,这个地址,那么这里呢我们就直接用汇编写,用,16,加上x258 这里的偏移哈,然后再写入我们的对象。
但是要先把对象取出来,应该,那么取出对象的话,也就是我们tlist啊啊对,但是我们这样学的话啊,在汇编里面他好像是不支持这样的一个网数据访问方式,我们需要另外再定义一个变量,嗯嗯,哈哈哈。
好那么这里呢我们就取出相应的一个对象的一个机制,那么取出来了之后呢,如果这两个相等,然后我们就写入到这个2688的地方,啊这样我们就是写入了,但是如果是整个循环完了之后,我们都没有找到的话。
那么我们就返回来,啊如果成交for循环都循环完了,那么循环完了之后呃,如果我们这个nd base它还是等于等于这个空等于零的话,那我们就直接就反过怎么,那我们就返回fs。
就是说放直放置我们这个技能对象呢失败啊,这个可能调用失败了,那么如果这个不为空,那么我们继续执行后面的代码,那这前面一部分我们已经相当于已经完成了,就是这个我们去完成,那么接下来就是后面这一部分。
后面这个模拟只是加入这个空调,这个空,那么这个库的调用的话,我们直接嵌入汇编就可以把这段语句呢我们把它再修改一下,那么第一个呢这里要改一下啊,首先我们这个机子我们用红来替代它。
你看一下这个机子我们有没有添加相应的这个红,在这里来找一下啊,这个我们也需要添加一下,它是相应的一个机制,相当于是这个放置技能课的,参数,那么我们也添加在这后面,哈哈哈不是,参数这个是它参数相关的机制。
啊还有一个是我们放置技能扣这个机制,我们聊天一下,来过,啊或者是我们修来的,把它写好了之后呢,我们把它复制一下,用相应的代替,那么这一行呢我们可以写成两句啊,首先把这个词放到我们e d i里面。
然后呢我们再取出这个eti x是有了个数字,这样写,或者写成一句的话,我们就需要加这个d word加ptr的一个前缀,那我们先就这样写,然后呢在后面这两句呢我们就可以不改动它,这里我们也不改动。
那么要改动的就是这一句,那么这个括呢我们首先把它放在ex,rocare啊,然后我们过一这样的编辑才能够通过,我们不能就直接扣,还有就是这个下标的问题,下标的话我们就是通过这个参数传进的。
当然这里呢我们最好是先放到我们的寄存器里,再放在剖析他直接啊呼吸这个变量的话,有可能会出错,那么我们再编译一下,哈哈哈哈,对了这里我们缺少一个汇编的这个相应的总用于限定,好再编译一些。
那么还有一个就是异常的处理,那么这里呢我们也加上相关的一个调试信息,哈哈哈哈,那么如果是出现异常的话,这里我们就直接就返回了,然后fast也是放置不成功啊,如果是成功的话,我们会处。
好那么接下来我们进行一下相关的测试,然后我们已经到测试单元,那么这个测试这里呢我们就是get data,这里打印信息我们就不用了,就直接是,然后呢后面就是我们的技能名字,然后比如说我们放置到第三个。
它的下边就是2米,然后我们放置这个疾风端木疾风残影呢,我放这个疾风残影到第三个,把它再编译一下,哈哈哈哈哈哈,好然后我们进行测试,那么第三种没有放置技能,我们化解主线程,那么我们看一下是哪里。
这里出现了异常,那么我们看一下我们代码哪里出错了,88取出来的,r c c我们看一下怎么学习班,in sex加,那么在这里呢我们还需要加上一个判断,好爱,那么如果呢相应的像我们没有啊。
就是他的i d或者是它的类型,如果是无理的话,如果是空的话,那么我们就继续下一次循环,那么要加上一个判断啊,如果没有这个判断的话,那我们来执行后面的话可能就会出错,好那么我们再重新编译,再测试一下。
哈哈哈,然,后呢放在主线层放置,然后我们看有没有成功,那这个时候汉字呢失败了,嗯疾风疾风产品,那么我们再看一下啊,消息是传过去好,然后我们看我们的名字是否团队,棋风残影,我放在第三个世界,哈哈。
还有我们看一下它的地址是否取出来,去正确的这里取出,放到地址,写到这个机子里,那么我们先把后面这一段代码,先帮我看一下啊,取出来,然后我们传参数的1602561356,五第二。
那么看它是不是在这个地方放了,他没有找到匹配的字串,我们这里的条件少了一个零啊,因为相等的话,它是几个名字,这样犯了一个错误,好,好,那么我们再来编译一下,挂件竖线程啊放松,然后再切换到游戏里面看一下。
那么这个时候来启动成语呢,对他就是已经放到了第四个,然后再点进行,那么这个时候呢我们测试了就是成功了,好的,那么如果我们换一下啊,疾风端木或者是疾风烈火,来看一下,放在第一,这个人可还有图,疾风烈。
那么这个价格是五的话,我们是放到了第六个,把其分裂孔放大,好,那么就是,挂件主线程啊,放到了第六,好的,那么今天我们的代码就写到这里,那么下节课呢我们就找这个下面的这个f一到f 10的这个功能呢。
以及相应的技能使用的功能,那么技能放到上面,我们要使用这些技能啊,要用技能来攻击我们的这个怪物,所以说我们还要分析这个技能的啊,或者是相应的一个功能,那么这个呢也先当成是一个坐垫啊,大家下注做一下。
那么就分析一下这个技能的相关的空,好的,那么我们下一节课再见。
P23:034-快捷栏分析,使用技能 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,qq 15033657,欢迎大家参加郁金项技术编程培训,那么今天这节课呢我们一起来分析一下快捷栏的数据,分析,所有的目的呢是分析技能的一个调用,那么这个游戏的话。
记得呢它需要放在下面的这个快捷栏上面,然后点我的右键或者是按相应的f一这个功能键的,才可以调用相应的我们的这个技能,那么所以说我们可以呢,也就是说在使用技能的时候。
他肯定要访问这个所谓的啊成熟这个对象的这个地址,这个地址的话f一到f 10的话,很有可能是一个数组,就像我们的背包数组技能数组一样,那么所以说我们可以先尝试一下,找一下有没有这样一个数据,有的话。
等会我们可以等一会,我们可以从这个数组呢来一下啊,来回溯找这个技能的使用扣,那么我们先打开c找这个技能数据啊,快捷栏的这个数据,啊那么我们先附加到相应的进程,那么这些呢我们是收未知的初始值。
然后我们让我们以这个f一啊,我们先找f一这个变量的地址陈述这个对象的地址,那么我们往f一在上面呢移上去一个东西,那么这个数值呢肯定就变动了,但是它只变动了一下,然后我们没有去改变,它就是未变动的数字。
因为变动的数字我们可以修很多次,好我们可以在里面走上两句话,然后再说会变更的趋势,可以去改变一下其他的单元,但是在第一个了还是没有变,还是收入变动的数值,那么然后呢我们把它移开,这个时候呢它变动了。
我只想变动的数值,然后再升未变动的数值,然后我们再移动一个对象到f一上面,这个时候它的数据的变动只有变动的数值,只剩一次,再稍微变动的数字,移开之后再移回去,再交换一下,是变动的数字。
现在这上面有有这个对象存在呢,而且这个数字呢他应该比你大,所以说也可以在搜一下丙丁大的数十,再收为变动的数值,啊好再把它移开,那么移开呢它很有可能就是用数据零来表示这个地方是空的,那么我们再搜一下主题。
那么这样说出来就比较少,然后我们再把相应的技能放到f一上面,这个时候呢这个这个这个啊是有数据的,我们看一下16进制的值,这个那么我们都知道地址的话一般都是定位啊,定位16进制的数量来表示一个地址。
那么所以说的话这两个的话可能是表示的i p啊,也可能是那么可能性最大的呢是在第一个啊,我们先因为它的数值呢看起来更像是一个地址,那么我们先找一下什么地方的代码访问了这个地址。
这个时候呢我们就可以来找到一个数据,这里呢是一个数组的方法,我们哪个方式,那么这里ex是机子,这里ec x是机子,那么ec x的值呢,我们把它记录一下,mix 1 a6 b16236401 16性质的。
这个要勾选16进制,然后我们能够找到这两个地方是一个机子,能够找到一个机子,再来个电话,那么我们先把它记记录一下这一段,刚才这一段我们这里写出了一个对象,但是我们,锁入动向是快捷栏,会。
那么它的这个机子的话就是这两个当中的一个,那么我们再来看一下谁是他真正的机子,那么这个时候呢我们看到这一段,这个clint e x e加上什么,这个就是它模块的机子加上这个偏移。
那么实际上这一句呢它里面包含的肯定就是机子,那么另外还有一个我们看看有没有事情,那么这个呢它也是一个机子,但是呢后面跟了一个e e s i s4 啊,那么这个呢它是一个740,这个我们印象很深刻。
但是我们数组的真正机制应该是这个字,这个那么也就是这个312848,哈哈哈哈,加410+40,我们的下标,好了,那么我们机子现在找到了啊,接下来呢嗯我们用d来看一下。
说那么打开我们的d。
附加到我们的游戏进程,嗯嗯,那么附加到游戏性质之后呢,我们看一下这个所谓的技能啊数据,那么前四个我们放了四个技能对象,那么前面四个呢就是四个地址,那我们改动一下,那么改动一下之后。
我们发现这里也空了三个,那么大概它就是我们的这个快捷栏,在这个数组,然后我们再用第一次进去看一下对象的名字,有些,真的,前面我们少加了一个括号,这里还要加一个括号,把地址取出来。
那么我们能够看到第一个对象,这里有个月影,让施展对象为1~69级啊,就是这个对象,那么第五个对象呢,我们看它的下标是四,那么我们看一下它的偏移的话,那么之前呢我们也有分析过啊。
还有一个c的偏移在背包对象和那个技能列表里面啊,那么这个呢对象呢它也是5c,这个地方是技能的人进,那我们加上cd啊,计量的文字,那么我们看一下它的类型是什么,去掉50偏移,那么它的类型又变了。
它的类型呢是1+8这个地方,这是机器和对象,那么这个上面除了放技能呢,它也可以放我背包里面的那些作品,也可以放放到里面去,那么我们换一个看一下,下边是一,这里就是fn这个地方放的是什么。
还是音译成长加50,这个地方呢tc啊,你三声变,嗯知道,那么在这里的话就应该是我们说的那个740那边的这个数据,这个地方所有所有对象的这个数据,那么我们来尝试一下,那我把一si来改成这个下标。
我们来试一下,加四乘以下标的话就是这个107,交换零七,那么按下回车之后呢,我们发现了刚好是指在指向这个地方,那么它加57的地方呢也是33指向的地址呢是同一个地址,那,么今天我们认识了一种新的类型嘛。
就是一是快捷栏的这个数据,我虽然是进了名字,那么目前我们所要的就是这两个地方啊,就是这两个属性,那么我们就够了,那我们在使用的时候呢,我们只要能够偏离到这个名字就可以,那么接下来呢我们就要就来看一下嗯。
他在这个时候我们可以先在指定的对象上面下一个断点作为尝试,那么我们就就以tq对象为主了,那么我们在上面下一个按键访问的断点,切换到游戏里面看一下,这时候我们按一下f一试一下,那加f一没有反击值。
那么我们把这个断点先删掉,那么我们用内存啊,内存访问的断点来试一下,那这个路程访问的重点,我们发现你试之后呢,他马上就会断下来,这个数字放慢之后,他为什么会断下来,因为他平时他在显示我们嗯显示的时候呢。
他也会去访问这个技能数据,那么访问了之后,他才知道第一格,这上面的应不应该显示相应的这个图像啊,那么所以说这种我们要找的话,我们还是要把og先退出来,借助我们的c a d来找看有哪些代码访问的网。
那么我们先删掉这个,这是机子,那么这是我们第一个f一对象刚才找到的这个地址,这个是f一那-1对象的一个地址,那么我们把它移开之后呢,他就会赢啊,你上去之后他就有,那么这个时候我们按下f一的话。
那肯定就会去访问这个地方,那么附加调试器,那么附加调试器之后呢,这个时候有很多地方在不停地访问它,但是这个时候当我们按下f1 ,按一下f一之后,那么新增加的这些呢就应该是在我们使用的技能周围的啊代码。
那么这后面的这一串都是我们按下f一之后才出现的代码,它并且只用了一次,还有现在比较比较这个相应的对象,f依赖的地方呢也没有放这个对象,那个兑现了是否为空,如果不为空的话。
可能呢他才执行相应的我们的就是技能,那么我们先把它记录下来,这个状态,那么有可能就是在他的后边,后边就是我们的相应的技能的一个这样轮廓,那么也可能是下一个,那么这几个呢我们都记录一下。
需要一个一个的尝试,但是我们能够看得到啊,都是67e开始671,这是67f,那么所以说像这种的话,我们记一个就可以了,那么这个六cf呢稍微要远一点,我们进行这个,那么再往后面移啊,也没有了啊。
就只有这几个,好的,那么我们再次把这个调试器取消掉,取消掉之后呢,然后我们还是用我们的o t来找一下,巧克,那么刚才我们已经用c一的话,应该是找到比较关键的代码附近,那么这个关键的技能调用库的话。
它就在前后左右上下这几个地方,那,么我们先转到第一个地方去看一下,那么第一个和最后一个呢它的可能性比较大一点,那是这这个后来是第一个啊,它首先呢会比较我们相应的,那么这里呢有一个下标g e s s下标。
那么这个下标它是怎么来的啊,我们找一下,那么ui的话它是来源于一个bp加八,那么bp加八它是上一层的一个参数啊,那么我们在这里下一个段来看一下。
那么这个时候我们按一下,啊比如说按下这个f7 ,那么按下了f7 之后呢,他就走到了这里,那么f7 的话,这里呢它的下边呢我们就啊那么回到上一层,这里呢啊汇编窗口图当中跟随。
那么这个ea x的话恰好就是传进来的下标f7 就是六,那么在这样的一个库的话,它是不是代表就是按下了我们的f7 ,另外我们看一下e4 x的是这个数值,这是ex的数值,然后我们让它跑起来。
然后呢我们再按一下f5 试一下。
那么f5 之后呢,我们看ex的质量模式,这里呢参数呢进来了解为四,让它把它运行起来,那么我们可以做一个尝试,按解控退回到这个阶段代码。
那么我们可以就测试一下这个库,它是不是就用了相应的啊,调用了相应的格数,调用这个库之后,复制一下这个过,用我们的代码输入器编写一下代码,那么比如说我们复习一是不是就是使用的f2 ,还有一个ecx的值。
我们看一下ec x的值,我们在这里下一段看它是时候每次都会变,那么我们再按一下f43 ,试一下f3 ,这里没有东西,它也会断,在这里我们看一下ec x值,那么ex的值没有变。
那么我们可以做一个有效的参数,按下f2 取消断裂的,把ec x的值复制出来嗯,然后我们诸如在游戏里面看一下,那么f2 这里呢是这个野山参,那么我们注入成功的话,它就会使用它。
那这里也生成的数量呢从120减到了119,那么我们换一个f7 ,这里我们就试一下,那么我们选中一个怪物,啊然后我们发现了我们相应的技能呢就可以使用,那么证明的话这个库呢就是我们所要找的课。
就在它的上一层,就在它的上一层,那么我们把这段记录一下,那么还有一个就是关于这个ecx的机子,那我们是通过啊,通过这上一层,然后呢就找到多种点地,那么就就找到了相应的扣,那么我们再进入这个框看一下。
那么我们实际上调用这个库的话,应该有两个地方,一个是我们在用按f一到f 10的时候,还有一个呢我们是用鼠标右键在上面点击的时候,他这里也会断下,也会传出一个相应的值数字姓名,那么我们从这里返回看一下。
那么返回的话,我们这个时候呢能够找到一个e4 x的一个机子,就在这个地方,这个过来是鼠标,实际上是一个空,只是它调用的地方不一样,那么这里呢机子呢它就解决了。
那么我们就可以在这里呢我们就能够找到一个相应的机子,当然刚才那个破败他的经历,他很显然影响到加上27c,啊就是我们刚才e c x的值就是这个名字,那么这里改一下的话,我们就可以这样写,哈哈哈,嘟嘟嘟嘟。
啊这样写就可以了,就是调用第六个,那么我们再来做一下测试,当然这里呢它也会传到这个货这里来执行。
好那么今天这节课呢我们就讲到这里,那么下一节课呢我们在对这个技能相关的这个扩展,进行一个相应的代码的一个封装,那么我们下节课再见。
P24:035-快捷栏分析,使用技能 - 教到你会 - BV1DS4y1n7qF
是郁金香老师,那么在上一节课呢,我们分析了技能的一个使用啊,那么这节课呢我们把这个代码进行一下整理,嗯然后呢我们把它封装成一个函数啊,那么上一节课呢这个是一个作业啊,不知道大家做没有。
那么我们打开第33课的代码。
那么在他的基础上呢,我们进行一些修改就可以了。
哈哈哈哈,那么首先呢我们也是要添加相应的机制,那么一个是我们快捷栏的数据,f一到f 10的这个数组,318 18,啊这个呢我们在上一节课呃,已经添加了这个放置技能的这个参数。
我们看看这是放置技能的参数啊,那么这个参数呢实际上就是我们今天要找的这个技能数组,现在我们才发现嗯,那么我们就可以直接呃另外取一个名字就可以了,对这,那么我们可以把这个放在前面。
然后这里呢我们直接就这样替换一下就可以了,可以了啊,然后更新基础的时候呢,我们就更新这个地,那么另外还有一个机子呢,就是我们相应的技能调用cod这个快捷栏扣,或者像那么我们添加在这里面,好。
添加好了之后,我们看一下还有一个ecx的参数,f41810 ,这个我们添加上,那么这里它需要一个偏移来完成,那么这里我们可以把这个偏移的公式来给它加在,哈哈哈哈哈,好了,那么有了这些准备之后呢。
我们就可以开始封装相应的函数,那么首先我们封装的这个函数呢,嗯首先我们要做的应该是把下面的这个快捷栏数据啊,把它偏离出来,我们看上一节课有没有做这方面的工作啊,有一些我也忘记了,f一到f 10的,八。
当时呢这个只是把它放置到我们相应的这个技能的f一到f4 上边啊,那么在这里呢我们可以来把它一起封装在这个技能列表里边,也可以,另外工作也可以,那么再生们还是把它另外封装一下,太变态。
那么这个技能栏数组的话,快捷数组的话一共是它的数大小是十,那么我们还要定义一个技能栏的对象,那么这个对象的话我们把它复制一下,嗯,那么目前呢我们对我们有用的属性呢就是一个技能的名字。
但是我们也把这个它的类型也加上,一个是技能名,一个是技能的类型,这两个呢对我们有用好,那么我们先进行一下偏离啊,因为我们要判断上面有没有我们的技能名字啊,没有的话,我们还需要调用上面的这个函数。
来把我们可用的技能栏放到我们的技能栏上边,那么我们先获取我们的数据,转到我们的cp p单元,移到最后,嗯嗯,那么移到最后了之后呢,然后我们对这个我们的对象列表来进行一个初始化,异常处理对对对。
那么数组的大小来是10,那么我们是从0~9就可以了,所以说是小于一零哎,加一下骗离我们整个数组,那么在偏离数组的时候呢,我们就要先取出前面的这个机子,先取出这个机制,哈哈哈哈哈,哈哈。
然后呢这个机子取出来之后,我们还要加上饲养的这个偏移,0x4100 ,那么加上面才是最最终它的一个机制,那么有了这个机子之后呢,在里面我们就可以了,用数组的方式来访问,这里我们定义成指针嗯。
想一下定义成指针的话也不太好啊,那么我们还是先定义成指针,当然定义成指针之后,这里我们看把数据读出来,那么这里还需要做一个类型的转换,不好好在后面也要扩散的这个好,那么这样我们把机子读出来之后。
那么后面呢我们就可以用它取里面的对象地址,然后呢我们再用我们的这个列表来进行复制,但在复制之前我们也要判断一下,判断一下我们所取出来的这个词啊,是不是呃为空,那我们先看一下相应的数字。
比如说i那么如果这个值等于空,那么我们呢就继续下一次输,就不执行后面的代码,那么如果它不为空,那么我们再做相应的,那么这个地址取出来之后呢,我们要加上相应的一个偏移,那么第一个偏移是0x08 。
那么第二个平移我们再来,然后再加上一个他的地址,取出来之后呢,我们再加上一个他的圈子里面就是火c啊,那么加上之后呢,我们再进行相应的一个复制啊,当然这两个呢偏移如果是用的多的话。
我们最好的还是建一个偏移管理的一个单元啊,那么当然也可以自己去了啊,把这些偏移了,把它集中在像我们这个机子一样集中在一个单元里面啊,管理的话要好一些啊,那么我们现在我们先不管它。
那后边我们一起来整理一下,那么这里我们复制完了之后呢,呃初始化的工作呢我们就做完了,当然在前面呢我们还要用一个masert,最大兴趣初始化,不是,嘟嘟嘟嘟嘟,好再编一下,那。
么在后面呢我们要定一个相应的类型,给它加上,好那么这里呢我们把相应的这个数据来进行了一个初始化,那么初始化之后呢,我们再封装一个相应的一个使用技能的一个函数,使用我们相应的一个技能。
那么这个呢我们在结构里面先添加啊,1234,哈哈哈哈哈,嗯那么首先呢我们要根据这个技能的名字呢,要先找到相应的它在哪一个要获取一个它的下标,因为我们找到的这个库是用下标来做参数的。
那么所以说我们首先是要定位它的一个下标,那么这个可以单独写成一个函数,也可以就集成在这个函数的公式,那么首先我们来骗你整个teast的这个数据唉,那么取得了它的名字,那么取得他的名字之后呢。
我们与传进来的这个参数呢进行一个比较,那么如果这两个名字相等的话,它的最后返回值呢是零,那么相等的话,我们就在里面呢调用相应相应的这个库功能的这个库,那么我们来看一下我们的这个课。
上一节课写的就是这一段,那么这里呢我们直接嵌入后边几部,呼吸的,这是e x,然后呢我们在第二个参数呢是ec x,b c x,然后呢它有一个,有一个偏移,看一下这个偏移是多少。
那么偏移呢是你应该开始227c这个偏移值,加上第374,那么最后呢进行扩,那么扩的时候呢,我们先把它放到e x,那么这样的话我们就能够调用相应的相应的技能啊,比如说要调用这个疾风灭火。
那么先他会找到它的下标六,然后呢这个六呢传给这个ex进行压栈操作,最后来调用这个库就可以了,那么这个完成之后呢,我们这里也放管理,那么涉及到这个扩的一个调用的话。
那么在这里呢我们也可以加上一个异常的处理,不知,进行一个换行的处理,那么如果是异常的话,那么这里呢我们直接就能带回家,这,里我们多了一个0x,再重新申请一下,好生成成功之后呢,我们注入到我们的游戏。
快去,对啊,我们还需要来进行一个测试单元的一个代码的一个添加,那么在这里呢我们也给他申请一个全局的变量,然后来进行一个套出的一个处理,接下来我们在测试单元啊,hook这里呢进行相应的测试,先get到。
然后呢nekill,然后呢我们这里加上一个几分类,好的,那么我们再重新编辑一下,这里我们注意退出一下,先把我们的og啊也抽一下,看到o d的话,这个时候呢d呢它会加载这个动态链接库的一个符号列表。
那么呢造成它改写文件,改写不了,编译不成功,好这下编译成功了,然后呢我们输入到游戏里面,那么我们要需要先选中一个怪物,然后呢再调用这个技能,那么我们测试了没有成功,我们看一下啊。
看我们的调制器消息传过去了啊,但是可能他没有尽到相应的单元里,那么我们再来看一下我们的代码,use carefully,那么我们转到里面再看一下,技能啊,技能名字我们看有没有这个技能,有疾风。
练好这个技能呃,那么找到之后呢,我们在这里呢给他加上一段调试信息,看下我们的代码有没有执行到这个地方来,当当,好那么重新编译一下,嗯对了,还有一个问题这里哈,那么就是他在比较的时候啊。
有可能相应的某一到数组里面的,它没有这个相应的对象,那么这里我们就取不出来,它可能会造成一个像异常,嗯我们再来看一下前面的一个赋值啊,那么在这里你看在这里啊,如果是空的话,那么直接就跳过了。
那么造成了这个数组里边它也有一些空的一些数据啊,那么所以说在这里呢我们前面还需要做一个另外的判断,啊如果他这个i里面的这个类型或者是名字啊,它等于等于零啊,这里我们也可以用分外表示等于零。
那么直接就写平吧,那么等于零的话,那么我们继续下一次的一个地方,那么两个名字相等呢,我们在执行相应的这个相应的一个扩,好的,那么我们再重新编一下,放进到主线程啊,然后呢我们看一下这个听写。
这个时候消息都没有传过去的啊,那么我们看看一下,可能是前面的代码出错了,再来看一下这个地方,neko,那么可能是执行到头部的时候,由于什么意外,他就返回了这,那么我们看一下这个函数它有没有执行到头部。
这个时候调试,那么这个也是一种解决问题的一种方法,那么我们看一下调试信息,那再重新编译一下,还有我们看一下这个启动项这里面,那么这个启动项目里面他的一个工作的目录也没有设置对啊,这个我没有设置对的话。
应该是注入的时候就注入不了,那我们再看一下挂机主线层,然后再执行它执行到这个框里面啊,然后呢被跳过了,那么这一句呢他没有执行到啊,名字让我们看一下疾风烈火,那么我们看这是名字传错了,这个是,疾风烈火。
这里我们少了四点水,所以说造成了他比较的时候呢找不到这个名字,好再次运行,挂机主线程,然后我们再看一下,放在主线程,然后呢这个时候呢它就能够调用相应的这个技能了,那么我们的测试呢就ok。
那么如果我们换一个技技能,比如说这个劣势劈天啊,我们可以再试一下,再重新编译一下。
哈哈哈,花间出现成,选中一个怪物,当然前面我们选中怪物的功能呢也是形象也写好了啊,已经写过了啊,那么这节课呢也给大家留下一个作业哈,那么就是我们如果要找的这个技能在我们快捷栏上没有的时候。
那么呢大家为它添加相应的一个代码,那么比如说我们这个疾风烈火,它没有在上面啊,那么我们搜索整个列表都没有找到这个技能,但是这个技能他又可用的时候,那么我们应该怎么编写代码来完成这个技能的使用。
那么这个就作为一个坐垫啊。
没事,那么也就是相当于我们在完善哈,这个函数做的就是,完善这个函数啊,呃当谢人口啊,已经学啊,已经学习学习时,让我们来蛋会放在我们的快捷栏上,那么这个时候呢就不能够使用啊。
就需要我们用之前的这些函数来把它放置到我们的快捷栏上啊,那么这个呢就是要完善我们的这个you scared for name啊,这个括了,那么你就是啊要先呢这个时候呢要完善的话。
就先把这个劣势p天放到这上面的空的这个如果这个技能没有在干,没有在这上面,那么呢先要偏离第一个呢,它是有多有对象的,第二个也有对象,那么只能放到第三个啊,这个是算法来自己去算一下,然后放到第三个之后呢。
再调用这个技能啊,好的。
P25:036-完善技能调用功能 - 教到你会 - BV1DS4y1n7qF
大家好,我是京翔老師,那麼在上一期的時候,來留了一個作業給大家,就是要完善使用技能的這個函數,那麼當時的情況的話,也就是說這個技能,要需要在技能列表裏面存在,我們才能夠標案這個技能。
但是如果是有的時候上面的技能不存在的話,我們需要另外編寫一段代碼,先把它移植到我們的跨界欄上面,但是本身放置技能到某一格這個函數,我們已經把它封裝好了,但是我們需要加的判斷。
就是要判斷這上面是否存在技能,那麼在放置的時候,那麼新的技能究竟該放在某一格,是放在第一格還是第二格,那麼如果它是有已經定格有技能的話,那麼我們是要放在第二個,也就是說要找空的位置,那麼好的。
我們打開第35課的代碼,然後我們的機制單元。
再把它添加一下,在一起,可能是清理垃圾文件的時候,把相應的配置文件給清理掉,再把它添加進去,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課,然後我們就把這個文件放到第35課。
然後我們就把這個文件放到第35課,所以說我們要用整形來表示,所以說我們要用整形來表示,不能用我們的DWORD,DWORD是無符號數,不帶複數的,不帶複數的,然後我們移到最後,(音樂),(音樂)。
(音樂),(音樂),嗯嗯嗯嗯嗯嗯,(Ping Pong),嗯,听起来很平凡,跳舞的时候觉得融洞的,不过舞蹈也不算很平淡。这种舞蹈 lovers是一个很好的朋友。另外,跳舞的舞蹈组也会给大家带来的。
(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐)。
(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐)。
(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐),(音乐)。
那么放置技能的话是另外一个结构里面的,是技能结构里面的,(音乐),(音乐),这个F10 E到F10,然后呢是一个技能名,但是这个时候呢我们,之前的话它是放置的是一个技能名,放置到这里,这个技能栏上面。
但我们现在所要的是放置技能名,后面还有一个下标,对了这里有一个下标,我们就是这个查询它的,这个空位置的一个下标,这个空位置的一个下标,我们把它放置进去就好了,(音乐),好那么这里写好之后。
那么还有另外一种情况,另外一种情况呢,就是呢它等于-1,-1也就是说整个这个技能栏上面,都放置满了这个技能,那么这个时候呢我们直接打印一段调试信息,(音乐),那么放置这段调试信息之后呢。
然后呢我们把Fast这个函数,就是说使用这个技能的话就没有调用成功,那么我们再编一下,(音乐),然后我们再转到我们的这个游戏主线层里面,看一下测试单元,使用烈士披天,那我们看一下烈士披天的话。
如果没有在上面,在上面的是其他几个技能,那么我们做一下相应的一个测试,(音乐),(音乐),打开我们的调试信息,查看器查看器看有没有错误,那么注入进去之后,我们先挂接主线层,然后呢。
然后我们选中一个怪物进行一个测试,但是这个时候我们看啊,放置了这个烈士披天,但是它并没有掉落这个技能,那么说明的话还是有点问题,是有点问题,我们再测试一下,(音乐),那么重新我们把这个代码需要看一下。
使用技能分类,那么这里来放置到技能栏,那么放置之后我们并没有使用这个技能,那么所以说在这里放置之后,我们还是要调用一下,(音乐),或者在这个二十就不要了,这里让它始终都要执行到这一行。
那么这里在放置技能之后,我们这个Ni Index也需要进行一个复制,复制为我们的Ni取得的这个下标,取得的这个下标词,然后呢,再执行到我们在后边,它始终就会掉落这个技能,(音乐),好的。
那么我们再次编译一下,(音乐),那么这里它掉落之后还需要看一下,它有没有成功,如果是没有成功的话,也需要它有可能就是说在掉落的时候不成功,这里出现了异常,那么也可以加上一个判断,也可以不加,好的。
那么先测试一下,(音乐),挂接主线材,然后我们选中一个怪物,(音乐),这个时候来测试PK不存在,然后我们,它也是要第二次才可以执行,(音乐),那么再来看一下我们的代码,(音乐),那么这里可能是两个动作。
一个是放置,一个是使用技能,那么它这两个动作之间,应该是需要一个,需要一段时间来发送到我们服务器上面,有可能是这样,那么我们再重新编一下,这个逻辑上它是没有错过的,那么可能就是一个主线材的一个占用。
那么在这里它放置了技能之后,它会向服务器有可能要发送一个什么信息,也可能,那么它要等到服务器处理之后,要过个几秒钟的时间,或者是一小段时间,才能够使用这个技能,那么也可能是我们刚才的代码。
还没有重新编译,我们再重新测试一下,这里我们打印一下调试信息,放置技能,我们再来看一下这个逻辑,这里找到一个空位,放置技能,我们要看它放置成功率,好,我帮你弄一个,嗯,嗯,嗯,嗯,嗯,嗯,嗯,嗯,嗯。
嗯,嗯,嗯,好 那麽我們再重新把它編譯一下,嗯,你是要第二下好像才可以,那麽聽一下,他只是放著了,你在技能這個動作,沒有攻擊我們的怪物,第二下來才攻擊,如果是這樣的話,我們可以嘗試,那麽先放置技能。
然後再等待一段時間,這個就不能夠放在主線層裏面寫,要放在主線層之外,這兩個我們要分開寫,那麽我們可以把這個功能分開的話,就是,看,move scale,關鍵,那麽我們就是先放置技能,然後或者這樣。
我們看一下,按鈕,這裏,我們寫兩個,另外一個MSG,TEST,再發送一個信息,發送兩次,那麽也可以,那麽也可以實現剛才的一個功能,那麽這裏需要一個Sleep,一段時間,那麽再發送這個消息就可以了。
那麽解決這種情況,那就相當於第一次調動了,這個時候,因為它服務器的信息還沒有反饋過來,那麽調用這裏的話,實際上當時的話,這個技能應該是還沒有放進去的,沒有真正的放置成功,那麽所以說要第二次調用的時候。
它才會成功,那麽這個時候我們看它就可以了,實際上我們可以把調用技能和前面的兩塊分開寫,但是我們就下一節課的時候,後面我們再進行一下修改,我們只要知道這個原因就行了,那麼原因也就是說在這裏,它放置了技能。
我們這個代碼執行的時候,它沒有等待的時間,實際上它沒有完全的放置在上面,那麽所以說在後面,它可能是不成功,那麽所以說要第二次才可能,我們再來看一下這個服務器,然後等於-1,執行完了之後,這裏有個返回。
這個是不會執行的,那麽應該是執行到這裏的第一次,我們還可以加一個調試信息在這裏,調用技能,再測試一下,看是什麽原因,那麽再把我們這邊的改一下,然後我們再輸入,畫質處現場,那麽我們發現的話。
這個時候掛接主現場的話,它這裏並沒有我們相應的消息,消息傳過來,我們再選擇,這次好像可以了,移除去了,我們再測試一下,這段消息,它始終沒有打印,打印我們執行的那一段消息,整擴的,畫質處現場,然後呢。
這次成功了,那我們來看一下,把這個Sleep去掉,看看,然後我們再退回來,那麽這個調試信息的話,它應該是要打印,但是為什麽沒有打印,那麽我們再重新編輯,再看一下,再調整,把這個移開,調用,使用了。
這個技能二已經切換到我們相應的位置了,但是它也是要第二次調用才成功,那麽看一下,加上剛才那個Sleep,是不是剛才的Sleep的原因,這次的Sleep,畫質處現場,然後我們一起看,選中一個怪物,測試。
這個時候還是沒有動作,那麽說明的話,這個技能要調用成功的話,它可能還是要服務器,它有檢測,這個數據,放在這個技能欄上面的數據,你要先傳到服務器上面,所以說這裡它需要等待一段時間,所以說這個需要調用兩次。
但是我們可以了,這裡的話可以把它分開寫,那麽具體怎麽寫,我們到下一節,在晚上這個代碼,那麽這節我們就到這裏,那麽這個結果臨時的解決辦法,我們就是在這裏調用兩次,就可以,調用兩次,好的。
那麽我們下節課再見,謝謝。
請不吝點贊訂閱轉發打賞支持明鏡與點點欄目。
P26:037-修整完善技能调用 - 教到你会 - BV1DS4y1n7qF
大家好。
我是郁金香老師,前面一刻我們在調用技能的時候出了一些問題,那麼這幾個我們就解決這些問題,主要我們先打開第36個的代碼,那麼首先我們先修改一下。
放置技能的這個函數,那麼找到我們的技能結構,技能列表,那麼我們在另外給它寫一個函數,同名的,因為前面一個函數,我們在放置技能的時候,我們需要指定一個下標,那麼這個函數,我們就讓它自動的找空位置,然後放。
然後如果是指定的對象已經在我們的技能欄上,比如說放置面試內任,它檢測到已經在快捷能上面存在,那麼就不用再放置了,就直接去返回,那麼所以說我們在這裏需要修改一些代碼,那麼一到代碼單元,一到最後。
那麼我們要做的第一個,就是檢測技能是否在快捷欄上已經存在,那麼如果已經存在的話,那麼就直接就返回空就行,那麼這個我們可以通過F1快捷欄,它裏面提供了一個相關的一個函數。
getting-text-for-name來檢測,那麼指定的技能是否存在,那麼在這裏我們定義一個變量,我們做一個判斷,那麼如果N1它等於-1,那麼我們就,如果它等於-1的話,我們才繼續後面操作。
但如果它已經大於等於0,不等於-1的話,也就是大於等於0,那麼大於等於0的話,說明它返回的是一個下標,那麼返回的如果是下標表示它存在,那麼存在的話,我們就不用放置了,它已經放置在快捷欄上面。
那麼另外一種情況,我們才需要找空位置,放置進去,然後我們就將就前面的變量用,然後我們需要調用機,我們需要一個空的位置,返回的一個下標,那麼如果空的下標也沒有找到的話,那麼就證明我們這個技能欄。
它已經佔用滿了,佔用滿了,並且不存在,如果這個還是等於-1的話,還是沒有獲取到正確的座標的話,那麼我們就打印出調試信息,快捷欄,已經滿了,那麼快捷欄滿的情況,你可以做自己的處理。
或者我們強制的放到第一個,擠佔其他的技能的位置,或者我們就不做處理,直接我們就返回一個BUS,就直接就返回,那麼如果獲取的座標,它不等於-1,是一個正常的座標,那麼我們再調用另外一個存在的函數。
它帶了下標的函數,我們直接調用就行,然後再返回,或者是直接它本身的返回值也是過日子,或者我們直接就返回前面函數的一個結果,也可以這樣寫,或者這樣寫,可能要清晰一些,好的那麼我們再編一下。
那麼這個地方在上一期看還有一個BUG,那麼這裡如果我們已經找到了,就應該退出這個循環,這樣算法的話更優一些,當然如果不退出來,它也不會出錯,因為後面的名字它都不相等,但這裡加上一個Break。
這樣我們可以少佔一些CPU的時間,可以少幾站一些CPU時間,這是放置技能這一塊,我們再檢查一下,那麼邏輯上我們看還有沒有錯,代碼已經沒有錯,放置我們的技能,然後這是獲取我們的下標,好。
那麼這個函數我們修改完了之後,我們還需要修改另外一個函數,技能使用的,這個那麼技能使用的,我們因為放置技能的,在這個我們已經寫的很簡單,那麼在這裡我們就把它也簡化一下。
那麼我們就不需要這些檢測的這些功能,直接就使用這個技能就行,GPU-X4-Link,然後我們檢測,看檢測到,檢測到的話,我們就把它寫好下標,那麼在後面的這一段,我們就可以不要了。
這樣我們把它弄得簡單一些,我們再測試一下,好,嗯,这次我们修改代码之后,它好像可以实现了,这里没有放相应的这个技能,那么说明我们上一节的代码就只有这些错误,但是最好的话我们是把它分开写,可能要好一些。
使用的时候,再测试一下,把相应的技能,你看,说明相关的放置在技能栏上的数据,它应该是没有发送到我们服务器上面,我们再看一下代码,这样使用它已经可以了,那么说明我们上一节看到一些猜想是错误的。
那么这个过程暂时就这样封装,那么我们在封装好了之后,我们把它添加到我们的现成的单元,也封装一个类似的函数,那么前面我们有一个使用物品的,那么这里也有一个使用技能的,加上一个。
那么我们参照前面的代码修改就行,这个把它提前把它的改一下,使用技能,那么这个函数改了之后,我们也在主现成单元来给它添加相应的代码,添加在测试代码的前面,这样我们可能好发逻辑。
然后我们在这里后面的代码复制一下,跟前面比较相似,我们复制前面的这一段代码,那么复制了之后,这里我们也把我们技能里面的指针给它传进去,这个消息的类型,我们要修改技能的相关消息,修改之后。
我们需要在前面的开始语句里面加上我们的消息处理,那么这里实际上我们就是调用相关的技能使用,这里到底,那么这里我们也是按照前面的方式,参数给它转换一下,好,那么下次要调用的话,我们就直接可以调用。
Message,User,Skill,Wallet,那么这样我们这个函数的话,那么这些下边的所有函数,我们都可以在非主线程里面,以下可以在非主线程,那么这里我们再改一下相应的一个测试。
上一期看我们这里是它加了两次,所以才可以,那么我们再来测试一下,如果这里它只调用一次的话,那么可不可以,我们先做一下测试,这个动态链接库没有卸载掉,我们再重新卸载一次,(音樂),(音樂),(音樂)。
這裡編譯失敗了,這裡我們不需要參數,這個數值機我們已經使用過了,這裡我們需要另外使用一個數值,我們再測試一下。
掛機到主現場。
然後我們選出一個怪物,依然是可以執行的,說明我們上一次所說的那種情況,這個數據要發到服務器,實際上它放置這個技能的話,應該是不會傳到服務器,或者是這個技能已經在上面放著,我們再把它脫掉,再看一下。
把它脫開之後好像是不行了,這個是老麻,那麼我們還是要按兩次,那麼這種的話,我們還是需要把它分開寫來解決,我們再來看一下,移到相應的技能使用這個單元,這個單元實際上可以不改。
那麼我們要改的就是需要把它寫成兩個,叫客來執行,或者這一段我們把它去掉,那麼如果它是等於負一的情況的話,我們直接就放著或者是打印一段調試信息,那麼這裡就只有一個放置的機制了,這個機制是可以不改的。
我們只要把它設定成一個新的機制,然後我們就把這個機制設定成一個新的機制,然後我們就可以在這個機制裡面,把它設定成一個新的機制,然後我們就把它設定成一個新的機制,然後我們就把它設定成一個新的機制。
然後我們就可以把它設定成一個新的機制,那麼我們就把它設定成一個新的機制,那麼這裡就只有一個放置技能的動作,那麼如果它不存在的話,我們就去拖動相關的技能,放置在技能欄上面,我們把它分開來執行。
那麼所以說這裡我們需要另外寫一個放置的一個函數,寫到我們的這個主線成這裡,那麼剛才只是一個使用技能,我們還需要另外一個函數,要放置技能的,這個,那麼這裡寫了這個函數之後,我們移到主線成。
在SCP和客主線成的單元,然後來添加我們相應的函數,把上面這一段補製一下,那麼只是這裡的消息類型,我們還需要另外建一個消息的類型,那麼放置我們的技能,那麼這裡消息的類型,我們需要變動一下。
那麼再切換到我們的相應的消息處理,那麼在這裡我們再教用真正的放置技能的函數,那麼再把上面的這一段補製一下,那麼在編輯,那麼在我們主線成這個單元,我們就有兩個函數了,一個是放置,一個是我們使用技能。
那麼這兩個函數,我們再傳到測試單元這裡來調用就可以了,我們就調用其風6號,這個,讓它先放置技能,然後我們再使用技能,這個時候應該就可以了,那麼我們再輸入到遊戲裏面,先把相應的技能先把它移開。
然後再選中一個怪物,然後掛機到主線上,然後執行,那麼這個時候第一次它就可以了,把它放到上邊,並且可以執行,然後移開,這個時候我們就只需要了一次,這樣調用就可以了,當然如果我們要把它封裝成一個函數的話。
我們就需要了把這兩段代碼寫到,寫到一個庫裏面就可以了,那麼我們也可以把它這樣寫,如果是要寫成一個的話,你就把這一段放置的代碼,我們添加到這後面的相應的一個單元,這是我們放置技能,這是使用技能。
那麼我們可以把它添加到這個單元,它會自動的檢測,如果存在的話,它不會放置,不會存在的話,它就會放置一個,那麼這樣我們只需要放心的使用我們的技能,就可以了,那麼就不需要兩次的調用,好的,我們再編一下。
他們在選擇一個怪物,然後來掛接到主線程,執行,這樣就可以了,好的,那麼也就是說我們在有的代碼,我們該封裝在主線程裏面,那麼有的代碼,我們不能夠寫在主線程裏面,這裏,那麼這段代碼它就沒有包含在主線程。
那麼哪些代碼它會在主線程裏面執行,那麼只有我們通過消息發送到這個Case。
那麼這個單元裏面的代碼,它才是掛接在我們的主線程上面來執行,這個跟WMDPIO,這裏面的所有Case單元的,它才會在主線程裏面執行,所以說我們一定要把它區分開,最好我們就是說,單獨的功能。
我們都在主線程之外,給它封裝一個函數,然後把消息投遞到主線程,這樣來執行的話,比較安全一些,不容易出問題,好的,那麼今天這節課我們就講到這裏,那麼我們下一節課,大致的可能就要完成我們怪物的選中。
自動打怪的相關功能,那麼上一節我本來也跟大家做了,那麼如果做好沒有做好的,再繼續完成一下,就是自動選怪打怪的時候,來使用技能,那麼把這些代碼自己做一下,自動選怪打怪,自動使用技能,好了。
那麼我們下一節課再見。
P27:038-封装自动使用技能打怪功能 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么前面呢我们已经有一个普通打怪的,也是自动打怪,但是呢他没有使用技能,是使用了一个攻击的动作啊,他已经实现了一些呃相应的功能,那么这节课呢我们在前面的基础上面进行一些修改啊。
嗯那么我们今天这节课呢主要是实现一个使用技能啊,自动打怪的打击为怪物的一个功能,那么我们打开第37课。
知道。
哈哈。
那么第37课的代码打开之后呢,我们先切换到,结构单元移到我们的人物角色的相关的这个结构里,玩家角色可以找一下,让玩家属性动作啊,这里有一个,那么这里面呢我们已经有一个自动打怪了。
但是这个自动打怪呢呃他没有参数,是用的一个普通的一个动作,所以说这节课呢我们要做一些修改,那么在它后面来存在一下这个函数嗯,加上一个参数,加上一个我们的技能名字,使用相应的技能呢我们自动打怪。
然后我们转到这个自动打怪的,用普通的这个函数的后边添加我们相应的代码,那么我们把上面的这一段代码复制一下,在它它的基础上进行修改就行了,那么空气动作这里呢我们就换成我们的技能,二。
那么这样理论上我们就可以了啊,但是我们上一节课呢,我们对这个相应的课呢进行了一些修改,那么如果技能没有放在上边呢,我们同样的啊不能够嗯,那么同样的不能够呢呃使用这个技能,所以说在这个自动打怪的前面呢。
我们再加上一句,那么再加上一句什么呢,就是呃放置我们的这个技能吧,不知道,那么先放置技能之后呢,然后我们再使用这个技能啊,这样呢我们就可以了,那么如果这个技能呢它没有放置了。
我们就会调用这个库去调去放置技能,如果他本身已经放置了,那么在这个函数内部的话,它会有这个检测啊,那么如果他已经放置了这里呢,他直接就返回了,检查到他放置了这个技能对象的话,好的,那么写好了之后呢。
这个课呢我们把它嗯把它添加到我们主线程的单元,自动打怪啊,那么这里设置好了之后呢,我们切换到流线线程单元,那么在这里呢我们给它添加一个自动打怪使用技能,2021,哒哒哒。
那么我们把前面啊这里的代码复制一下,把它移到这个test的测试代码的前面,那么这里还还需要一个消息的类型,那么我们这里需要定义一个红,那么这里呢是使用技能的,那么这里我们应该是一个自动打怪的。
啊啊打打怪啊,使用我们的建筑,那么转到消息处理这里开始,那么转到消息处理这里呢,我们也是啊先取出我们的这个技能名,那么在这里呢我们也可以用一个指针先进一点,那么这个指针就指向我们传进来的参数。
二那么然后呢我们在里边呢再调用调用法相应的功能就行啊,那么这样呢理论上我们就能够呃自动的打快了啊,并且还会传一个相应的这个参数技能技能的名字,那么我们在这个函数里面呢再进行一些呃修改。
那么攻击我们看一下,如果这个技能它不存在的话,那么放置这个技能动作如果也有失败的时候,那么如果放置这个技能动作失败了之后呢,我们就调用普攻啊,普通的攻击啊,做一些处理,那么在这里呢它有一个返回值。
我们先把它取出来,那么这里的返回值呢嗯它是一个布尔值哈,真和假,那么我们在这里面定义一个相应的一个变量,这,那么在这里呢我们进行以下判断啊,那么如果他呃返回的值已经就是说调用这个放置的函数成功之后呢。
那么我们再进行后面的这个代码,应该执行,或者说它这个返回值等于啊失败了之后啊,fs让我们进行一个啊相应的一个处理,那么调用失败之后呢,我们就可以调用相应的嗯不带参数的这个扣法,让它自动的使用普通攻击。
好的,那么我们再重新申请一下,cr初始化操作有case标签跳过,那么我们就把这个变量呢我们定义到前面去,这个加上一个括号,再重新编译一下,听说八八,那么我们在定义变量的时候呢,要提到这个前变了啊。
不然的话在这个case里面的话,它定义变量呢它会出现一些错误,好的,那么我们再执行一下,啊挂件我们的主线程,我们看一下调试信息,那么我们使用的技能疾风灭火。
那么这个时候呢我们可能出现的问题还是没有选中这个怪物嗯,但是我们对了,我们还有这里呢没有添加相应的测试代码,使用技能,然后呢我们需要在这样的窗口这里呢更改我们的代码才可以,那么前面的只是使用技能。
不是自动打怪的,那么自动打怪使用技能,这里才需要加一句,然后呢重新编辑一下,这样才能够自动选白板块,好然后我们再注入到游戏中去,逛街出现场,我们看一下调试信息,我们使用的这个疾风裂火。
但是选b的这种动作栏没有,那我们进去看一下,新的类似情况哦,这里我们的消息类型传错了,哦对我们应该传这个消息进去了,他这里呢才会转到我们相应的标签去执行好,那么我们再重新测试一下,挂机曲线层。
然后自动打开,那么这个时候呢他就只要我们在这里点击的时候,点击这个按钮的时候呢,它就会自动的选怪打怪使用技能啊,好的,那么我们换一个技能来试一下,那么换一个这上面不存在的啊,我们看一下。
比如说就是这个劣势列阵啊,我们来试一下,那么还有这个呢劣势图呢我们没有学过啊,等会儿我们测试一下,看着用它的话会出现什么情况,那么先编译一下,跨界主线请,这个时候我们发现了我们放第一次的时候呢。
它同样好放不上去啊,再把它拖出,那么按第二次的时候才会来去打这个怪物,我们再看一下,因为我们写的代码呢,它本身有点问题,那我们还需要进行一些修改,那么我们在这里呢它有一个啊放置的这样一个动作嗯。
那么它它使用的应该是不对的,那么我们应该调用的是另外一个动作来放置,那么我们把这行代码把它删掉,还是,自动打怪啊,那么我们只需要自动打怪,这里呢我们只能够使用技能,那么放置我们的这个技能。
它需要另外啊加一个动作,那么放置动作的这个呢,我们将在这个地方我们实现了,那么我们这里需要把它另外封装成一个或者是同一个函数吗,哈哈哈哈,那么先这样先做一个测试。
就先直接调用这个m s去开头的调用下放置这个函数,然后呢再调用这个类似内置啊,那么我们再来执行一下,啊,然后进入到游戏里面,化解主线程啊,现在这个快捷栏上面没有放这个密室利刃这个技能。
但是我们这个时候呢我们只需要按一下它就可以了,不需要第二次进行一个操作,因为我们还是需要把相应的这个动作呢需要把它独立出来,那么如果要封装成一个函数的话,在这里边呢我们可以另外的进行一个封装。
比如说在这个单元,我们在他发送消息之前呢,先调用message s,调用调用一下这个放置技能的这个函数,那么我们重新这边这样是可以,我挂一下主线程,把技能移掉,看一下调试信息,再重新编一下。
好像是没有收到相应的消息,我们看是什么地方出错了,他应该是先转到这里来执行,然后呢放置我们的消息在这,二,来,那么在这里我们先打印出一个调试信息,100,那么我们再看一下下面这段消息有没有被执行。
这里呢是使用技能,我,们看一下调试信息,在这里呢,他没有接收到消息的,那么可能是我们刚才忘了调用,啊这个地方呢我们忘了调用,他应该是调用了劣势灭刃,应该是p t调用,这,那么这样的话我们也需要啊。
也需要两次啊,第一次的时候我们这里呢他也会打怪,那这个现在也可以了,跑到这里了,但是他们可能是选中这个怪物的问题的,那么我们再另外选一个怪物,那么看一下调试信息,乐视披肩。
哦因为这里呢我们没有这个相应的啊啊这个内功十了,所以说呢这里他不行,然后我们再来试一下,那这个时候就可以了啊,刚才是未公不足,好的,那么我们在知道这个测试呢,这个时候是ok了哈成功。
但是这里呢还有一个小小的问题啊,就是什么呢,那么有时候呢我们呃这个技能呢,比如说这个技能灭世屠龙,他可以修炼,但是我们没有修炼啊,但没有修炼,所以说我们不能够使用它。
那么这个时候呢我们也需要给出一些相应的调试信息,但是我们现在代码里面好像是没有处理的,因为这个技能的话他能够骗得到,但是放置到这里的时候呢,它会失败,所以说他会失败的话。
但是他还是会返回一个相应的一个下表,我们来看一下它执行的一个流程,那么我们先把这里大小写的清空。
瓦解祖现场,那么这个时候呢他就不能够进行攻击,但是这个时候呢它却显示了哈使用这个技能灭世屠龙啊,那但是呢实际上呢它没有使用它啊,因为它这个技能呢呃没有放,直到我们相应的这个技能栏上,他没有找到啊。
没有找到,但是呢这个时候呢他又在这里面存在,所以说我们在放置技能的时候呢,我们最好修改一下它的一个判断,要判断一下这个函数它是否已经修炼了啊,如果是没有修炼,它可以修炼的话。
我们要加上一个自动修炼的一个公的一个代码,那么这就是我们下一节课的这个内容,好的。
P28:039-修改技能对象属性,分析修练功能 - 教到你会 - BV1DS4y1n7qF
大家好,我是欲金星老师,那么在前面我们分析了技能的使用的,功能,但是相应的功能,它还有一些可以改进的地方,比如说我们的某一些技能,比如说劣势陀螺技能,那么我们在使用技能的时候。
首先它就不能够放置在我们的技能栏上,因为它没有修炼,但是它可以学习的条件已经达到了,那么这个时候的话,如果我们判断它条件达到了可以学习的话,那么我们又调用了技能的话,我们可以来自己的分析一下修炼的课。
让它自动的修炼相关的技能,可以,那么这几个我们就分析一下修炼技能的课,因为修炼的技能是否修炼,它这个数据的话,它会发向我们的服务器,所以说我们可以从封包这里来回溯,那么发包的函数它有这几个。
那么一般的发包的函数有这4个,今天我们这个游戏它用的发包的函数是用的第1个,所以说我们给它加一个BPWSS的段点,来摘取它的封包,通过封包我们来回溯,找到它修炼技能的这个地方,好的。
那么我们打开我们的OD。
附加到我们的游戏里面。
那么附加之后,我们下一个PP信得的一个段点,按下回溯键,切换到游戏,那么我们这里点击修炼,那么这个时候它会断下来,断下来之后我们把段点取消掉,然后按Ctrl+F9执行到返回,或者执行菜单这里都可以。
那么在这里我们可以看到它是调用了我们发包的函数,那么我们再返回一层,一般要返回两到三层才是真正的扩,那么在这里的时候我们可以注视一下,修炼技能1,那么只是说这个扩然它可能是修炼技能的。
那么我们在这里下个段,然后再执行到返回,在这个地方也有一个扩,那么我们也下一个段点F2,然后再执行一次,执行到返回,在这个地方我们再下一次段,F2,然后再执行到返回,在这里下个段,随便标一个数字F2。
好,然后我们再按运行让它跑起来,这个时候我们发现这个地方它会一直断下,但我们点修炼技能的话只点了一次,它不应该是在一个循环的执行,所以说这个的话我们就排除掉它的可能性的话就极小。
那么另外三个可能性要大一些,好,那么这个时候我们需要反复的测试,但是我们这里已经没有相应的技能给我们做测试了,这个时候当我们没有修炼技能的时候,我们点它的时候,这个地方它也断下了。
所以说这个地方的可能性它要小一些,要小一些,但是我们这几个课我们一个一个的来分析来执行,首先我们用OT附加到游戏,用C1,在前面我们的分析当中,我们有一项EF6这个地方有两个字。
用来表示某项技能已经学习,那么我们通过修改这个属性来看一下是否会出现修炼的按钮。
那么它有两个偏移,一个是410加后面的一个数字的下标,是4,另外一个是EF6,所以说这里要添加两个偏移,这里是410的话,我们是那一本书,那么第一个技能的话应该是414,后面EF6,这里是两字节。
我们跟他写个技能E,那么这里我们把它改动一下,改为0,再回到游戏,我们这个时候我们看一下,它这里修炼的按钮又会出现,那么我们再点击它,让它断下来,我们分析一下它的参数。
那么这个时候我们看到只有一个参数是可变的,就是EAX这个参数,那么现在它的参数是0D,那么把它记录一下,另外还有一个ECX的值,一般它会做一个参数,它来源于前面的ESI+4,那么这是ECX的值。
我们把它记录一下,让它跑起来,那么这里我们来看一下这几个参数,这是第一个参数,18A,18A4CC,那么第二个参数是1870,1870,那么这个参数是319F,319F,好的,让它跑起来。
那么这里还有一个参数,这个参数就只有一个,EAX,那么这个EAX我们可以看到,它的来源的话,也就是上面的最后压占了一个参数,最后压占了一个参数,然后再做一个地址,进行一个压占,最后都到我们的发包了。
这里可能是一个数据发包,数据的一个版权区,因为我们EAX是它的首地址,它最大地址,这里有个13E,说明比13E还要大一点,大一些,好,那么我们再让它跑起来,然后为了我们方便区分参数,我们再把后面。
把这个数字先改成,然后我们414代表的是,技能1,那么418也就是410+4=2,那么它的下表是2,也就是我们的第二个技能,技能2,这个数字,那么我们也把它改为1,那么这里我们可以把它复制一下。
那么前面一个我们改为技能1,这里偏移,我们改成414,就是技能1,再复制一下,技能3,技能3的话,我们还需要在前面的下表的基础上,+4,就成了41416性机能,我们就把它改一下,方便我们的一个测试。
那么我们先测试第一个库,后面两个禁止掉,那么再点一下修炼,那么再点修炼之后,我们看一下EX的值变成了01,一个是13,一个是14,好,我们再测试一下下面一个,这个时候EX的值刚才没有变,0第8。
但是他服务器他一下服务器发送数据了,服务器发送数据回来,就把这些所有的都更新了,就更新了一次,好,再点击一下,那么这个时候我们EX的值,来点1,F15,那么它是一个序列,是挨着的,那么可能是一个下标的。
这个可能是一个数据的下标,也可能是我们的技能的一个编号,在服务器上的一个ID也有可能,但是这个参数我们看这个库的话,它还是比较简单的,一个就是ECX,然后也是从ECX里面取出来的。
那么我们尝试主要写一下这个库,先进行一下测试,PUSH 0,PUSH我们的EX,那么EX我们就是从0D这样开始的,它来源于是ESI,24C这个地方,那么我们直接,PUSH D,PUSH 13,试一下。
PUSH 0X3F4,然后再扩EDX,但是EDX我们说的库里面一个来源,来源就是前面的ECX,那么我们看一下ECX的数值,把它复制进来,复制一下,那么复制进来了之后,它要先把它取出来,取到EDX。
墨译ECX,长寇EDX,加上4,它是这样的调用的,那么这样它就能够学习技能1了,那么我们把技能1改一下,看有没有效果,然后我们调用一下,输入到我们的游戏里面,再看一下。
这个时候它就已经学习了相应的一个技能,但是最好我们再换一个号再测试一下,是最好的,那么如果是进了2,我们也可以调一下01,这样的,输入一下,它这里也能够学习,那么这个扩,但是它有点麻烦。
就是要找ECX的一个来源,不知道它怎么与我们的相应的扩,怎么关联起来,有相应的技能,哪一个是接红灭火,哪一个是接红断目,哪一个是接红场景,这样的它不能够关联起来,它们之间应该是有一个关联的一个联系的。
那么接下来另外还有两个扩,我们按Water B来打开这个系列,这里还有一个。
我们可以通过分析这个扩来区分一下,看两个扩之间哪一个扩更简单一些,这三个,断下的地方我们都可以分析,都可以分析,那么今天我们这一期先到这里,那么大家下去之后。
把这个扩的一个参数来当成是一个座列来分析一下,好的,那么我们下期再见,这几个比较简单。
P29:040-分析技能修练功能CALL(二) - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么在上节课呢我们分析了修炼技能的这个功能啊,分析了前面的这个扣,那么后面还有两个课呢,我们没有分析啊,因为在前面的这个库呢,我们分析的情况呢,它并不是很理想啊,并不是很明显。
因为它的这个序号的话,用我们的这个技能呢,它相关的技能之间的话,它的关联性不是很强,我们不知道要修炼哪一个技能,当然也有手动的关联方法,那样的话比较麻烦,所以说我们再分析一下后面的这两个技能。
看这两个可能不能够实现相同的功能,并且它的参数的话能不能够再简单一些,好的。
那么我们打开我们的ot哈,继续跳到我们的修炼技能二的这个位置来来进行一下分析,那么在这个位置下段啊,那么我们先把其他的断点呢先禁用掉啊,把技能删的这个先进进调。
然后我们也打开我们的工具,嗯把技能机修改一下。
然后我们在这里呢点击一下修炼,那么我们看一下它的一个参数,那么它的参数了1a x,首先呢我们找它的来源是来源于这里有一个机子啊,它这个应该是一个固定值,我们看一下嗯,31b9 f。
那么我们换一个技能试一下,看它还是不是这个数值,那你技能二我们试一下,那么我们发现了这个数字呢,还是31b9 f,那么证明的话它是应该是一个常量啊,这个,而且它的来源呢就来源于这个机子里面。
那么我们直接把它读出来,就能够调用,把括号去掉,直接就来源于这个地方。
那么我们在这里写上,这是我们ex的来源,那么1d x呢它来源于一次x加c啊,这个要复杂一些,那么最后呢这里呢还有一个呃缓冲区啊,这里取了一个地址英文,那么这个参数呢要较复杂一点啊。
那么我们再来看一下e d x呢,现在他是18706,7005706,那么这两个数字呢它也是a组的,一个是七,一个是706,那么后面一个的话可能就是707啊,那么这个编号的话它数值比较大。
看起来更像是一个我们服务器的i d,而前面的我们那个0d0 f呢看起来只是像一个数组的一个下标,那么我们再把它更改一下技能三改一,那我们再修炼一下现在传进来的数字,我们看一下堆栈还是31b9 f啊。
这个是18707啊,跟我们猜想的是一样,这可能是一个服务器的id,因为呢这个呢也就是我们的堆栈的一个机子一个缓冲期,然后传进去啊,缓冲区传进去,然后我们再继续来看一下,这次我们来看的时候呢。
我们看一下主要是这个187018706嗯,它它的一个来源啊,它的一个来源,那么在这个地方呢下一个段子再修改一下,我们以技能二为例修炼。
那么我们看一下这个ec x。
那么ex呢等于ec ec ec好像是技能对象的一个编号,我看一下1b1 c是技能对象的分类。
那么技能对象的话,大家我设计的有一个名字,那么我们来看一下它的名字是多少,那么就是一个疾风断木啊,那么这里呢我们就能够找到它的对象呢,能够与我们的对象关联起来了。
好那么这个参数呢就是我们的对象加5c这个点啊,加上4c这个地方好的,那么我们让它跑起来,那么在这里呢我们对象属性里面再给他加一下4c,这个是我们暂时把它命名为服务器的it。
啊这个就是服务器的i p的这个名字,谢谢,那么我们把它记录一下,那么现在的话我们知道他说这个是服务器的i t的名字的话,我们就可以建立这个数组,然后把这个id取出来啊,做这第二个参数。
这个参数呢我们就可以这样来取,那么我们偏离到相应的这个技能对象之后呢,我们就用我们的技能对象加5c来取得这种,那么这个数字呢就等于我们的角度,像,加上4c这个偏移来来取得。
那么这前面的这个是一个常量来源于这个机子,那么最后呢就是这个呃这个所谓的缓冲区啊,那么这个缓冲区我们看一下它的数据复不复杂啊,然后我们再次修改一下,嗯然后断到这里,那我们看一下ex这个缓冲性主体e x。
那么我们看这里面的话,它是大片等于零啊,那么也就是说这个缓冲区它足够大就行了啊,足够大就行了,但是具体有多大呢,我们可以根据这个扩去看一下它有用到的最大的偏移是多少,在这个地方我们按下回车键。
那么跟进来之后呢,我们看到嗯,这个时候呢我们的一sp呢加四人是参数,然后铺起一个e p p之后呢,那么它这个就是这里就变成了我们的usp了,加八啊,就是我们的参数一,也就是缓冲区。
那么而这里e s p呢又转到了我们的bp啊,bp等于一比jsp了,所以说在这个位置的话,我们就是e p p加八啊,实际上就等于我们上面传进来的第一个参数,那么我们可以在上面啊返回到上上一层。
那么在这里我们按f7 往里面跟一下,那么我们看到现在的第一个参数相对于e s p的话,就是这个位置啊,那么我们当执行了一个谱写一bp之后,它就变成了一sp加八。
而这个时候呢e b p又来相对于我们的e s p啊,覆盖了e b p,所以说在这后面的话,e b p加八它就取出来了,取出来这个地址啊,那么取出来这个地址之后,我们看后面就是对它偏移的一些操作。
那么从0206最大的是131啊,那么这个数值可能还要大于它啊,那么这里有个142啊,我们最后呢进行了一个发包,然后我们就跟到这里边来了,这里面就是一个圣等一个数据的一个发包,那么我们可以猜想的话。
很有可能的话他最大的偏移就是142,那么我们这里跟他写大一点,写成150,我们来试一下,做了测试一下,那么再按减号退回来,首先我们用我们把前面几句啊复制一下。
那么实际上我们还能够在这个地方来看到一个数组,ec x来来源于这个数字啊,我们在这里下一个段看一下,那么这个数组是一个什么样的数组,然后再测试一下,但是我们看一下这个时候呢它直接执行到这里了。
这个地方呢没有被执行,说明是从其他地方跳过来的,那么我们先分析一下,看还有什么跳转跳转到我们在后面的位置来,那么分析完了之后,我们可以看到在这个地方它有一个有一个大于符号,那么是从前面跳转过来的。
这里有个跳转来字啊,我们转到这个地方去,那么我们发现了这里有一个数组1d i乘以10,i乘以十,我们在这里下个段再让它跑起来看一下,那么看这个数组与我们有什么关系,在修炼。
那么我们看一下现在数组的下标一si等于多少呢,等于零一,恰好是上一层这个扣它传进来的一个参数,那么我们这里呃也就是我们,这个修炼技能三这里有个0d0 g0 f,那么实际上它这个时候我们分析之后才知道。
他传进来的实际上是一个下标啊,这个下标,然后这个下标我们看它取出的对象又是什么,啊是一个对象类型的话,我们看一下,假设这个地方是1c是技能啊,那么它加5c这个地方呢就是技能的名字。
那么就是我们后面的这个啊起风断路啊,那么实际上我们这个e d i来自于多少呢,我们看一下e d i呢在这里是31a90 c,那么这个31a90 c的话,我们很熟悉,它,实际上就是我们的技能列表。
只是这个技能列表呢它的开始位置呢是310,而我们这个开始的位置呢是410,二零是410,说明的话我们也可以把这个记一下,这个呢也是一个技能列表,那么这个技能列表呢可能还是一个更大的一个技能列表,那。
么我们把它记录一下,那么再往后执行,那么就能够看到啊,这里呢就是从数组里面取出来的这个e4 x,那么实际上这两个技能列表之间有什么关系,我们把它复制到后面呢,再看一下。
那么因为游戏呢这前面还有个升天武功啊,可能它里面有一些东西啊,所以说呢这三个可能这个升天武功攻击武功不做武功的,他可能来全部都把它放在这个列表里边了啊,放放在这个310开始的。
那么你看一下这个310和我们的410的话,他恰好相差了多少,算一下41031g过了,再加的话就是3f,但是它这里呢它加的下标的值呢要加的多一些,实际上肯定是指向的同一个地址,那么我们可以做一个测试。
那么来这个地方啊,我们看一下它的地址,树主要是看了,那么这个地方呢我们是a70 啊,a70 这个地方是什么,我们看一下,是我们的疾风断木,那么如果是疾风断木啊,这个啊这个呢它它的下标应该是d一啊。
如果是用3g里面来开始的话,就是310+4神明,第一我们看一下,实际上这两个地址呢它是指向的同一个地址,那么只是它所用的下标呢不一样啊,不一样,所以说我们在调用这个技能课的时候呢。
可以骗离我们前面的这个技能列表就可以了,那么有两个技能列表整理一下,这个也是一个技能列表,只是它的下标呢不一样,好,我们保存一下,那么这个时候我们就可以开始写相应的这个功能啊,这里代码不知道。
代码输入器,然后这一句呢已经全部啊复制出来啊,这句辐射出来,那么这个ecx呢我们还需要给他找一个来源,那么前面不是有一个数据,就是e d i,那么先把我们数组和机子找出来,31k904 。
那我找出来之后,我们再用e d e c x,那么等于我们的e t i加上ec嗯,加上我们的e s i s e,它的一个下标相当于,那么我们这里是从4100开始的,那么我们选414啊。
这样呢就是我们的第一个技能表示学习啊,取出它的一个对象,那么第一个技能后面的话我们这里呢是一个复习1a x,我写1d x照着写就行了,然后呢一个类1a x,当然这一句呢就比较复杂一点。
这个时候我们写为e bp就行了啊,切回e s p,但是呢我们之前呢我们要跟他分配相应的一个空间,这个e s p,那我们就沙包e s p,刚才我们看到我们说分配150个字节,应该是个。
然后呢在这里呢我们复习ex,那么这里呢我们就不用这个累了,累的话,我们后面呢需要地址的话,我们要需要加括号,那么这句话我们就可以直接,ex 01 p就可以了,当然刚才这两句是以等价的。
与我们这一句的指定是等价的,随便的成绩就可以,nee x e x p好push ex,然后呢我们再或,这个地方,那么用完了之后,我们还要什么a d d e s p要怎么恢复相应的一个堆栈嗯。
但是我们需要还是需要来测试一下,这样写看是否正确,那么414来代表的是我们的实际上是嗯410,那么这里呢加上我们的4x1啊,是这样来的,但是我们这样的语法的话,它并不支持啊,这样。
所以说我们需要直接用一个常量,那么我们把这个技能改一下,卡为零,好那么我们就测试一下,这个时候呢他说了这个审法院他在里面呢,他直接这样写,他肯定是不支持,所以说我们这里需要写成常量414啊。
这个时候呢就ok了,那么这样的话我们就能够通过对象就能够把它关联起来了,那么这个扩展才是我们理想的啊这个库啊,所以说上面上一节课找的那个课了,虽然说也能够实现相同的功能。
但是我们需要的代码量的话就比较大了,我们需要去把这个相应的这个id呢一个一个的把它关联起来,因为它与技能零之间的没有关系,而我们找到的现在这个库的话,它与我们的技能对象有关系。
那么我们偏离这个列表之后呢,我们就可以直接调用这个孔,所以说这个扣才是我们理想的啊,修炼我们技能的这个库,那么上那么上一层我们上一节课找的那个课呢,应该是点击我们修炼按钮的那个那个库。
而这个呢才是真正的修炼技能的库,所以说我们把它区分开来,当然他们都能够实现同样的功能。
那么具体用哪一个呢,再看你自己的一个选择,这个才是我们的啊,修炼某个技能对象,就是,如果我们上一节课,这个呢应该是什么,点击啊,修炼啊,这个技能的按钮,或者只是一个点击的一个动作啊,点击了它的一个对象。
当然两个都能够实现同样的一个功能,好的,那么这节课呢我们的分析都照到这里,那么下一节课呢,我们将对这个修炼技能的这个功能呢进行一个呃代码的一个分。
P3:014-封装物品使用函数 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,qq 15033059,欢迎大家参加预期项技术编程培训,那么今天我们这这节课呢,主要对啊这个背包物品使用的这个函数来进行功能的一个封装,那么封装好了之后呢。
我们可以直接传入一个呃药品的名字,就可以使用背包里面啊相应的一个物品,那么首先呢我们打开第12课的代码。
那么打开之后呢,首先我们还是添加我们的相关的机制,首先呢我们是这个啊背包物品使用课的啊,这个机子给它添加进去啊,啊使用物品,这,个是它的参数呢是一个下标,应该是使用背包,四格的物品。
那么第二个机子呢就是我们的呃背包的这个机子,之前呢我们已经有过了,有过定义了,那么接下来就是这个啊函数的一个封装啊,那么这个函数呢嗯可能是通过背包的一个下调来使用这个物品。
那么我们先把这个函数来封装一下,那么这个函数封装的位置呢,我们可以把它写在我们的结构里面,也就是背包啊相关的一个结构,我们可以写在这,那么这里我们添加了这个成员函数的说明之后呢。
然后我们再切换到我们的这个cpp代码单元啊,添加相关的按钮,那么我们这个时候在使用这个课的时候呢,我们也考虑到一个异常的一些处理,比如说这个相应的呃扣的这个地址又改变了之后。
所以说在这里呢我们先用一个tra处理处理相应的一个立场,哈哈哈,然后呢这也是,汇编代码块啊,好我们刚才复制的这个呃测试通过的这个代码,把它复制技能,然后还要做一定的修改。
那么第一个呢就是我们传进来的这个下标下标,那我先把它放到ex好,这里呢就是我们的这个机子背包的妻子背叛妻子,那么这个呢我们扣的时候呢,在我们编写代码的时候呢,不能够直接啊跳转到这个地址。
那么我们也是先把它放在t7 t e x c p,ex,那么如果出现异常的话,我们在这里啊,用我们的调试字串奥体附体,第八个尺寸的调试信息,我们说这个函数呢这里来出现了异常,好那我们先编译一下。
然后如果我们使用成功了,执行到了最后,那么我们在那里打红一个盘数值,这个我认为数值的可能,啊发光器啊,这里的防护器,当然我们要封装的这个课呢,这样使用的话,我们不是很方便。
因为我们不知道某一格它究竟是一个什么物品,所以说我们在这里呢还要另外封装一个扣,那么我们存在一下啊这个函数,那么另外呢我们要根据一个物品的名字来使用它,把物品的名字来使用,那么物品名字来使用的话。
在游戏里面呢没有直接的这样一个扣,那么这个需要我们自己来写,那么如果要写这样一个课的话,我们先要根据这个名字去搜索整个我们的背包数组啊,要搜索我们的一个背包,那么搜索到他某一格啊,如果在背包里面存在。
那么返回到这个下标,再调用前面的这个空来实现,那么所以说我们在写这个函数之前呢,我们最好呢呃另外再封装一个函数,用来查询这个物品存不存在,如果这个物品在背包里面的第n格存在呢,那么我们就返回这个下标啊。
对啊,好我们根据名字来去查询它的一个下标,在背包里面,把这个复制一下,然后,添加到这里,添加结构的前缀哈周音域的一个限制,咳咳咳咳咳,对,那么在写这个课的时候呢,我们的思路就是先骗你整个背光。
对方看你是否指定名字的物品是否存在这种存在,那么现在我们初始化,初始化结构,这样呢我们看才能够获取背包里面的数据,能够填充进来啊,前面的那么填充进来之后呢,我们用一个for循环来查询一下。
背包的大小加6/14到,然后我们查询的时候呢,我们就比较它的名字是否相等,有没有与我们传进来的这个物品的名字相等的,如果有相比的,那么我们就返回这个下标,它的下标i啊,那么我们可以用一个判断。
字符串的一个判断,三是内和我们这个背包里边的这个相关的这个数组进行一个判断,背包列表啊,然后呢对它的名字进行一个比较啊,比较,那么如果相等的话,它会返回零啊,那么如果相等呢,我们就返回它的一个下标i。
但如果执行整个循环,执行完了之后,我都没有查询到这个物品的话,那么我们跟他缓缓一趟,复一不一,因为这个下标呢它是从零开始的啊,所以说我们不能用普通的布尔值真或假来表示,所以说再来一张,我们只能访问-1。
那么如果不是-1的话,它从0~35就是我们的一个下标啊,这样就可以了嗯,啊,在骗你整个背包去查询这个物品的名字,然后呢这个列表,背包列表里面的这个名字,来与我们传进来的这个参数的名字来进行比较。
那么相等之后呢,我们把它的下标,那么有了这个下标之后的话,我们接下来我们工作这个函数的就是通过物品的名字啊,来使用这个背包里的物品,我们就呃很容易写,我出息,然后使用背包里看指定物品,通过这个物品一次。
差那么使用成功呢,最后呢我们这个我们可以用个电子来表示这个我们啊,我们在增值这个参数我们可以改一下,天气,那么首先呢我们要查询这个名字呢,就要调用一下前面的这个函数来查询一下指定的物品。
它在背包里边的啊,这个下标,咳咳咳,那么首先呢我们要进行判断,如果这个下载的话,它是等于的啊,-1,也就是说它不存在,那么直接呢我们就使用物品不成功啊,返回一个啊,这个假肢啊,也就是零啊。
返回名子啊就行,那么如果执行到了后面呢,就证明了这个嗯它不是为-1,是0~30之间的一个数值,那么我们就直接调用前面的这一个扣就行了,我们前面封装的这个空,直接这里来引一个下标的一个值来调用就行。
调用指定的物品的使用空,那么这里呢直接传递它的这个下标值进去,哈哈啊,这样的话逻辑的话就比较清晰啊,比较清晰,那么接下来呢我们呃测试一下我们所写的这个扣,慢慢到我们的测试单元。
那么前面呢他已经这里定义了这样一个结构,那么直接我们使用就行了啊,那个是故事不累,我们看一下啊,应该是一个,这里应该是分类,这里要改一下,使用物品i那会上面啊这样吗,这样我们代码的可读性要高一些。
通过物品的名字来使用它,那么这里呢我们写清创,要写,那么这里呢它有一个返回值,我们看一下它的返回值究竟有没有实验成功了,咳,好那我们看一下输入到哪一个窗口里面去了,注入到最后这个窗口里变量。
然后我们打开我们的嗯调试信息查看的一个工具,首先我们看一下啊,金创药小是62啊,它们数量测试一下61,那么我们成功的使用了这个金仓量,那么如果我们把它的这个移动一下,一到其他的格子啊。
我们也能够这个时候呢也能够使用到,但这个时候呢我们游戏呢嗯它有可能会崩溃啊,这是因为呢我们这个县城呢,因为我们的游戏限制呢,它所在的哈,就是说他访问这个相相关的数据的时候时候呢有一个冲突啊。
嗯因为它不是属于一个呃同一个线程的多线程,它的多线程操作同一块这个数据的时候呢,你可能会产生一些冲突和错误啊,那么这个问题呢我们在下一节课啊解决好。
那么这节课呢我们就到这里。
那么下一节课呢我们在这个函数本身它是没有问题的,应该只是说说我们的这个线从来没有挂机在游戏的主线程上边,那么下一节课呢我们修改我们的代码,那么我们可以呃解决的方法很简单。
我们通过呃这个贺卡的方式来注入我们的这个动态链接库就可以了。
P30:041-封装修练技能功能 - 教到你会 - BV1DS4y1n7qF
大家好,我是俞星相老师,那么上一节课我们分析了修炼技能的功能课。
那么这节课我们对它进行一个封装,那么封装我们上一节课也写了一个相关的代码,那么在这里实际上你就是传入了它的一个下标,相当于是410+4,是1I,当时的代码输入器它不支持这种写法,没有这样写。
那么实际上它是这样的,那么下标在这里,那么所以说我们先封装一个下标,用下标来传递参数的code,那么打开第38课的代码,那么先展开我们的机子单元。
添加相关的机子,那么第一个312A90C实际上就是我们的,技能密表机子,我们已经添加过,那么我们需要添加一下,还有一个也就是我们的技能库,修炼技能库,那么我们把它放置在技能密表的后边,修炼技能。
那么第二个是它的一个参数技能库,那么这个EX作为它第一个亚占的一个参数,那么我们把它写上,这里已经加了Nexus的权权,那么这两个添加好了之后,我们看还有没有其他的机子,那么在后边还有个3173C。
那么3173C实际上我们已经添加过了,在这个地方就是角色对象自己,所以说这里我们需要继续添加,好的,那么我们接下来转到结构单元,那么因为对象它需要骗你,我们的技能列表,所以说我们把它封装在技能列表里。
这个应该是一个无符号前行的下边,然后我们复制一下这段代码,到代码的尾部,然后我们再复制一下这个代码的尾部,然后我们再复制一下这个代码,那么我们先做异常的一个处理,那么如果出现异常,我们就打印条是信息。
好,那么我们再进行把上面这段我们测试,成功的代码进行一下复制,那么这里我们要加上我们的汇编代码,要注意一点,这里是代码输入器里面的,它默认是16进制的,这里不是,所以说这里我们需要修改一下,央伍文件。
那么还有这个地方,我们先把它需要放到这个计程器里,比如说ex,开始,然后我们再call,ex就可以了,那么在前面这个地方我们需要来替换成,我们的角色,机制角色对象,那么这个地方我们也给它加了一个。
相应的第一个参数,Bicycle,第一个要在哪一个参数,ex,那么edx还有一个edx来源于ex,那么这个ex我们先要取出对象,那么这里是0x410,那么这前面我们需要给它加上一个相应的前缀,dwy。
那么我们把后面的前缀来复制一下,然后里面我们就是技能列表的基地值,Bicycle,那么我们先编译一下,这里它也要求是一个常量表达器,是什么传进来的下标,那么下标的话它是一个变量。
那么我们需要先放在这个继承器里面才可以,编译是通过的,那么我们先使用一下这样写可不可以,等会我们测试就知道了,那么我们再展开我们的主线程单元测试这里,那么它的下标我们选二表示第二个技能,训练这个技能。
那么我们设置一下,启动一下,打开它的属性设置一下,那么这里我们设置一个,还有一个地方我们需要添加测试代码,在这里,把前面的输出掉,打开我们的调试信息查看器。
然后输入挂接主线。
然后我们测试,这个时候我们发现使用了技能,它打印出来一段调试信息,但是没有成功,我们再来看一下我们的代码,它打印的是这一段信息,说明是出现了异常,出现了异常,这里它没有加异常,那么在异常的话。
极有可能是出现在这个地方,当时我们说了要把它放在一个继承器里面,才可以这样行,那么我们先把偏移跟它加上,addex410,先在前面的把偏移跟它加上,后面我们直接就加上ex就可以了,然后我们再来编译一下。
我们再次放到ediex,那么再注入一下,挂接主线,然后使用,那么这个时候还是报异常,我们看一下在什么地方出现异常,再对比一下我们的代码,90c312a90c,那么取出来,加上410,还有一个4*i。
下标,这个下标我们需要做一个审讨,它需要先审议4,那么再去了,我们应该这样子,输入ex华号,ex14,加上410,再编译一下,这个时候它还是报异常,那么我们先把前面这一段我们就不用,会编写。
因为这种写法的话容易令它出错,那么我们可以先把机子提取出来,那么读出来之后,我们再加上一下410,那么这是它的相当于机地址,那么在后面,我们再把它取出来,那么我们加上它的一个下标,那么这样转换之后。
前面这里,我们就不需要,直接这样转换,然后取它的一个下标处置,然后取出来之后,我们直接写到ex,直接写到ex就可以了,那么再编译一下,这个时候消息传过去了,修炼成功,OK,那么可能这一句来。
大家看起来可能比较复杂,那么也可以把它写简单一点,这一句,那么写简单一点的话,我们可以另外定义一个,那么这里我们就需要再强制的把它转换一段,然后就相当于把它转换一段,转换一段之后。
这里我们就可以直接这样写,这前面这一段就不要了,就直接是一个下标访问的方式,这样写的话可能容易理解一些,这里应该是真,这里插一个冒号。
好。
那么我们再做一次测试,OK,那么这个名字我们带下标的修炼技能,我们测试好了之后,接下来我们就把它这个函数来进行一下重载,另外定义一个函数来,以它的名字做一个参数,然后再移到它的5度。
那么这里我们需要一个1%,表示失败了,那么后面我们再重载函数,那么最后我们先需要获取下标的这个值,那么我们需要片名,这是数据的大小,当然为了方便管理了,我们可以把这个大小可以把它在极此片名这个单元。
在这个结构单元里面把它定义成一个红,那么这里直接使用这个红就行,包括前面我们用到的相关的这个数据大小,这里我们都用红的形式,以后我们就需要修改一个地方,当然这些片名的话。
如果有时间的都可以自己把它定义在极此片名单元,把它定义成红的形式,好,那么我们再转到最后进行片名的时候,我们就需要做一个比较,那么这个给我们相应的下标,然后还取出它的名字,然后我们做比较。
如果是相等的话,它返回只能是0,那么就看它是否等于0,那么等于0的话,我们下标就出来了,在前面我们需要定一个变量,那么成下标,不至于i,然后break,那么找到下标之后,我们直接来后边我们就调用代查。
代下标的参数,得技能修炼,这样就可以了,但是要明白,这个库不是旋回的在调用,这个库而是调用的存在的,前面的库存的是它的下标进去,那么这样就可以了,那么前面这里还需要注意一点,那么这个地方。
它不能够传一个空子进去,不然的话可能会引起异常,那么所以说在这里,我们还需要进行一个判断,判断它的名字是否会空,也就是指定的,是否有对象,那么如果为一个空字串的话,我们就继续下一次的循环。
或者加上一个异常处理,应该都可以,那么这个时候我们主线程单位,这里我们就需要改变,那么这里我们改成,截封列轨,那么截封列轨是第一个,那么我们要修炼它的话,我们改一下第一个设置,再进行一下相应的测试。
对了,我们还没有编辑,需要先编译一下,好的。
挂接主线程,然后我们再修炼,OK了,这个时候,那么我们就通过名字都可以修炼相应的技能,好的,那么这一节课我们就讲到这里,那么我们下一节课,再继续,再见,那么这里也留一个助理给大家。
那么我们不是有一个技能使用的,那么我们自动,Use Cleverly,那么这里面我们自动加上,自动修炼的语句。
那么自己把它加进去就行了,应该很简单,自己加一下,好的,那么我们下一节课再见,謝謝大家。
P31:042-分析修练技能所需条件数据 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么在上一节课,我们一起编写了代码和封装了修炼技能的一个功能,但是呢还有一些地方呢不是很完善,比如说这个技能神龙破甲,那么我们在偏离的时候呢,他也是未学习的。
那么我们就去修炼他的话,显然是错误的嗯,因为修炼他的条件根本就达不到,于是我们必要的力量不够,还有一个就是等级也达不到啊,那么所以说我们必须要对这两个条件进行一个判断,如果不判断。
我们就去调用一个相应的课的话,那么可能呢会向服务器发送的这些信息呢,会被判定为非法的使用外挂啊,这个位置,所以说我们最好是加上这一类的判断,那么要进行这个判断的话,第一个呢我们需要读出我们当前的历练值。
要进行判断,要大于这个20万啊,那么才行,那么第二个呢就是我们当前的这个等级哈,要大于这个第74集才行,所以说我们要获取这些数据,那么今天呢我们就来分析一下啊。
这个历练和这个等级的历练和这个技能的历练需求,还有当前等级一级技能的等级需求吧这些,那么我们先来分析一下当当前的历练和嗯技能需求历练,那么打开我们的c。
那我搜一下我们当前的利润是多少,155833是不是1555833,这个数值呢可能是比较特殊,那么我们一收呢就出来的是一个绿色的呃,机子是f8619 c。
那么这个机子的话我们以前面的第八课里面所分析的哈。
嗯有一些相像,那么我们看一下,那么我们第八课我们分析了一个是2f860 f0 ,那么他们之间的话9c啊,19c减f0 的话等于a c,那么恰好这个机子加上ac的话,就等于我们的历练啊。
那么所以说历练的偏移的话。
就是我们的人物属性的这个偏移加上mc这里面就是我们的历练,后面的b0 ,当时我们还以为这个力量没有用啊,所以说我们当时就没有读出这个属性,实际上当时我们已经分析过了。
那么当前历练我们取得了,接下来我们就看一下我们技能需求应用的一个需求,那么技能的历练呢我们也可以收啊。
比如说就这个20万,但是如果直接这样搜的话,肯定搜出来的数据是非常多的,那么因为它肯定是技能对象的一个属性,那么我们就从技能的基地址开始收,那么这里呢也是2434 12。
这里技能数组的下标呢是11 12 13 14啊,这个技能的下标是14,那么14的话它的呃技能的七地址的话也就是4x14,那么是你空了这个4x14等于我们40 10 66,56等于我们的零二开始三方啊。
那么所以说在这里的话,我们就加上448就行,就能够取得相应的一个对象地址31a9 c,这里呢加上我们的4410+38448,那么这是我们的第14个,技能,机制,啊这是一个相对的一个机制啊。
这是我们对象的机制,那么我们可以从这个对象的地地址呢这里开始收,那么他需要的是20万个领,那么这个时候呢我们从它这个地址开始搜的话,搜搜出来两个数值,那么这两个数值呢我们看第三的话明显离它很最近。
这个离得比较远,但是两个呢我们都可以搜一下啊。
访问看一下访问的数字啊。
这个没有,嗯这个有没有可能要我们要显示一下,它才会反问他,这里出来一个268啊,e si我们看一下这个e si的数字是多少,他一si的数值呢是d3 c0 ,d3 s0 。
看一下我们设法中的这个就是1i的数据c9 d3 c好,那么第一个偏移我们就是268,我们把它复制出来,那么在前面一个呢我们也来访问一下它,看一下它的数值,是不是这个也是268哈,那么我们看一下。
这是它的地址,好像不一样,3238都是一样的,地址而求,那是不是访问错了,再来看一下下面这个,嗯这个很奇怪啊,两个都是e s i e s i2 c9 t3 s0 哦,这个是2c9 。
我们这里2c a9 t3 c,这个有一点不对啊,呃这个是2c9 d3 c0 ,那么在前面这个它应该不是这两个地址不是一样的,那么我们释放一下,看一下e si的数值设置为d c s0 。
那可能是下的这个断点呢,他就是访问前面这个不是访问在后面,这个在后面,这个明显它不是加上268啊,断下来的,那么我们应该就是这个2c9 d3 s0 加上二六方,就是我们的这个偏移的数量。
那么我们也可以加一下,在这里用这个数字,这个数值我们加上一个偏移,加上268的偏移,那么这个偏移的话,它明显是指向我们的d28 的,而不是指向这个c50 的,那么这个c50 的他可能是没有没有访问他。
啊这个是没有访问的测量,刚才只是他先访问了前面这一个啊,所以说在这里的时候他才断下来,所以说这个人应该是没有关系的,因为我们那么我们为了验证一下这个历练是不是正确的呢,我们可以用之前的。
那么之前的这个单元来做一个测试啊,第13单元的这个作为一个测试,那么我们可以这样改,先改一下,把第13的一个技能,4号考用的那个数字改一下。
这里就是ef 62次解,啊对,这是第14的一个技能,第13的一个技能,这里是444,好那么我们再读出它的一个当前的历练,啊历练需求了,那么历练需求的话,刚才我们找的那个a6 方,我们看是不是正确的。
这里是3万多嘛,好的,那16进制的话是8488,嗯那么我们在这里看到的它必要的立面是16万多11 零,这里需要改成实际上的显示好,我们显示的必须是四字检测对啊,显示是四字节,恰好就是16万啊。
这里我们看到的啊,因为之前我们已经学习过了,那么我们这里历练它是达不到的啊,我们可以看到,那么所以说这个经过测试的话,哪个比较的测试的,把这个当前啊历练的需求的偏移的话,就是啊不是六八这个偏移。
那么前面这个力量呢就是我们刚才的第八课的这个a c这个a c,那么这个历练的我们已经解决了,那么还有一个是等级需求的呢,再来搜一下,那么这个的等级需求是74,那么我们就可以来从这个s0 这里搜一下。
其实啊因为它是这个对象的一个属性之一,肯定在这个地址的后边,那么第三开头的呢,我就只有这一个能看到第三个。
那么看看一下他的这个偏移的话,恰好是也是a c啊。
它的等级是a c,那么我们第14个技能我们把它复制一下,等级需求,需要啊需要,那么它的偏移呢是a c f74 ,那么我们再来看一下第13个技能,它的一个等级需求,如果两个都正确的话。
我们就证明它是正确的,那么这里呢第13个呢是444,那么我们这里要显示是十进制的。
那么一个是71,一个是74啊,那么证明它也是正确的,那么当前等级啊,他也出来了,这样我们还要,a c a的偏移啊,反正我们已经找出来了,既然等于稀释了,就是加上0a c,那么当前的等级呢。
当前的等级我们已经在第八课的时候了,这里它就有一个当前的等级,加042034这里。
但是它是一字节对当前的等级,因为我们这个等级的需求不一样,这里是四字形,这里加上我们的三次与自己,好的,那么这几个数值我们现在都已经取到了,那么在下一节课呢,我们在对这相关的数据来进行啊整理啊。
然后封装成一个判断的函数,嗯。
技能对象的啊,能不熟悉,好的,那么这个呢我们当成是一个作业,就大家就自己啊公众一下啊,指定的技能呢是否可学啊,是否呢就是可以学习啊工作的这样的一个函数,那么对这几个偏移来进行一个判断检测就可以了,好的。
那么我们下节课再见,这节课分析数据啊。
P32:043-技能学习条件检测函数IsCanStudy - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么上一期给大家留了一个作例,就是检测某一项技能是否满足了一个修炼的条件,那么这期我们就来一起来完成这个作例,那么可能这样,然后写看是否可以学,那么这4个条件应该说三个条件。
我们相关的数据我们都已经分析出来了,那么接下来我们就把它封装成一个函数,那么打开第41课的代码,这是第43课,那么我们把属性把它当成是一个属性。
添加在我们的技能对象里面,结构单元,我们有一个技能对象,但是技能对象里面的话,它本身是没有属性的,所以我们跟他添加进去的一个属性,那么可以封装成属性,也可以封装成函数,可能是我看封装成函数可能要好一些。
某一项技能是否可学,这是我们自己添加的一个属性,那么我们要添加成属性的话,这里我们需要在列表的相关单元进行一个添加,属性可能不是太好,那么我们还是把它添加在技能列表里面,做一个函数的形式来调用。
那么它要检测某一个技能是否可以调用的话,我们也需要一个相应技能的一个下标,(敲擊中),(敲擊中),然後我們轉到getty的後面,這裡進行一個添加,要檢測某一個技能是否可以修練的話。
我們需要先取出幾個數據,取出我們當前的歷練,當前的等級,那麼還要取出來我們技能歷練需求,另外一個是技能等級需求,那麼還有一個,第一個數字的話,就是我們的當前技能是否已修練,技能未學習,那麼這幾個數據。
我們全部都要給它取出來,那麼我們在這裡來建個變量,用來存放這幾個數據,(敲擊中),(敲擊中),第二個我們是當前的一個歷練,還有一個是我們當前的等級,那麼後面這個是技能的,技能的歷練需求,技能的歷練。
那麼還有一個是我們技能的一個等級的一個需求,那麼這幾個數字的話,我們需要先把它讀出來,那麼第一個我們是讀取我們當前的技能是否已經學習了,(敲擊中),(敲擊中)。
那麼這個我們可以從EF6這個屬性裏面讀出來,這是第一個數字,(敲擊中),那麼第二個數字是當前的一個歷練值,當這個當前的歷練值的話,我們需要在之前的人物的屬性裏面,先給它添加,這個人物屬性的單元,那麼A。
C這個位置,我們要給它添加一個歷練的數字,(敲擊中),那麼這個歷練的話,我們需要在它的個體代替單元進行一個數值化,當然還有一個是等級的,等級的我們之前A,C,我們看等級在三四這個位置。
那麼人物屬性等級我們已經讀出來了,那麼這裏我們歷練,(敲擊中),歷練的話,它的偏移是0x,A,C,那麼我們需要把它讀出來,另外人物屬性,我們需要跟它建一個相應的全球變量,(敲擊中),這樣好了之後。
我們在相關的單元添加我們的代碼,應該是,(敲擊中),當前的歷練,那麼這個等於我們的人物屬性代替代替,(敲擊中),那麼歷練這個數字讀出來,我們還需要一個當前的等級,(敲擊中),後面這兩個就是讀我們的。
我們先編一下,(敲擊中),這裏我們寫錯了,它的類型應該是不是指針類型的,需要把它修改一下,(敲擊中),那麼這裏我們最後需要一個返魂值,(敲擊中),當然返魂值的話,我們等一會再計算出來,(敲擊中)。
那麼還有兩個條件,我們需要把它取出來,就是我們相應技能對象,一個是歷練,一個是等級,那麼這兩個我們要先到相應的技能對象裏面,添加這兩個屬性,這技能對象的,技能對象,我們還要添加一個是當前的歷練。
歷練需求,那麼還有一個是等級需求,歷練的話,我們是上一期分析的是268,等級是AC,(敲擊中),把AC調到前面一點去,調到名字的後面,這樣按照它的偏移的大小來進行一個排序,好。
那麼我們在一到相應的初始化單元進行一個初始化,EF6已經初始化了,另外還有一個就是AC的需要初始化,AC排到後面,T-LIST2,它的歷練需求,我們就複製為相應的一個偏移,機子交偏移讀出來。
那麼這裡是268,等級需求是AC,那麼再把這個複製一下,那麼歷練需求,這裡是268,讀出來相應的一個數字,那麼相應的打印單元,我們也可以給它添加進去,應該是名字,類型,ID是否可用。
那麼後面來添加我們的歷練,等級需求,那麼應該是歷練需求,那麼接下來我們就可以取出這兩個條件,那麼接下來我們就可以取出這兩個條件,那麼接下來我們就可以取出這兩個條件,(音樂),那麼在讀之前。
實際上我們還需要判斷的是一個問題,就是我們讀出來的數值,如果我們相應的數值為空的話,我們就不需要進行後面的判斷了,那麼我們還是通過它的ID來判斷,如果它的ID的話都為0,那麼我們這裡直接我們就返回來。
就表示了不可學,這個東西不能夠學,就返回假,那麼後面的這幾個,我們一一的進行一個判斷,那麼最後我們返回真,那麼這幾個條件,我們都要進行判斷,那麼首先我們判斷的是什麼,這個技能是否可學。
當然我們為了把它分開,分開的判斷可能要簡單一些,那麼首先這個值如果它已經學習了,那麼我們也返回,那麼就不用去調用這個技能,那麼然後這是一個歷練的一個,當前歷練與技能歷練的一個需求的進行一個比較。
那麼如果當前的歷練小於的話,那麼小於我們技能等這個歷練一個需求,那麼這裡我們也直接就返回Fast,那麼後面是一個等級的一個判斷,那麼如果這個等級當前的等級需求,那麼如果小於我們技能的一個等級需求。
那麼我們也不能夠學習這個技能,返回Fast,那麼最後這幾個條件,我們如果都沒有把它攔住的話,最後我們就返回真,就表示了它學習技能的條件成立,然後我們編譯一下,(音樂),(音樂),(音樂)。
這裡我們需要加上一個Xturn,這個表示了套出我們的符號卡,而不是從定義塔,(音樂),好的,那麼這個我們編譯完成了之後,那麼這個條件我們可以加在什麼地方,剛才這個條件,那麼這個條件。
我們需要加在修練技能這裡,需要加在這個地方,那麼我們在執行後面這些語句之前,我們就先加上一個判斷,(音樂),(音樂),我們先判斷指定的下標,它滿不滿足這個需求,那麼如果是不滿足。
它返回的如果是Fast的話,那麼在這裡我們直接就返回-1了,那麼如果是返回的是真,它能夠學習,可以學習,那麼我們再繼續調用下面的,修練技能的這個功能就可以了,當然這裡我們也可以打印出一些。
相應的調試信息,(音樂),那麼我們也可以編寫一段測試的代碼,來進行一個測試,那麼這裡我們可以打印出一些調試信息,來進行一個判斷,(音樂),這裡就是把技能,(音樂),這裡是我們的某一個條件,達不到。
(音樂),不存在這個字母,(音樂),那麼這裡是技能已經學習,(音樂),那麼如果是這裡就返回的話,就是技能的歷練,(音樂),那麼是這裡返回的話,我們也就是技能的等級不夠,(音樂),達不到一個相應的要求。
好的,我們也可以進行一下測試,(音樂),那麼我們這裡用一個循環來測試,(音樂),(音樂),那麼掛機到主現場,打開我們的信息查看器,那麼我們可以看到,它就會遍移出來,那麼這個技能已經學習。
在前面的技能它是不存在,因為這個是一本書,是判斷的,它不存在,那麼這三個是歷練不夠,這個也是判斷的不存在,這個學習,這個已經學習,這個不存在,當然存在的,它就沒有打印出相應的調試信息。
那麼如果它返回為真了,那麼我們也可以打印出一段調試信息,來進行一個相應的判斷,那麼最後這裡也可以打印出調試信息,(音樂),(音樂),那麼我們可以看到前面的有三個都是滿足,這個條件的,都是可以學習的。
那麼它分別是我們可以看到,這個下標這裡打錯了,我們看一下,技能百分之D,後面我們應該要跟一個NED Index,下標沒有打出來,(音樂),(音樂),然後先把信息清除掉。
我們看一下,這個時候就說技能一二,還有技能七它滿足學習的條件,就這三個,那麼其他的都是歷練不夠,或者是已經學習了,那麼第十個十一個已經學習,那麼這個就是它的下標是七八九十,九十十一,這幾個都是學習。
下一個不存在,那麼這三個都是歷練不夠,最後已經學習,歷練不夠,當然它是先判斷的歷練,沒有判斷等級,好的,那麼這一節可能我們就講到這裡,那么下节课再见。
P33:044-编写挂机选项卡 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么在前面的课程里面,我们已经分析了一些数据,今天呢我们将为我们这些功能呢添加一些界面的设计,那么我们打开第43课的代码。
打开代码之后呢,我们切换到资源选项卡,然后添加新的资源选择啊,这个窗口当然那个新建。
那么删掉多余的按钮,那么我们在制作外挂的时候呢,用的最多的就是这个table country选项卡控件,用它设置了比较方便啊,到时候它会有很多的选项卡,每一个选项卡呢我们会关联一个相应的窗口。
那么添加好了之后呢,我们再对它的id啊进行一些修改,这样大家看起来更具有可读性,八,那,么修改好了之后呢,我们还可以把这个标题啊这些进行一下相应的设置。
然后这个tab control的样式呢也可以进行一些修改,那么改成你喜欢的样式就可以了,那么暂时呢我们不做修改,啊那么调整好了之后呢,我们需要来添加一个这个相应的内,那么我们这个呢就叫做c,开启。
好添加完了之后呢,我们点完成,那么另外呢我们每一个每一个这个table控件呢,我们每一个这个选项卡,我们需要跟它关联一个这个对话框,所以说这里我们还需要添加相应的单元,比如说我们添加一个挂机的啊。
这个选项卡,那么我们就要建一个挂机的窗口页面,那么在这里呢我们把它的这个boder这个属性呢我们改为long,就是没有这个窗口,那么调整好了之后呢,我们添加相应的控件。
比如说我们添加的自动挂机这个贡献或者是自动转换都可以,啊添加好了之后呢,那么等一会呢我们为了呃确定它的位置呢,还可以另外加一个控件,加在最下边啊,加一个静态的空间,啊然后呢对它进行一些调整,窗口的大小。
好调整好了之后呢,我们接下来呢就进行一些代码的设置,进行一个关联,当然这里呢我们需要添加一个类,那么这个内容我们就叫做c配置,搞挂挂挂机的一个页面,然后呢点完成嗯,在关联这个录之前呢。
我们对这个对话框的id呢给它进行一下相应的修改,那么这里呢我们就要做page,挂机,啊然后呢再添加位,点完成,那么完成了之后,我们切换到类似图,然后我们选刚才的这个page one table。
转到这里之后呢,挂机这个页面添加了进来之后呢,我们给它添加一个pc的单元,然后添加我们的成员变量,把它作为,再去挂机,然后呢把它作为一个成员变量,好添加完了之后,我们可以先做一下编译,那我检查一下。
我们看什么地方有错,佩奇挂机啊,然后呢,他说这里要缺少一个数,那么这个c page呢挂机呢他不认识,那么我们看一下在这个配置挂机这个单元里面,我们是怎么定义的,刚才,啊c配置挂机啊,可能是大小写。
也可能是法,然后我们再转到这里,再来看一下,录制一下挂机,然后再编译生成,啊重新编译一下整个解决方案,好编译成功之后呢,那么这个单元我们添加进来了,添加进来之后,那么我们注入之后要显示这个窗口。
方便我们测试,在这里我们再添加一个,那么在外挂没有完成之前呢,我们就在这个位置显示显示外挂或者叫登陆外挂都可以,那么在这里呢我们进行的刚才的这个空间的一个形式分析,在显示之前。
播完这个page mutable啊,这个单元,然后我们在他的这个录里面呢,给它创建一个相关的成员变量,先把带了个windo,在patch my page,然后,科技这,同时我们选重写。
那么重写这里呢我们在它的初始化函数这里,对话框初始化的这个i p大案的这里来添加代码,那么在这个位置呢我们创建窗口啊,因为我们显示的不是模态的话,那么在这里创建窗口c pc i t t。
把他的id传进来就可以了,然后再编一下,那么这里编译成功了之后呢,我们就可以显示这个窗口,显示外挂这里,嗯,修文的。
啊然后我们就可以进行测试。
对了我们还需要把它重新再编一下,还有相应的单元,我们需要做一个调整,把它的标题啊复制下来,替换到这个地方,啊然后再编译一下,同时把它设置为启动项目,那么调试啊,这里的工作步骤我们也要跟他设置一下。
那么这个时候我们显示外挂,我们看显示出来的这个新窗口呢,还没有这个选项卡,因为我们想象的不一样,那么这个时候呢我们把它关掉。
因为我们还要进行一些初始化,要添加这个框架的选项卡,那么这个时候我们转到啊这个mtable单元,重写它的初始化函数,那么在这个位置呢我们添加啊,当然在之前我们还需要呢呃关联一个table选项卡的控件。
控件变量能,点完成,那么完成了之后呢,我们再切换到内饰图初始化按钮。
这里按tab,然后呢对它进行一些相关的操作,添加选项卡,那这是我们它的一个序号选项卡,第一个选项卡,那么这个呢我们就叫做挂机,那么再添加一个选项卡,那么这个选项卡我们暂时还不知道做什么,就叫做测试。
好然后我们再编译一下,来看一下效果。
那么这个时候呢就有了两个选项卡,但是里边呢它没有内容,要内容的话,我们需要呢把我们刚才建的这个页面啊给它关联上去,也就是挂机自动打怪,这个页面我们要给它放上去,要放上去的话,我们在这里呢。
要进行相关的一个优化,自动的自动挂机啊,刚才我们好像已经建了一个相应的对我们看一下啊,自动挂机的内建好之后呢,这里我们添加了一个成员变量挂机页面的,那么这个挂机页面呢我们也需要转到它的初始化单元呢。
进行初始化的操作,那么首先我们在这里也是要创建这个窗口,因为我们不是显示为模态的,那么它的窗口的i t来源就来源于这个另一面了,这个阴谋他i t啊每句都行的,i t好,那么创建好了之后呢。
我们需要给它给它设置一个副窗口,如果不给它设置一,个副窗口的话,这个时候呢它显示出来的这个窗口位置啊,不对,那我们显示一下这个窗口,看一下,那么便宜。
好编译成功之后呢,我们再来看一下现在的情况。
那么这个的时候这时候的情况比较乱,那么我们显示外挂的时候的话,那么这个窗口和这个窗口呢它会独自的显示出来啊,所以说呢这种效果的话明显不是我们所想要的,那么这个时候我们需要添加一些代码。
要给它设置一个副窗口,这个新的页面,因为它的这个副窗口的话,我们就要设置这个控件,这个tab控件,然后呢取得这个控件的支撑,啊然后呢我们再来看一下效果,啊显示外挂,这个时候呢什么都没显示出来。
但是我们刚才的这个窗口呢,它不会乱显示啊,这是,那么我们还需要做的呢,就是嗯要为这个相应的选项卡啊,关联一些待遇,那么我们在移到我们的这个泰国window,在这这里呢我们双击这个选项卡控件。
在这里呢我们为它啊关联这个选相应选项卡的代码控件变量,然后我们取得当前选中的选项卡,这个表示我们当前的选项卡的一个数字组,那么这里添加相关的课程,也就是挂机,那么在这个位置呢,我们就显示了,挂机啊。
这个窗口,k那么在后面这里呢,如果单击了其他的选项卡,那么我们就隐藏好,再编译一下,但是我们想要的那个窗口呢,它还是没有显示出来,也就是这个自动打怪的窗口,因为它的位置的话可能是不对的啊。
那么我们还要对它的位置呢作为一个调整,那么转到这个嗯pg啊,mtable在在他的这个初始化这里呢,我们再对它的位置呢做一个调整,那么它的位置的话是相对于这个选项卡控件的。
那么所以说我们先啊取得取得这个选项卡控件的位置,那么在前面呢我们听下去一张,为此,那么在这里呢我们先取得他的嗯这个客户区啊位置,那么该题肯定啊,2014题,然后呢我们传一个呃这个矩形结构的历史基础。
那么取得了之后呢,我们不能够直接拿来用啊,因为我们来看一下嗯,这个资源窗肯定,那么因为它上面这里有一排的话,他取得的是这个点,这个点还有这个点,一共四个点,上下左右的一个位置。
我们要剪掉前面的这个按钮的一个位置,在这里呢它大概是占20个单位,那么所以说在这里的话,我们要加上相应的,那么我们还要对他取得这个矩形的坐标之后呢,我们还要对它进行一些修改,那么它的这个top,那么我。
们要加副手位,在它原有的基础上呢,我们将日式左右啊,然后它左边的坐标呢我们root,我们给它加上,加上二左右框,再让我们的这个挂机页面呢移到这个位置上来,move等等啊,然后传直接传这个矩形坐标就行。
然后我们再编译一下,显示外挂啊,这个时候呢我们发现它已经能够显示出来了,但是它的位置的话还有一点不对,如果再往下面移一点的话,可能会更好,还有在下面的这个位置呢,感觉也被超出了啊。
那么我们再做一个相应的调整,再在它的基础上呢,我们加三,这里呢它的基础上我们再加三嗯,然后下面的坐标呢我们再给它减减一部分,tab,那么下面的这个坐标呢叫bolton,这个坐标呢我们给它减三减负值三。
然后还有一个右边的坐标叫right的,那么我们也它减负数,在它原有的基础上减三。
再显示,那么这个时候我们看看一下啊,上下左右的话,看起来的话,它显示呢就比较正常一些了,就比较正常一些,那么他的观点的话,我们啊就这样了,那么下一节课呢我们在为这个界面呢添加相应的代码进行。
或者是增加一些啊界面的一些元素,那么比如说我们设置好了之后,我们还可以呢在这这两边呢添加一些按钮啊,用来应用设置开始挂机啊,停止挂机啊,这一类的,好的具体的操作呢我们又在嗯下一节课啊再进行。
那么大家呢可以把它这个代码的添加当成一个坐列哈,先下去先下去之后呢自己操作一下,好的。
P34:045-创建挂机类-封装自动打怪 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁吉星老师,那么我们在之前的课程里面简单的设计了一下挂机的界面,那么这节课我们主要来封装一个挂机的类,那么我们先打开第44个的代码。
打开之后我们转到我们的资源,转到我们的选项卡窗口,那么我们设置为利用设置,改一下它相应的ID,那么第二个我们设置为开始挂机,那么第三个我们设置为停止挂机,好那么这三个功能我们先在类里面进行封装。
封装好了之后,然后我们在这里进行调用就可以了,那么切换到我们的根得体单元,添加筛选器,挂机对,然后我们添加一个C++的类,那么添加完成之后会出现两个文件,把它移到相应的单元,然后转到图文件。
进行代码的编写,然后定一个类关键字,然后C++WaterCreator,那么类里面我们要实现三个功能,一个是相当于是应用设置,第二个是我们的开始挂机,第三个是停止挂机,那么它有一些参数。
它应用的设置的话,这里我们直接把它写成一个Public参数的形式,那么第一个我们就是试图自动打怪,那么这个参数我们是通过资源窗口的自动打怪的复选框给它传进来,等一会,那么第二个也就是我们的开始挂机。
开始挂机了,我们要用现成,那么要用现成的话,我们先给它定一个回调函数,那么自动挂机的开始挂机的自动打怪,以我们的自动节目,我们全部把它写在一个现成里面,那么现成的回调函数写好了之后。
我们还需要另外写一个函数来启动现成,那么首先我们在相应的现成的回调函数,我们先把它实现,那么转到我们的cpp单元,对了,这里用到了布尔类型,这个是需要包含我们的Windows档文件。
然后再转到我们的cpp单元,首先包含类的档文件,那么前面我们要进行一个左右移动的限定,那么在里面的话,回调函数里面,我们就需要反复的执行一个动作,就是打怪和剪幕这两个动作,一个是剪幕的,我们暂时不实现。
跟它预留一个位置,那么这里就是我们的打怪,那么打怪它又需要来根据一个判断来实现,如果自动打怪这个条件成立的话,我们就直接调用message,WaterBtMonsterHostKill。
那么这里我们传一个技能,连进去,攻击,那么大致就是这样的一个设计,当然要调用这个单元,我们也需要包含主线程的档文件,Word主线程的档文件,好,那么我们先编译一下,看有错误没有,暂时没有错误。
那么这里执行完了之后,我们还需要让这个线程,让它休息一段时间,那么比如说休息一秒钟,1000毫秒,但是这个最好我们也把它设置成一个参数,这样我们到时候方便调整,那么在Public单元。
我们再跟它添加一个,Url的一个变量,调整它的一个频率,打怪的一个频率,好,那么我们这样好了之后,那么这样好了之后,我们就直接在回调函数里面,直接用相应的参数,那么我们执行一次,我们让它等待多少毫秒。
那么再进行下一次攻击,好,那么回调函数建好了之后,我们可以来实现挂机的单元,这个才是我们的开始挂机,那么这个是我们挂机的回调函数,自动挂机的功能,我们就是创建一个线程,在线程里面。
我们就把回调函数进行一个加载,让它来循环执行回调函数,当然创建线程我们可以放在单元,但是最好是把它放在,Vue的一个初始化函数,它的构造函数里面,这样更好一些,我们添加一个同龄的构造函数。
那么这里边我们进行初始化,那么在这里我们就创建一个相关的一个线程。
那么第一个安全属性,我们为空,那么第二个对战的大小,我们也让它系统自动管理传数字,那么第三个就是我们的回调函数,那么就是我们的回调函数,那么就传这个函数的地址传进去,那么第4个,我们有相应的参数。
不需要传相应的数字进来,那么第4个,我们这里就创建了一个属性,我们可以看一下相应的MSDN的一个说明。
那么倒数第二个参数。
我们可以在创建的时候来挂起这个线程,用这个标志,也就是说创建这个线程之后,来先不执行,用其他的函数来恢复,好,那么这里我们先创建这个线程,那么这个线程我们创建之后,它返回有一个ID。
那么在这里我们在内存源里面再添加一个变量,用来创建的线程的ID,那么我们再转到相应的单元,对它进行一个初始化复制,那么我们就取得了自动打怪的,自动解雇的线程的ID,创建的线程的剧品。
那么这个剧品获得了之后,我们在这里可以用另外的一个函数来开始执行我们的线程,它这里也有了用入门set,它的一个参数就是这个线程的一个剧品,那么我们在这里就来进行对它进行一个调用,恢复线程执行。
因为它在创建的时候的话,这个线程它只是创建好了,没有让它跑起来,然后我们在这个地方恢复线程开始挂机,然后我们再编译一下,这个时候它会提示我们Rate线程的函数,它不能够进行转换,不能够作为一个回调函数。
那么在这里我们首先要用一个指针来强制的转换,但是这样转换之后,它编译的话同样不能够通过的,那么我们需要怎么来通过,那么首先我们转到我们的头文件,把回调函数加一个前缀,静态成员把它设置为,然后我们再转换。
再编译,但是这个时候它又说,因为我们的回调函数,它是一个静态的成员函数的话,那么它就不能够对非静态的成员进行调用,所以说我们一个解决办法,也是把相关的静态成员函数里面引用到的这些变量。
也把它定义成静态的,好,那么我们在这边,这样我们就能够通过,然后我们再保存一下,那么我们还需要设计一个函数用来停止挂机,这个是stop,那么我们把上面复制一下,这里改为stop,然后这里我们最后的时候。
退出的时候,我们这里我们再次挂起线程就可以,挂起线程,它就是暂时让它不运行线程,那么最后我们程序退出的时候,我们也需要做一个相应的清理工作,那么我们在这里给它添加一个,对的析构函数。
然后再复制一下相应的代码,然后在这里做一些清理的工作,那么我们在退出的时候的话,这个线程它还是在运行的,所以说我们需要对它进行一个结束,那么强制的结束线程结束之后,我们的动态链接库才能够安全的退出。
用telemeter来强制的结束,最后一个结束的参数标志,要退出的一个代码,这里给它传1就可以,任意数值实际上都是可以的,那么我们这样设计的话,大致的功能就设计好了,一个是开始挂机,一个是停止挂机。
然后我们需要把它添加到我们的,全局变量的单元里面,所以waterplay在这里添加一个,首先我们在cpp单元这里进行一个变量,全局的,然后再转到全局变量单元包含我们的,头文件,加上套出说明。
然后我们再编译一下,那么这个时候我们再到支援,选项卡单元,然后应用设置这里,我们就对全局变量进行操作,包含相应的全局变量单元,那么应用设置我们先,那么对变量来进行一个复制,那么变量数值的来源。
它是来源于挂机单元的自动打怪,那么所以说在这里的话,我们还需要来为空间来管理一个变量,点一下完成,那么点完成之后,我们在应用设置这里,首先我们需要对挂机的单元进行一个更新。
把我们窗口的数据更新到我们的变量里,那么更新之后,我们再把它的数字传到我们的内底,好,再让我们的伺服器自动打怪的标志就传到我们的内里,那么我们再进行一下编译,这个时候它会提示静态的我们的成员变量。
它无法解析,当然如果我们这个时候,如果是把它设置为非静态的话,它应该就能够这里就能够复制了,但是我们另外的这里它也有冲突,因为我们的毁掉函数这里的话,它需要使用静态的成员函数。
那么这里我们可以通过另外的方式来解决,我们在这里我们取消静态的成员,然后但是我们这里它不会报错了,但是我们的对成员函数,静态成员函数里边这里的访问它也会报错,所以说这里它是有冲突的,那么冲突的话。
刚才我们不是进了一个全局的变量,我们可以用全局变量来进行相应的取值,这样能够解决我们的一个冲突,好的,然后我们再转到我们的选项卡单元,那么这里我们进行了相应的应用设置,把数据更新到了我们的Root里面。
然后这里开始挂机,我们也是调用的内存一个函数来实现,Start Waterplay,然后这里停止挂机的话,就是Stop Waterplay就可以,那么我们来看一下逻辑上还有没有错。
然后开始挂机转到我们的线材这里来执行,开始攻击,那么攻击的操作的话,技能里面它们是我们的动作才有一个攻击,那么所以说我们还需要修改一个相应的,主线程的一个函数,属性成单元,然后我们在自动打怪这个地方。
它传进来的参数的话,就是我们的攻击,但是我们去骗你的时候,我们在设计这个函数的时候,它去骗你使用技能的时候会找不到,会找不到技能名,因为它是属于我们动作技能里面,所以说在自动打怪里面调用技能这里。
我们需要再进行一些修改,那么使用技能这里,如果我们发现它传入的这个名字是攻击的话,那么我们就去调用动作,而不调用技能,那么在这里我们再做一个判断,那么如果这个攻击这个字串相等的话,返回值就是0。
那么在这里我们就调用GX,然后在这里调用相应的,攻击也就是调用,或者就是这个变类调用我们的攻击动作,或者这样写的话可能还要容易理解一些,然后调用它之后我们直接就返回,调用成功就行,好的。
那么我们再重新申请一下,然后我们可以输入到游戏里面进行一下测试,那么打开我们的调试器,调试信息查看器,那么首先挂机主线程显示外挂选中自动打怪,利用设置。
然后开始挂机,然后我们看一下游戏里面的动作,这个时候已经,它反复的这里显示了攻击,但是这个时候游戏已经断开了,测试不了,那么我们重启一下游戏,那么开启游戏之后。
我们再注入一下我们的代码。
挂机主线程显示外挂,自动打怪,应用设置,开始挂机,那么我们看一下游戏里面。
这个时候它就会自动的去打怪了,但是它只是用的普攻,没有使用我们的技能,好,那么我们退出我们的外挂,退出之后,我们可以了,攻击这里我们还可以,加上一个相应的参数,也就是攻击的一个类型,在这里可以给它加上。
ModemPlay,然后这里我们可以加上,Char,Serge,Skill,Rate,那么这里我们的技能名,我们可以了,跟它做一下相应的一个设置,那么也可以做一个参数,然后这里就传技能的名字进去。
当然这个是我们在后期,我们再进行一个相应的设计,那么这些,我们这里来直接就跟它传,相应的数值,再做一下相应的测试,比如说这个逆天杀星,我们来看一下,好的,那么我们重新再编译一下,那么在这里的话。
我们时间的间隔,我们还没有进行一个设置,它刚才我们调试信息里面的话,它闪的非常的快,因为我们这里的话没有进行一个相应的初始化,那么我们在这里的没有初始化的话,可能它的指的数值是0。
那么所以说我们在这前面给它进行一个相应的初始化,打过建构,那么我们跟它初始化为1000毫秒,那么它每过1000毫秒之后才去调用一次技能,那么这些参数最后我们都可以把它添加到,我们的挂机的界面上面。
打过的间隔,还有我们的技能的名字,那么我们都可以在窗口上面进行设置,好,那么那是我们下一节课的一个内容,今天我们就到这里就OK了,然后我们应用设置开始挂机,看一下相应的,该技能未放置,逆向,我们写错了。
应该是逆天,看得醒,逆天,记住这里要先挂接我们的主线程。
然后再显示外挂。
然后在应用设置,开始挂机,那么这个时候应该在自动打怪了,好的,那么我们这几个的测试就到这里,那么我们点停止挂机之后,它将不再去打怪物,按开始挂机之后,它就不断的去自动打怪,好,那么我们退出我们的外挂。
下一节跟我们再见,拜拜。
P35:046-类成员函数作回调函数 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么在第45课的时候。
我们封装了一个挂机的类,在WaterPlay挂机类里面,我们有一个回调函数,这个回调函数,我们是用静态关键字来修饰的,那么所以说我们这些类里面的成员,函数的,这些类里面的成员变量的话。
我们在回调函数里边的话不能够直接的访问,那么我们当时是建了一个全局的变量来访问的,但是用了全局的变量的话,我们就相当于突破了绿的一个封装,这样的话使用的话也不是很好,那么这几个我们来探讨一下。
使用非静态的成员函数。
来作为一个我们现成的回调函数,那么新建一个项目来测试一下。
然后我们添加一个类,添加一个现成的路,那么创建了这两个文件之后,我们把它移到目录下边,然后我们也是仿造上一节课的代码来输行,首先包含我们的windows的文件,创建一个剧本来保存我们的现成剧本。
这两个变量,我们成员变量我们用来传递参数,然后再创建一个现成的回调函数,另外我们用一个函数来恢复现成,好的,那么写好了之后,我们在内成员的一个购物册函数里面进行一个初始化。
那么首先我们对这两个成员内成员变量进行一个初始化,然后在这里我们再创建一个现成,后面的参数我们全部创为0,抛空就行,那么只需要一个现成的回调函数就行,那么后面的参数我们暂时不忙传递,那么回调函数里边。
我们应该又做一些什么的,添加相关的一个代码,我们做几个简单的数据的打印,准备好你准备好,(遊戲畫面),(遊戲畫面),(遊戲畫面),(遊戲畫面),這個時候我們進行一下編譯。
這個時候我們就發現了我們非靜態的成員函數,它就通不過一個編譯,那麼這裡我們需要建立一個變量,用幾句匯編代碼來逃避編譯器的檢測,(遊戲畫面),首先我們把這個綠成員函數的地址通過匯編把它讀出來。
那麼編譯器它不會檢查匯編代碼,然後我們再把匯編的地址把它讀到我們的變量裏面去,(遊戲畫面),然後我們用變量來做一個強制類型的轉換,(遊戲畫面),那麼這個時候它就可以通過我們的編譯了。
那麼通過編譯之後的話,理論上我們就可以了用它來傳遞我們的參數,但是我們來進行一下相應的測試,這個時候包含我們的同文件,(遊戲畫面),然後我們創建一個綠的實例對象,(遊戲畫面)。
然後我們開啓相關的一個線索,(遊戲畫面),用一個getty charm來讓打印出信息之後,在這裏停一下,方便我們查看一個信息,(遊戲畫面),對了還有一個study set。
我們只在同文件裏面做了一個說明,還沒有編寫一個具體的代碼,(遊戲畫面),那麼在這裏我們恢復創建了一個線程,那麼要恢復創建的線程的話,我們到第二個參數了,這裏我們就要創建之後把線程掛起,(遊戲畫面)。
那麼我們在編譯運行一下,那麼這個時候我們發現它會報錯,為什麼會報錯呢,因為這個res指針它不能夠獲取,因為res指針的話,它是作為一個參數,保存在我們ECX裏面,這樣傳進去,(遊戲畫面)。
那麼這裏我們停止調試,因為我們這裏是回調函數,它傳進去的參數來這裏為空,所以說在我們回調函數裏面的話,它用的res指針,這裏相當於是我們通過res指針來訪問的參數,那麼這個前綴只是我們平時省略掉了。
但是這個時候的話,res指針它沒有經過一個相應的初始化,那麼所以說我們要解決的話,我們要怎麼解決,首先我們要在這個地方,我們要傳入我們的res指針,但是即使傳入了指針的話,由於我們的回調函數。
它的一個參數的傳遞方式,與我們這裏的回調函數的一個傳遞方式不一樣,那麼在這裏我們的現成的回調函數,它要求的是std code的一種傳遞方式,而我們這個地方它參數傳遞的方式是res code。
那麼res code也就是用ecx來傳遞的我們的res指針,所以說我們這樣編譯的話。
它同樣的還是會失敗,我們看一下,同樣的會失敗,那麼實際上它這個時候res指針傳到了我們的LPDirty裏面去了,那麼我們也可以解決,這個時候我們停止調試。
那麼在這裏的話,我們只需要添加一句,在回調函數裏面,只需要把LPDirty複製給我們的res指針就行了,或者我們把這裏的路徑給它改一下,就改成semicolon set,pgs,這樣改也可以。
當然在這裏的話,我們也可以直接的使用pgs的指針也可以,那麼可以這樣的使用,但是這裏的話,我們就需要改它的前面的一個說明,然後我們運行。
那麼這個時候我們就能夠正常的接受我們的參數,可以正常的使用。
當然還有另外的方式也可以,那麼如果我們在這裏,我們不改變,它的話,我們也可以用另外的方式,用之前的一個參數的方式,那麼在這裏,我們也可以這樣寫,那麼在這裏的話,我們可以怎麼寫呢。
那麼我們不要這個前句的話,不要前句了,我們寫要方便一些,我們可以把這個res,指針給它重新的進行一個複製,electric,這樣的一個複製就行,但是這裏,首先我們要有一個類型的轉換,那麼轉換之後。
這樣編譯器主要是編譯通不過,這個時候編譯器,它不能夠進行這樣的一個複製,那麼我們也可以用一句彙編指令,來逃避一個編譯器的檢查,那麼這樣的話,我們就可以了,不加這個前句,直接的像正常的成員函數這樣來調用。
然後我們再來看一下答案的一個結果。
那麼這個時候輸出的數字的話,也是正確的。
也是正確,好的,那麼這裏的試煉成功了,接下來我們就可以改一下,我們上一節課的這個代碼。
那麼我們打開第45課的代碼,對我們上一節課的代碼來進行一些修改。
那麼移到掛機率的這個單元,在這裏,首先我們去掉靜態的關鍵字,但是這個時候我們編譯的話可能就要出問題,那麼這裏無法轉換,那麼首先我們要逃避相關的一個檢測,這裏我們另外的建一個變量。
那麼這樣我們就能夠逃避一個編譯系的檢測,那麼這樣我們編譯通過了,但是還有一個參數的一個傳遞,那麼這裏我們傳ZESS指針進去,那麼這裏ZESS指針傳進去之後,在我們回調函數裏面,我們還要接收這個數字。
但是這個回調函數我們還需要給它進行一個復原,這裏我們需要接受一個參數,然後移到頭文件裏面進行一個詳細的修改,那麼修改了之後,在進入循環之前,我們也要把ZESS指針進行一個重新的複製,mov_ex。mp。
對,而後面的ZESS指針,要複製為我們的繼承金ex,然後再重新編譯,那麼在後面的我們全局變量的依賴,我們就可以把它取消掉了,然後再編譯,好的,那麼測試的工作就留成一個座列,大家下去測試一下。
那麼我們這節課我們就到這裏,下節課我們再見。
P36:047-快速更新基址方法 - 教到你会 - BV1DS4y1n7qF
我是郁金香老师,那么今天的游戏有一次大的更新,嗯,大部分机子都不能够使用了,那么所以说今天呢我们讲一下机子的更新,那么首先呢我们找到跟dt,然后wega这个单元,那么这里面呢我们有啊。
这就是我们目前用到的这些机制啊,先把它复制出来啊,那么今天呢我们就以前面这三个啊做一个例子来谈一下呃,怎样快速的更新我们游戏的机制,那么首先呢我们以背包的这个机子为例,先把它复制一下。
然后我们建一个新建一个文件,把红的名字复制一下,然后我们打开呃,之前我们的分析的一些资料做一个参考,背包的我们找一下背包,大概第11课,那么11课呢在这里呢我们抓了一些啊,这个代码把它复制出来。
这是我们11号分析的时候呢抓的一段汇编代码,那么在这个地方就是我们背包的机子,但是游戏更新之后的话,这些汇编的指令实际上呢它的改动呢不是很大,比如说像像下面这个数组的访问的方式,它一般来说是没有变化的。
只是我们改变的只是上面的这个机子,那么所以说我们可以通过这条指令来进行一下搜索,搜索这条指令,还有这条指定啊,因为搜索一条指令的话,可能呢它会有重复的,那么我们可以这样来定位更新我们的机制。
先打开我们的游戏。
打开了之后,我们用ot附加到游戏里面。
那么附加到游戏之后呢,我们转到之前的地址。
那么之前的机子呢是在这个位置开始。
我们把这个地址复制一下,因为代码更新之后的话。
它也是在它的前后,这个机制呢不是在他它的前面一些呢,就是在它的后面一些啊,那么我们可以在这个地方呢来搜一下我们的这两段指令,当然在后面的复习一点,后面的这段指令呢也可以把它复制下来。
复制下来之后,然后我们在这里有一个查找所有命令序列,然后我们复制进去点一下查找,那么这个时候呢我们找到两个地方嗯,这个地方我们双击进去,然后呢就是我们找到的地方。
那么它的前面这里呢就是我们的机子就能够定位到底,这样我们很简单哈。
通过我。
们的命令序列来定位,这里加上410啊,加上我们的5c就是第一个的名字。
那我们用tc来看一下精通要到这是我们第一个方法,那么第二个是雪原声,我们看一下,这里加上一个4x1啊,血缘生,那么证明我们找到的是正确的啊,这是我们嗯新的机制,然后我们把它更新在前边。
那么这个老的这一段呢我们就可以删掉了。
因为下次游戏的更新的话,它的机制呢肯定是更接近于我们这一次,那么这里是我们的背包气质。
那么这是新的背包机子,我们把它注释一下,那么前面这里还有一个这两个都是,那么把这一段呢周围的这一段啊,尽量多复制一点,那么下次呢我们就用这个新的代码作为一个特征码来进行一个搜索。
那么这是前面的我们提取的指令特征,那么除了这个指令特征之外呢,我们还可以用c一来更新这个快速的更新这个机制,因为这个指令的话,实际上我们说到这个指令呢,它实际上都是一段机器码。
在前面的话都是以机器码的形式,那么我们也可以把这段机器码把它提取出来,比如说这一句指令,这个是五七复制在后面,这个指令是八bf 8点或者在后面,那么这段指令呢,而2b b9 什么的,比九什么什么的。
我们也把它复制在后面,然后删掉空头啊复制,然后呢这里呢我们附加到游戏,这里我们选16进制,选字节数组,然后开始搜索,然后我们也能够搜索到这个指令的附近,搜索到之后,我们把这个地址栏复制一下。
然后点查看内存前往地址,前往我们找到的这个地址,那么它的最前面一句呢就是我们的机子,那么在这里呢我们也可以汇编,那么这个3c31 c6 f54 呢就是我们要找的这个句子,那么这是用c一的方式来来更新。
那么在这里呢我们不是自己代码,好了,那那么这是我们背包的这个机子的一个更新啊,那么下次的话我们就可以按照这种方式来来快速的更新,当然这个特征码我们也可以把它加到相应的工具里面,或者自己编写一个工具。
通过这个特征码来更新也是可以,但是特征码的话最好让我们去多取几个啊,比如说我们还可以取后面的特征,比如说啊这一段,那么再加上我们的,这一段是,那么这段代码呢我们也可以作为一个特征码。
那么它也可以定位到它的一个附近,2p81 ,我们看一下是不是不是错了,滴滴,我是复制了这一块没服把500分,这是8b f80 ,然后是2p b成,那我前面还有一个5c,是删掉重新,之所以是。
啊这样呢它也能够更新到它的一个附近,然后我们也能够转到相应的一个内存,好的,这是我们的啊一种方法啊,那么我们再来做一个测试啊。
再来找一下core的一个地址,那么第二个呢我们这个是啊,第三个这个是背包括物品使用的这个扩的一个地址,我们来看一下用同样的方式能不能够实现,同样的把这个红的名字啊复制一下,作为它的一个文件名。
然后我们找到java里边啊,之前我们分析的背包的物品使用第13课,那么在这里呢我们也提取了一段相应的特征码,把它复制一下,那么我们也可以根据这段特征码来进行一个定位。
那么首先呢我们把这前面的这一段啊复制一下,我们先用c一来进行一下尝试,搜一下它的特征,看能不能够收到,而复制转到我们的声音清扫描,这个时候呢我们发现这个特征呢我们没有收到,那么我们再尝试下一个特征。
因为他有一部分特征,它可能以及有些更新之后,它肯定有一部分变动了,好然后呢我们复制,新商标啊,那么这个时候呢我们找到一个戒指,找到之后,我们把这个地址复制出来,查看内存,前往地址,那么前往之后呢。
我们看一下,那么它下面三个push之后呢,就是一个空,那么这里有三个图形啊,我们看一下这一段指令与我们这一段指令的话,它都是一样的,都是一样的,然后下面这里是一个空,那么这里是一个扣。
那么这个扣的话就是我们的物品使用的扣,那么我们在这里会给啊,就能够找到它,好那么我们不把它更新一下,那么也把这段新的特征我们给它加在后面,不是,那么前面的这个特征呢,我们实际上可以把它删掉了啊。
当然我们还可以做另外的一个测试,这只是用我们的o d来说了,我们也可以在c一里面通过指令特征来收它,那么指定特征的话,我们呢因为前面两句,我们说这个相应的这个呃机器特征码已经搜不到了。
证明这两句指令的话也是废了,那么所以说我们直接嗯用后面的这个指令做一个特征,然后这里呢我们加上一个5514x1 tx,因为前面后面的这个空已经变了,那么这一句肯定不能够做一个指令的一个特征。
那么这个我们做指令特征的时候呢,有一个圆角,这里边呢不要包含这一种啊,呃地址啊,直接的我们可以包含偏移或这种指定好的,那么我们复制一下。
那么在复制了之后呢,我们还有一点要先转到他以前的指令的周围,这样的话我们搜出来更快一些,然后呢我们知道它的前比较前面一点,再复制这个指令串,那么在这里呢再查找一个相应的所有的命令序列,查找。
但是这个时候我们并没有找到啊,因为找到我们可以尝试一下,从前面这一段取消掉一条指令,再来讲一下所有文件序列,好那么这个时候呢找到了一个地方,就是这个地方就是这个地方。
那么这里呢就是我们获得这个物品使用库的一个地址,背包物品使用,那么我们可以在这里下一个段,那么使用一个物品做,做一个上市云深啊,那么它的下标应该是一啊,这里我们可以看到它的物品下标是一。
那我们看一下这里呢是它的一个参数,是它的一个参数。
下标参数应该是ex,那么我们使用第一个看一下,第一个的话ex的啊应该是这上面一个才是,这里是零一,这个才是下调,这个ebx应该才产生它的下标,你看唯一的只有这个啊,产生了一个变化,好的。
那么我们再来进行一下尝试,把它移到地理三个啊,下标13,这个时候b b x,好的,那么我们把这个也复制一下新的机器码,我这个使命套餐这一段,用这个新的指令来来替换以前的这个指令。
因为游戏下一次更新的时候的话,肯定它是在现有的基础上进行一个更改,那么替换掉我们之前的机制,好保存一下,然后我们再分析一下人物的属性,那么人物的属性我们找一下,人物属性的分析,那么人物属性这一块呢。
我们没有一个没有提取相应的这个指令以及这个特征码,所以说这这这个我们只以另外的方式来更新嗯,我们可以打开第八课再看一下,那么我们也可以另外新建一个文件,能够属性的,新建文本文档。
然后打开把这个属性的红名字啊复制一下,然后把相应的偏移,我们把它复制出来,这,好保存一下,那么我们要更新这个机子的话,人物的名字可能重复的地方比较多,那么我们可以根据一些比较具有呃。
具有一个相对唯一性的一些数据呢进行一个呃回溯,比如说我们可以找到历练或者是当前的一个血值啊,精炼值,然后再减掉相应的偏移,可以求出这个机制,那么在这里呢我们选一下清扫描,全是自己,十进制。
然后看一下现在的力量是多少,103919,然后03919,那我们搜搜索一下,那么这个时候呢搜索到一个地址,就是这个地址2f9 g啊,那我们把这个历练的地址复制一下。
转到我们的o d里面,那么既然这个地方是历练啊,那么因为我们的机子加上ac是历练的地址,所以说这个地方呢它减0s的话,就恰好是我们的机子人物的名字啊。
这个地方,那么我们把这个地址抄下来,2f1914 。
大,那是一四进好,那么这个地方的话,我们再回来加上ac就是历练,那我们再来看一下它的其他偏离。
然后再加上84hp mp。
我们看一下加80这个位置,现在的血值是1113,血值1113,内功是678,那我们看一下内工程啊,678。
再看一下我们的。
防御啊,防御力加cc,这个地方,那么防御力是多少,我们看一下483,那么这里呢是483,那么说明我们找到的是正确的这个地方,它就是我们新的呃人物属性的一个机制更新在这个地方。
那么保存一下。
那么同时呢我们下次呢也可以用特征码来搜,但在这之前呢,我们在里边在ot里边呢搜一下啊,这个常量,所有的常量搜一下,那么我们可以收到很多啊使用这个人物属性的这个机制的地方。
那么在这里呢我们用第一个比较靠前的,这个是要开头的,这个这是我们的人物属性介质,那么这个机子的话,我们也把它称为的代码啊,呃复制一下。
那么下一次呢我们也可以通过相应的这个特征码来进行一个定位了。
那我比如说我们就可以把这前前两句这个指令做一个特征嘛,那么进行一个定位,然后找到它的一个附近,那在这里边呢他也可以搜啊,也可以查找我们的这个所有的常量或者是二进制的字串,它也可以找。
也可以把这个数字来复制进来,进行一个相应的一个查找。
但是呢他肯定没有我们的这个c一啊,用途方便。
好我试一下。
这个时候我们也能够进入到它的一个附近啊。
然后呢把它添加进来,把这个地址复制一下,然后呢我们查看六场前往到前往到了这个地址,那么前往到地址之后呢,我们需要把这两个特征呢进行一下对比,它距离我们后面真正的这个地址有多远,需要有一个大致的一个偏移。
那么在看一下啊,这前面的有一个呃一个17c e x e x的一个174的这样一段视频,才能够定定位到它的一个周文,那么我们往后走一下,那么这里有个174,那么这里的话就是我们的在这里汇编的话。
再看一下174,后面还有一句话,还有这样的一个语句,那么还要往后面移一下,应该是这个地方才是我们的机子啊设定,那么要注意它前后的一个指令,那么实际上我们用这一段指令的话,就可以直接定义到它的一个附近。
用它来做一个特征,加上我妈,这直接就是我们的后面就是我们的特征码b9 来自木啊,ex那么加上这一段,那么这样的话我们就直接能够定定位到我们的机子附近,注意这个空格我们要删掉,不然的话找不到,再看一下啊。
能够熟悉啊,再加上我们的这一句指令,删掉空格,然后再加上一个,在一起,复制一下,刚才我们中间少了一段啊,少了两两条指令,那么这样的话我们也能够直接定位到这个412056啊,这个我这条指令。
那么它的下面这里的话就能够找到我们相应的机制,查看各,我想前往地址,那么直接就可以定位到我们的基础布局好的,那么这节课呢我们就就讲到这里,那么剩下的这些机制呢就做一个作业啊,大家下去把它做一下。
这是提取的特征码,那么我们下次也可以,下次游戏更新的时候,也可以用它做一个尝试。
P37:048-动态定位基址技术 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么在前面第47课的时候,我们一起来讨论了怎么快速的定位我们的特征码啊,那么最近的这几步的话,我们来探讨一下怎么自己编写代码来实现这个特征码的定位,那么这样做的话会更加的效率啊。
而且灵活性也更高啊,你可以脱离一个工具啊,那么可能我们写好代码之后的话,短短的几秒钟的时间,他就能够把所有的机制就能够更新好。
那么我们在这里举个例子啊,在这里我也编写了一段代码,编写了一段搜索啊,定位这个揭示了一个函数。
那么首先我们以这个背包的这个机子为例,比如说我们这是背包的一个机制,那么我们要定位的话,我们可以把前面的这一段特征码给它取出来,那么我们取它的特征码的话,就是这里的一定,继续重新,好那么删掉中间的空格。
那么这个这就是一个特征码的字串啊,我们把它作为一个字符串类型的特征码,那么这个特征版最后我们通过函数转换之后呢,它会搜索到啊,这个6619比较等啊,它的起始地址呢这个位置。
那么这个其实位置呢距离我们的机子呢它还有一段距离,让我们数一下有多少个字节的偏移差距啊,30+4嗯,14 14+30 70 89啊,那么一共有19个自己的偏移,总x13 30进制是19。
那么我们就可以加上哈,定位到这个机子之后呢,我们可以来加上它的一个偏移,然后再进行读取,就能够得到相关的机制。
好那么这里的话它的偏移是邀请我们读一下,然后呢这里是是自己,那么最后呢他会把妻子计算出来。
那么这个时候呢我们看一下读出来的句子,对不对,3140f1 f5 c啊,当然我们也可以加一个0x的前缀。
在这里,那么看起来的话啊可能就更直观一些。
啊那么这就是我们说出来的这个相关的一个介质。
那么这样的话定位是非常紧准确的,那么比如说我们要定位的是这个机制的,那么我们就可以了,用提取的这个特征串,再加上它的一个偏移也是可以的,然后我们看一下它的偏移有多少资金,这里是七个字节。
10 16 17,20 21个自己的21个字母的心理,那么我们就把这个特殊方法制一下,然后呢粘贴到这里,那么这里的话就是21,那么我们看一下读出来是多少,那么这个时候呢他也想把这个啊特征码啊。
机子把它读取出来,那么我们也可以读它的一个偏移,比如说对c这个偏移一个字节啊,它的一个偏移,那么在这里的话我们就把解除掉,减掉两个字体就可以了,就是这个学这个地方应该是13000个字节进去。
那么我们也可以在这里加一八,然后然后呢这里就你自己。
那么这里的话它也能够啊相关的偏移也能够读出来啊。
那么所以说这样编程的话是非常方便的,那么接下来呢我们就探讨一下怎样用代码来编写一个这样的函数,那么首先呢我们的这个特征嘛它是字符串类型,但是我们游戏里面存在的数据。
它不是字符串中性,那么首先呢我们要把这些字节数组的数据呢,要转换成这种16进制的字串啊,这样我们才能够统一啊,格式,才能够进行比较,当然我们也可以选择啊这个16进制的字串啊,把它转换成我们这种字符数组。
字节数组的数据类型,然后统一成数据的格式来进行比较都是可以的啊,那么今天呢我们来探讨就探讨,先把这个啊把内存里面的这个数据,把它转换成我们的16进制的字符串啊,统一成这个字串的格式呢。
我们更加的灵活一些,好的,那么我们打开一个工厂,创建一个新的工程。
建一个新的项目,那么我们就叫做更新机子,好的,那么我们就建这样的这样一个工程文件,然后我们点完成,那么完成之后呢,我们在这里建一个,筛选器,然后添加一个c加加的内,就完成,然后我们删掉这个对的一个说明。
我们最终的目的是要把这两个文件文件和源文件,然后我们在这里呢进行我们相关函数的一个说明,字节集团我们的死亡,那么然后呢我们开始编辑我们的程序,那编写这个函数的话,我们也有几个不错的前程。
那么首先呢我们是要把前面的字节数组里面的这些数据转换成逐一的,转换成里面的字节,其字符串,那么要转换的话,我们这里需要一个循环,它一共需要转换多少次,那么这个数组里面有多少个字节的。
这个参数的软件一共能转换多少个字节,那么所以说在这里呢,我们第一个变量i,那么这个i呢它最终的数值小于这个代替的缓冲距,传进来的这个世界需求大小,然后按加加,这是它的下标,那么一碰到他换了多少次了嗯。
而且这个我们要申请的这个缓冲区的大小的话,它要是要是我们这个在前面这个缓冲就大小的两倍才可以,因为最终呢他一个字节啊,比如说我们的前面的他一个数字,那么最终呢它转换成16进制之后呢,会成为这种形式啊。
扭腰的这种形式,所以说他要占两个字节字符,那么在这里呢我们可以借助一个函数来实现,那么这个函数我们首先呢就是前面的这个38分,那么在这里呢我们就是取他i 11米二的这个地址,因为他我们一个这个季节的话。
最后呢他转换之后都会成为这种啊,占两个字节呃,呃这种字符啊一定让我日了这位啊一个数字,所以说我们这里呢我们要乘以二,然后取他的这个地址传进,那么后面呢是一个格式化的一个字串。
那么在这里的话我们要格式化为百分之x,那么呢并且呢它只能占两个位置,那么前面呢我们要用零来填充,如果是不够的话,那么后面呢就是我们的nb dt的每一个字节啊。
i那么这样的话我们理论上呢就能够进行一个相应的一个转换了啊,直到转换完成啊,但是呢这个我们要包含一个相应的一个单元,那么这个它在哪一个图文件里面呢,我们可以看到在sdl这个头文件里面。
当然我们看一下这个参数的一个格式,我们进去看一下,看我们使用的对不对,那么首先呢这是我们要存放啊这个呃相应支出的一个缓冲区,啊这是一个缓冲区的大小,这是缓冲区,然后,这个看着有点复杂,我们再来看一下。
先编译一下,那么这里呢我们要包含windows的途径是这样,在变异性,那么这里它显示的这个格式呢要简单一些,那么首先呢这是我们的缓冲区,然后是要转换到自己的大小,然后后面呢才是一个格式化的一个字串字符。
那么这里呢我们还要加上网通比大小13,因为最后呢他还要是字串的话,它还要在尾部添加一个零啊,那我们再生成一下好的好测试一下这个上去,好好,然后呢在这里呢我们,自己定义一个啊相关的一个缓冲区,下。
那么我们在这里的话是要把数据转换啊,转换出来,转换成这个字串,所以说在这里我们要用数据来提出,好,那么然后呢我们就要用刚才的这个函数,然后是缓冲区的大小,啥意思,然后吃掉,那么这就是它的一个大小。
那么后面呢是我们要存放啊,这个16进制字串的一个大小,还有p,二那么这个缓冲区呢我们也需要定义,那么这个缓冲区呢我们可以把它尽量的更大一点,就好比如说256个字节啊,那么一般特征码的话都不会有这么长。
那么他够用就可以了,那么在这里呢我们也来进行一个初始化,那么完成之后呢,在这里呢我们打印一下我们的这个字串,就看一看,看一下转换的成果,好的我们再编译一下。
那么这里的话它因为呢我们这里传到这个数字比较大的时候呢,它有一个负数啊,就会斩断了,那么在这里呢我们用啊呃无符号的枪啊,还有这一个参数的一个转换,我们这里设设计的时候呢,是一个字节集的一个类型的。
再编译一下,最后呢我们要让它停下来啊,这里呢我们可以包含一个cocs的这个文件,然后呢向它发送了一个控制台的一个指令,暂停暂停在这里。
那么这个时候呢就是我们转换的结果,我们来看一下3355嗯,3355为什么有个二幺啊,这个201的话,因为这个三项呢是十进制的,它的转换为黑进去之后的话就等于二幺了啊,这个四次也是一样哈。
它转换之后呢为2c啊,那么后面这些是16进制的,它就会直接的显示出来啊,就会直接,那么实际上它是正确的啊。
这个转换的这个字串,好了,那么这样呢我们的这个函数呢就完成了就完成,那么实际上是很简单的啊,好那么我们下节课呢呃接着写呃下面的函数,那么在这里呢也给大家留一个坐垫。
那么这个作业的话就是呢我们进行这个16进制的字串的一个比较,当下节课可能我们也要讲啊,就是这种16进制计算的啊一个比较啊,自己编写一个比较的函数啊,那么当然呢嗯这里来传播一个木质就可以。
那么如果相等的话,就返回一个大于零的一个值,那么如果这两个字算不相等了,那么我们就嗯就返回一个名字,那么这个作为一个作业啊,大家自己编程把它实现一下。
好的。
P38:049-动态定位技术-HexStrCmp - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么在第48课的时候,我们有一个坐垫,那么也就是要实现我们16进制字串的啊一个比较呃,当然这个实际上我们用字符串比较的这个函数呢也是可以的啊,但是这里呢我们自己写啊,自己写的。
为了方便后面呢我们实现了一个模糊的一个搜索啊,那么一个比如说我们有通配符的情况下,那么这里呢我们是一个任意的字符啊,那么我们这种情况呢我们需要自己编写一个函数来实现的话,才能够实现这种模糊的一个比较。
那么有了这个模糊比较之后呢,我们才有一个呃,才有一个这种模糊的这种搜索啊,那么这样的话我们定位特征码的时候更加的灵活好的,那么我们打开第48课的代码。
那么我们添加一个啊16进制啊字串比较的函数,那么这作比较呢,我们首先呢要获得这个相应字串的一个呃长度,那么然后呢方便进行一个循环,那么这个长度的话,我们可以直接用啊字串相关的字串处理函数来进行一个处理。
就是调整,然后呢我们取得这个16进制字串啊b的一个长度,那么然后呢我们再进行一下比较,两个字串的长度呢我们要相等,那么在这里呢我们也给他做一个提示,那么如果这两个长度不相等的话,我们进行一个提示。
或者是进行一个其他的一个处理,那么我们也可以这样的处理,如果呃字符串一的长度比字符串二的长度呢要稍微大一点的话,我们就取这个长度比较小的这个进行一下复制,就两个字串了,我们学这个计算长度比较小的。
然后进行一下定位啊,进行一个比较,那么也是可以的,那么这个呢可以自己控制一下就可以,然后我们接下来就开始一个循环,i不至于有你的牌小于等于我们的这个字串的一个长度,然后,唉加强。
然后每一个我们把它的每一个字节都取出来,进行一个比较就可以了,一,那么如果它相应的字节都相等的话啊,那么我们就继续就继续,那么如果他故乡等待,那么不相等的话,我们这里可以不用20,那么直接。
如果只要能够执行到这个后面的话,就证明它是不相等的,那么不相等的话,我们就返回flash,那么如果整个循环都执行完了之后都是相等的,那么我们这里返回处理啊,就是表示相等,然后我们进行一下编译。
那么这个函数实际上呢它相对的呃很简单啊很简单,然后我们做一个相关的一个测试,那么这里呢我们呃自己定义两个只是算法,那我们把它复制一下,再另外进行一个字串二,啊然后呢,进行一个比较,知道。
那么如果相等的话,在里面打印一个调试信息啊,打印出一段信息啊,显示了相等,二,啊,好的,那我们来看一下,那么这个时候呢它能够判断两个是相等的,那么如果我们中间做一个改动来看一下。
啊那么当然不相等的时候呢,我们应该打印出另外一半调试信息。
啊这个时候呢它会判断两个字串不相等,但是有另外的一种情况哈,有哪一种情况呢,那么上面是大写,下下面是小写的这种情况啊,那么这种情况的话,本来它应该是相等的这两个。
但是呢他这个时候呢呃我们判断他的判断的话,它确实不相等啊,因为它是字串的一个比较。
那么所以说这个大写和小写的话,我们嗯在处理我们字串的时候呢,在前面的这个转换的时候,我们统一的跟他做一个要求,当然转移的这里呢它是本来我们这里进行转换的时候,是转换成大写的。
但是我们在呃输入特征码的时候,有可能会输入小写啊,所以说我们在另外编写一个函数啊,另外编写这个函数呢,就是说呃如果呃如果这个函数它是小写的话,那么我们就跟它自动的啊,把它变成大型啊等等,嗯。
然后我们把它写简单一点图,那么我们就是小写的转换成大写的这样一个写这样一个函数,那么转换的时候呢,我们先转换逐字节的进行一个转换恰然后呢后面进行转换,那么如果如果c是小写小写字母。
那么我们呢则返回大写字母,那么这里我们做一个判断,那么我们进行一下保存,那么这个函数的话,我们呢那么哪些是小写字母嗯,哪些是小写字母呢,就是我们的a直到我们的z,那么这些是小写字母。
那么小写字母要转换换成大写的话,实际上呢这个大写的a我小写的a呢,它之间有一个差值,那么我们只需要加上它中间那个差值就可以,那么我们看一下我们代码怎么编写啊。
那么这里我们可以加上一个判断c那么大于等于我们的a,并且c小于等于z,那么说明的话它是一个小写的字母,在这个区间,那么是小写的字母的话,我们就要进行一个转换,转换成大写字母,那么我们通过那个x码码。
它的一个码表的话啊,那么它有一个相关的一个数字,那么转换的话,我们c呢就可以等于c加上这个大写的a减掉,我们小写a就这一个差值,因为它每一个数值的差值都是一样的,比如说我们嗯ada解决掉我们。
那么它也等于了我们的,b减掉我们啊小写的b他们在这个差值都是相等的,所以说呢在这里呢它加上啊后面的这个差值,就能够把小写的字母转换成一个大小哈,就能够转换成一个大小嗯,然后呢我们返回这个数值就可以了。
当然在这里的话,我们可以直接的这样一看,就可以返回这个数值就行,返回这个c加上这个a减,减掉这个小写而已,那么如果他不不,不属于啊,不属于我们的这种小写的这种情况呢。
那么我们就直接就返回这个数字就可以了,直接好,那么这样的话如果我们是小写的话,我们就能够来进行一个相应的转换,那么我们也来进行一下相应的测试,八,那么我们比如说把它注意这里是单引号啊。
那么我们在这里呢对它进行一个转换,好然后我们再打印这个字,然后我们运行一下啊。
那么我们可以看到啊,这个时候呢它从一个小写的a就转换成一个大型的a代码,那么这里我们可以是任意的字母都是可以的,比如说h它也能够转换成这个大型,它也能够进行一个大小写的一种转换为b c d。
好那么在这样的一个转换,那么进行这样的一个转换之后呢,我们也可以,当然这只是一个字母的一个转换,当然我们还可以把这个函数来写一下啊,写成一个什么呢,我们呃整个字串的一个转换,那么我们在另外再写一个函数。
那么就是我们呢嗯带有小写字母的啊,全部来转换成这个大写,知道,那么这个是一个输入的一个数据,最后呢输出来啊,也从这里输出啊,所以说这里的话它是一个优势,这个参数它是一个双向的啊,作为一个输入的一个参数。
也是一个输出的,最后呢还将对这个字串呢进行一个修改,那么后面的是这个字串的一个大小的目录,我们也需要好嗯,大小的话我们也可以用一个呃strong then啊,来取得这个字串的大小就可以好。
那么我们就在cpp单元那里进行一个相应的实现,啊,那么在这里呢,首先我们也要取得一个字串的长度,那么取得计算长度之后呢,我们也需要来进行一个循环来判断,那么首先呢我们要判断它是否是这个小写字母。
或者是我们每一个字节呢,我们都能调用一下这个函数啊,那么我们可以这样写,复制为零,i小于等于d li加价,那么然后呢我们对这个数组来进行一个操作,数组按那么就等于我们的前面的no two case。
那么全部呢我们都进行一个转换,在我们前面的这个函数就可以了,那么逐字写的我们全部都进行一个相应的转换,那么就那最后就完成了,他,然后呢我们再来编译一下,编译成功之后呢,我们再来做一个相应的测试。
那么在这里呢我们也定一个哈字串的一个缓冲区,然后呢我们进行一个相应的转换,然后呢再进行一个输出,嗯,好再来看一下。
那么这个时候呢我们发现了里边它就不存在这个小写字母。
然后我们进行一下比较好,第四个字母啊,以前是小写的啊,现在变成大写了,那么最后一个字母d9 f啊。
也全部变成了我们的这个大型,但是如果我们没有这个这一句转换的话,他肯定就是小写,好的,那么这节课呢我们就编写这两个函数。
那么我们下一节课呢,嗯下节课我们再进行如下函数的一个编写。
在读取相关的一个数据,那我们看一下啊,我们已经呃基本上的函数我们都已经有了字串的比较呃,还有我们自创的一个转换,转换了之后呢,我们就能够进行一个比较了,那么在下一节课的时候呢。
我们就进行一个游戏数据的一个读取,然后再进行一些逻辑的啊一些整理好的。
P39:050-动态定位技术-ScanFeatureCode - 教到你会 - BV1DS4y1n7qF
大家好,我是刘基贤老师,那么前面结课的时候。
我们已经为这个动态定位啊,在这个函数呢嗯编写了一些相关的函数,那么今天呢我们一起来嗯写这个主函数啊,搜索特征码头,那么我们打开第49课的代码。
那么展开我们的机子定位这个目录,首先我们把这个函数的说明给它添加进去,那么这个函数呢首先我们要需要一个游戏窗口的进程距比,那么第二个呢是我们的特征码啊,字符串特征码的字符串16进制的。
那么第四个参数呢是我们要在进程里面哈开始搜索的一个地址,那么最后一个呢是结束的这个地址,这个就相当于我们c一里面的这个起始或结束啊,未成扫描选项就相当于这这两个选择选项,而我们的。
比如我们的特征码就相当于是呃这个字节数组啊,这里面,好的,那么我们自己来写一下相关的这个函数,那么转到我们的cp p单元,移到最后。
嘟嘟嘟嘟嘟。
那么首先呢我们要做的工作呢是把我们的特征码转换成大写,那么如果最后都没有找到这个字串呢,我们就返回空,那么这是我们的特征码字串,那么关于这个16进制的嗯字串转换为我们的大写的这个函数呢。
我们之前已经写过了,并做了相关的测试,那么我们直接拿出来用就可以,那么经过这个转换之后呢,接下来我们就读取我们的游戏里面的数据啊,那么读取的话我们也要循环的一个读取,那么从这个开始地址到结束地址吧。
然后我们全部的数据啊都要读取,但是我们也不可能说一次性的所有都读出来啊,这样比较耗内存,那么所以说我们把它分解,它进行分页的读取,那么这个每一页的话,我们读起来1k b卡,也就是1024字节。
那么这个大小呢也可以是其他的整数啊,那么我建议的话是这个1024的倍数啊,因为这样很方便技术啊,1024kb的话就是1024字节的话就是一kb,刚好每次读一kb的大小,那么但是呢我们需要循环的图啊。
那么循环的读读读出来之后呢,每次读取的这个大小的话,也要嗯至少也要读这个102424这么多大小,那么这个用来存放这个数据的缓冲区肯定要大于这个1024自己,那么至少我们还要加上这个特征,马的一个长度啊。
这样方便我们比较啊,这样我们才能够所有的内存呢都能够搜索到,不然的话我们直接是1024,这样读取的话,那么有一部分呢我们将搜索不到,那么在这里我们建立一个相应的缓冲区,能进义为bat类型。
那么它的一个大小呢,我们在这里呢把它定义成一个指针,定义成指针的目的呢,我们是为了方便呢嗯分配这个内存空间的大小,这样我们可以用六指针代表来额分配它的一个大小,那么它就等于page size。
加上我们的字串的一个长度,那么之前我们还需要把这个字串的长度跟它计算出来,那么这个字串长度呢等于我们传进来的特征码的这个长度,但是我们特征码的长度的话,它本身是嗯是否串类型的。
那么比如说我们0x a f那么这个呢它实际上的话字串的话,a f这两个字串的话,它是占了两次几,但如果是实用性质的话,实际上它只占一字节,那么所以说在这里的话,他这我们要取得的长度的话。
这里呢实际上实际上除二才是他真正的一个长度,那么所以说在这里的话,我们再加上嗯等等,那么它除以二,再加上一个,再加上一,最后呢还有一个字串的一个结束,我们要给它加上,尾部要加一个零。
这里加一或加二都是可以的啊,那我们设大一点,那么这个是每次我们要读取的一个缓冲与大小,3号,但是我们一共要把这个开始的到结束的地址来一嗯嗯痛,要读完的话,一般来这里我们可以从零满32位的话。
其实地址来可以是零,这里是可以是0x7 fm 1034号,这样我们可以给它规定一个起始大小,那么如果是我们这个游戏为例的话,我们来看一下它的模块机制的一个大小,那么在这里的话。
它是从0x40100 开始它的机制,那么我们在模块里面可以看到它的机子,那么机子的话是004,后面五个零,那么所以说我们在这里的话,我们也可以看到取名为004。1234。
那么这样来跟他复出值也是可以的啊,因为我们要查找的本身就是从这个地址开始,那么接下来的话我们需要循环的读取来,那么在这里我们给它用一个建一个相关的变量,用一个for循环来读取,那么当前的地址来。
我从起始地址开始看,第四大的也就是传进来的这个400开始,那么这个最终的地址的话,它是要小于,小于我们的n d n的,但是我们还有这里呢它有一个字串的一个长度,字串的一个长度。
那么所以说我们要还要减掉这个特征码的一个长度,五点n put除二,因为是字串类型的,我们这里的话是字节啊类型的数据,那么每次呢他还要加上一串数字,那么下一次的时候的话,他就要进行一个向后推移。
这个地址不足以能够停止,加上排气size,那么这就是我们下一次要读取的一个啊机制,那么每次来每一次循环的话,它就增加了女儿是自己,然后我们读取的时候,我们用追的process慢慢追。
第一个是游戏窗口的句柄,第二个是起始地址,那么起始地址呢我们就是当前地址,那么我们要读取的缓冲区大小就是这个数值的尺寸,那么每次他要读取的大小呢,我们就是32。
那么这里好像用这个size of好像是不可以的啊,对对对,那么这里我们每次要读取的大小的话,就是这个排气赛季,再加上打法,那么就是这一段实际上我们要每次要读取的一个大小,实际上也是这个缓冲区大小。
但是这种我们分配的这种而动态分配的指针呢,我们用set of的话,好像它是不能够取出它的一个取值的,所以说在这里呢我们直接嗯要加上它,那么我们就直接把这个字串儿加镜头,那么后嗯嗯嗯嗯。
后面呢是我们每一次把它读取的一个实际的一个大小,那么我们在前面再建一个变量,目前,那么这个呢我们给它进行一个相关的初始化,在这里我们传它的地址程序就行了,这是我们实际所需的大小。
那么这样的话我们每次的话就读了一片内存区区域出来啊,那么读取出来之后呢,沉到了这个缓冲区,那么接下来的话我们就要对这个缓冲区来进行逐一自己的一个比较,逐字节的比较好数据啊,数据我们比较的话。
那么主世界的比较的话,我们也要用一个for循环来比较,那么我们用一个下标i来表示i赋值为零,那么从呃首字节第一次节开始比较,那么i的值来,最终呢它要小于我们的这个配置size。
要小于我们的page size,那么而且的话我们在比较的时候呢,嗯i加加,然后每一次的时候呢,我们要给它建一个临时的字串,用来转换成16进制的字符串,然后采取我们的特征码呀,它的类型才相同。
我们才能够进行一个比较,那么在这里呢我们再进行一个,恰,三,退,等等,那么这个呢我们就给他建建一个固定的大小256自己,那么这里呢我们给它做一个值,给空空的一个字串啊,铺一个初值。
那么然后呢我们对这个呃对这个缓冲区来进行一个初始化,并且转换特征码长度的一个字串,那么这里呢我们要用到同文件里面的一个函数啊,之前我们编编写bt图啊,这个bt的数据呢我们把它转换为16进制的字串。
那么首先呢我们是要转换的这个缓冲区,那么缓冲区的话就是我们之前读取的这个nb date 8分,那么这里呢因为要循环,那么第一次的话我们就是下标零,然后呢每次从1234这样循环啊,那,么第二个参数。
就是它的一个大小,那么它的大小的话就是我们的前面的这个ending line啊,除二就是它的一个大小,那么最后一个呢是它的缓冲区,用来存存放这个字符串的这啊。
然后我们就是特征码比我们的这个参考能够比较好比较之后,那么如果这个数值呢它等于处理啊,那么我们就返回,或者说这个数值它不等于,那么呢我们这里呢就返回,地址嗯。
但是这个地址呢我用我们要把它计算出来才可以进行一个访问,那我们来再来看一下我们的逻辑啊,这里呢我们转换成16进制,然后呢就可以进行一个相关的一个比较,那么比较之后的话,当前的地址又该返回多少。
那么当前的地址就是我们的啊,应该是我们当前的这个当前地址,嗯嗯嗯嗯,再加上一个我们这里呢i的这个下标,那么最终呢是我们搜索到的这个地址,那么这就是我们要返回的地址。
那么如果整个循环循环完了都没有搜索到的话,我们就应该返回一个空子啊,那么我们再编译一下,那我们再来再一次来看一下我们的逻辑,看起来没有问题,但是我们来测试一下哈,如果有问题的话,我们就能够体现出来。
那么之前的这一段呢我们都可以删掉了,或者先注释掉,那么现在我们要测测试的这个函数呢,就是搜索相关的这个他怎么,那么搜索特征码的话,首先呢我们要取得游戏的句柄。
八那么呢然后我们要取得这个游戏的罪名或标题名。
那么这个我们打开之前的46氪领域呢。
这里面有相关的信息,把这两句啊进行一下复制。
如果找到了这个窗口去,比如果这个窗口去评,找到的是等于零的话,那么我们就打印相关的一个一段信息,好那么如果我们这的这个窗口区别找到了,那么我们先获取进程的i d,那么这个p i d获取到之后呢。
我们再再获取这个进程的句柄,那么这个进进程的句柄呢,实际上我们只需要有一个读取曲线就可以,然后呢这里呢是我们的p i d啊,进程i d环境,那么这里呢我们再做一个判断,那么如果进程句柄给你个空的话。
那么我们也打印出相关的信息,啵啵,好然后呢我们如果这里的进程成功打开了之后呢,我们就接下来就可以调用我们的特征码搜索,但是呢我们要之前呢我们要定义一段啊相关的一个特征码。
然后呢我们看一下前面的背包和相关的一个特征码,那么比如说我们就用它稳定来搜索一下,那么如果是搜索到的话,就应该是这个六六啊,19d1 ,啊这这是在我们游戏未更新的情况下。
那么应该是如果是游戏更新的,也应该是在这个地址周围,那么特征码我们先进行复制,那么复制之后呢,我们再进行一个搜索,第一个我们的游戏的进程句柄,第二个我们的特征码,那么第三个呢是起始地址。
后面的这两个我们可以不管,然后呢我们打印出法需要用一个变量来接收它的返回值,然后我们把这个找到的地址来打印出来,好的,那么我们让它跑起来,那么这个时候呢他会说不能够接受两个参数,那么我们再看一下头文件。
那么我们把这里呢进行一个初始号,那我把函数里面的这个初始化呢,我们就需要关掉,不然的话编译的时候它一定不错。
好那么我们让它跑起来。
那么这个时候呢可能是反应很慢哈,这里呢在不断的在循环再找啊,最后呢呃找了很长的时间呢,最后才定位到了6619b1 ,那么这种算法的话啊,嗯应该是有问题的啊。
要进行一定的优化,那么一般我们自己写的代码的话应该是比较优化的,那么唯一出问题的话就是在我们的这个字字串转换这里,它转换的效率呢可能不是很高,那么可能是我们嗯这个bt的图啊。
就是字节节类型的转换成我们16进制,那么下一节课呢我们自己来写一个啊相关的函数来提高它的速度,替代我们的这个格式化字串,那么应该呢它就比较快,那么还有一种方法呢它也可以提高,那么我们在这里的时候呢。
我们主动的传入我们这个,这个代码的起始地地址我们给他传给他,比如说我们就传嗯,6616348传这个地址进去的话,他搜索的肯定就要快一些了,因为它离它比较近,然后我们可以尝试一下,把这个地址进去。
然后再开始搜索。
那么这样的话他也能够很快的搜索到达。
那么我们再换一个地址再进行一下测试,看能不能够找到,那么如果我们是收啊,是这个地址呢,把b开头的,那么我们看看能不能找到。
啊它也能够搜索到这个地址,这个时候那么也就是我们的6619以及,那么这个时候的话,我们也可以编写相应的代码,把这个嗯机子呢把它读出来啊,要读出这个机子的话,我们需要加上二幺的偏移。
然后再读四字节出来就可以了,那么我们也可以把它读出来,那么这个时候啊,这个机子呢就要加上对焦的这个偏移,然后呢我们需要用,repos设置版本里面再读一次,那么其实这几,那么要读取的缓冲区的话。
我们也选这个地址,或者是另外写个也可以录取数据的话,我们另外定义一个变量,用来读取它的一个一debus,好最后我们这里来读四字节啊,一次性,最后这个呢我们就可以不要了,使劲读取了多少字节了,我们不关心。
那我们再运行一下。
那么这个时候呢我们就可以把我们的相关的机制,这个f598 b0 就可以读出来了。
好的,那么这节课呢我们就就到这里嗯。
那么这里这节课呢也给大家留一个作业,那么这个作业呢就是我们之前说的要优化啊。
优化这个速度啊,那么提升这个速度速度,那么因为我们自己编写的代码的话,肯定呢它都相对要精简一些,那么我们就要少像这种情况的话,我们未来要提高一个效率的话,我们要少调用这个相关的一些函数。
那么尽量在这个循环里边的话,要少调用相关的这个函数,那么比如说我们在这循环里面,如果调用到point tf比较多的话,他应当也比较慢,那么在这里的话,最有可能出问题的就是啊,就是这个地方。
当然这个我们需要下一节课啊,测试的时候才知道啊,那么现在呢我们就需要自己来,大家就尝试一下自己编写一个函数来替换这一段代码的一个功能,好的。