郁金香游戏辅助教程笔记(八)
P4:015-DbgPrintMine与变参函数 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,qq 1533057,欢迎大家参加郁金香技术编程和距离,那么这节课呢我们一起来写一个debug啊,矿井m用这个函数来来替代我们的alt固体debug尺寸。
因为这个alt库体debug尺寸呢它使用起来的时候很不方便,因为它不不能够打印一些变量的一些信息啊,变量的一些信息啊,我们要另外写一个函数,这个函数呢它就像我们以前c语言用的这个pointf啊一样啊。
使用起来很方便,可以打印一些字串的变量啊,而且它的参数的个数的话是可以变化的啊,嗯可以是一个参数,也可以是两个参数或者是多个啊,使用起来非常的方便,那么在这之前呢,我们首先来认识一下啊。
支持啊可变参数的一个函数。
那么我们打开vs 2010,那么先新建一个项目,啊,嗯,控制台的方便,我们测试,那么我们都用过这个point of,它用起来的话非常的方便啊,后面的参数前面是一个格式化的字串啊。
这里啊后面呢真的是我们的这个参数,那么这个参数的个数的话,它是可以变化的啊,也支持我们的字符串啊,支持我们的变量或者常量这一类的,那么这样使用起来的话非常的方便,但是我们的ult put体啊。
第八个尺寸的它就不支持我们这种格式化的这种字串,它只有一个参数,如果我们这样使用的话啊,编辑肯定就是通不过的,当然它也需要一个windows图文件的一个字体,那么这样编译的话我们就会出错。
因为呢它只支持一个字串啊,不支持格式化字串和一个啊这个便餐可变的这个参数,所以说这个alt啊库里第八个尺寸呢,它使用起来很方便,那么在这节课呢我们将做一些改进啊,做一些改进,我知道。
那么首先呢我们在这里加一个盖下,方便我们也会有一个测试,那么我们首先来认识一下哈这个变量啊,那个参数啊,个数可以变化的,这个函数啊,也叫做变参的函数,那么首先我们定一个编程的函数来做一下测试。
就叫做第八个问题,那么首先呢我们第一个呢也是一个呃我视化自创,那么后面呢变成的话它是用三个点来表示,就表示后面的这个呃参数来,可以可以是很多,可以是一个两个,也可以是多个啊,这样我们可以编译一下。
那么电餐呢它的参数的获取到一个办法呢,它需要用到一些啊红啊,除了历史题,首先要定义一个用来接收我们这个参数的一个数组,627miss,那么获取这个数组之后呢。
我们要用一个vs大体来来初始化它对start,然后第二个参数呢啊它是就是我们的这个传进来的,第一个参数指向电,这样是一个呃参数列表,一个初始化,啊然后使用完了之后呢。
我们要用一个vn等来做一些亲密的一个工作,第一个参数是这个参数列表,那么在这中间我们要取它的参数的时候啊,一般我们可以这样去,比如说啊,那么第一个参数如果我们是已知的话啊,第一个参数。
那么我们可以用5月a r g来获取它的第一个参数,后面跟的是我们的参数类别,第二个呢在这个t代表的是参数类型比较硬的,那么如果我们知道第二个参数接他也是正常的,那么我们后面呢也可以这样写。
那么如果第三个参数它是一个字串类型,那么我们可以这样写,好好,那我们可以这样写啊,这样的一共有三个参数啊,三个参数,那么做一下一个测试ptf来打印出这三个参数,你可以搜到计算。
然后后面跟i7 s这三个参数,那么我们来做一下测试,把前面的这个point tp来删掉,要用我们的debug point man,当然第一个字出来,这个时候我们先合约掉啊,因为这次始终不上。
那么后面啊就是我们的几个参数,比如说我们输入111222啊,这里打输入a b c x,然后我们做一下测试。
啊这个时候呢我们这几个参数呢啊它执行到这个函数里面。
最终呢通过ptf呢把我们这几个参数来打印出来了啊,打印出来当然有过多的参数来。
这个时候呢它同样的也可以支持,比如说我们再加上几个参数,当然这几个参数呢它这里呢并没有打印出来而已,然后这样编译编译的话,它是能够通过的,那如果我们知道了,也可以把它取出来。
那么我们再加上一个音体j n k c v r标题意思,那么这里呢我们还可以支持更多的。
但最后一个这里这个呢我们还没有打印它。
但实际上这样使用起来呢也不是很方便,写起来也相当的复杂,当然这个我们经过一次这个vai激活了这个指针呢,它自动的会指向下一个参数啊,所以说你看到我们这里是写出一样的,这里也是一样的。
为什么他取得的数字不一样,因为这个指针啊它改变了,那么这一句执行完了之后呢,他把这个值取出来啊,把第六个参数取出来,复制给这个i,那么它自动的这个指针呢实际上已经知道啊,地理三个参数的位置。
那么到这里呢取出了第三个,参数啊,然后呢它只是在业余会自家啊,又指向下一个参数啊这种,那么还有一种更简单的方法呢,我们可以这样去把这些呢全部注释掉,注释掉,那么我们另外有一个这个函数vs。
那么这个函数的话,它直接就支持这个参数列表,无论有多少个啊,他自己取出来,但是呢他需要一个字符串的一个缓冲区啊,那我们先另外的定义一个字符串的缓冲区,那么这个呢尽量定义大于,那么这是它的第一个参数。
那么第二个参数呢就是这个石化字串,那么这里我们传进来的啊,这个参数好的,就是我们的格式化制造,那么后边呢就是我们的参数列表,那么直接传进去就行了,那么无论这里是两个参数还是三个还是四个,直接就传给它。
让它来进行一个格式化,那么最后这里的话我们也比较简单了啊,这就我们要替换掉,直接用ptf啊,然后38分就行,直接就打印出这个缓冲区就行,当然这里的话啊,因为我们这里的格式化字字算没有了。
所以说在这里传进来的时候呢,这里是我看是空哈,所以说在这里呢我们要进行修改他们点啊,把这s问题,那么这样的话我们直接就支持五个参数或者是任意个数的参数,我们都可以打印出来。
这个时候我们可以看到,那么你这个时候呢我们打印一个变量也可以。
那么我们换一行,那我们把后面的删除掉,哈哈哈哈哈哈哈哈,给他换一个行,这里做一个换行的处理,那我们再次打印。
好那么到现在的话我们这个已经成功了一半了。
那么接下来呢我们就可以用我们因为我们的奥体附体第八个尺寸呢,这个调色字串呃啊打印函数呢它也是支持一个啊一个变量啊,一个字符串,那么在这里呢我们就可以直接用这个,那么我们在测试把这一行呢注释掉。
当然这个aut哈debug时出门,autifully debug时出门。
他输入的啊这个信息呢就不会显示在这个窗口里。
它会显示在这里啊,如果我们是单独运行的时候呢,它会显示在这个地方,会显示在这里,那么你也可以单独的运行一下啊,因为在现在它是调试啊。
调试运行的,调试运行的呢,它本身有这个调试器呢,它本身会载货啊,这个函数说啊,所打印的一个字串,那么我们找到啊它生存的地方。
单独的运行性,那么单独的运行的话,它就会显示在我们的工具上来,那么我们的目的了哈。
基本上就达到了,那么为什么我们说的基本上都达到了,因为很多时候呢我们其他的程序也会产生很多的调试信息,那么在这里呢我们经常要用到这个啊过滤器啊,比如说我们用啊之前用到这个gai前去开头了。
那么如果我们加上了这个前缀,那么在这里的话,他执行的时候,我们同样啊拦截不到,因为这里呢他没有加上这个前缀。
这里呢它同样的会显示出来。
所以说我们为了方便啊,与其他其他这个软件之间的一个调试信息的一个混淆啊,所以说在这里呢我们也为这个字符串呢加上一个前缀,那么,在这里呢我们再定义另外一个这个网上去,什么,那么这里呢我们多多上八自己呢。
就是因为后边的这个这个加上一个更得一个前缀啊,游戏的一个前缀,好那么加上之后呢,我们在打印之前,我们要把这里所获得的啊这个格式化字串,人要追加到这个字符串的后边。
这个时候呢我们可以用也是用一个函数来进行,那是tr cut嘛,嗯然后呢第一个参数当然就是我们的这个for mart game。
第六个参数呢就是这个我们前面获得了这个啊策划自创这里获得,然后呢最终呢我们打印的是这个红毛,红毛才更啊,然后我们再来运行,啊这里我们它就有一个这个根本的一个前缀了啊。
这是啥,那么这个时候在第八个里面的,那么我们再次运行的时候。
单独运行的时候,这里它就能够整合到这个载荷到了,因为我们这里呢它设置了一个过滤器的啊,必须要有这个前缀的呢,它才会显示在这里,那么这样呢我们输出来的信息呢就比较干净,那么其他软件他输出的这个调试信息啊。
因为没有这个根的这个前缀呢,他就不会在这里显示出来,那么这样的话我们自己的一个啊支持格式化支撑的一个第八个pointing啊,fly基本上我们就写好了。
那么以后我们再呃打印我们的这个变量的一些信息啊什么什么的,就比较方便的,那我们再做一下测试,哈哈哈哈。
啊这里呢就是我们的调试信息啊,那么我们在这里运行的时候,调试信息呢它都会被拦截在这里,不会显示在我们这个地方,会显示在这个地方,好那么还有最后一点,那么就是我们一般在debug啊,这个模式下呢。
我们才需要用到,才需要打印这个调试信息,那么一旦到我们啊正式发布那个release这个版本的时候,你就不需要这个调试信息了啊,但是我们又不想去改动这个代码啊,当然一种笨的办法呢。
就是我们在发布一个历史版本的时候呢,我们把这里的代码删掉,那么实际上用不着这么麻烦,那么我们可以加上一条幅啊,啊可以加上这一条红,那么我们看一下这个debug啊,是不是这啊,这个是不是被定义了。
那么如果被定义了,我们在下面的这一段了才执行自信,那么也就是说它这个呢是判断在这个第八个版本下面,来,在后面的人才会被编译被执行,如果说这个release项目,它就不会被执行了啊。
那么如果在写这个下面呢,它这里它就是一个空函数的,这里呢他也不会说出我们的调试信息,那么如果我们切换切换到切换到第八个这个版本下面来。
唉,生成之后呢,它就会输出我们的这个调试信息,调试信息啊,所以说这一条红的话也是非常有用的啊,非常有用的,而且我们在编写这个我们的游戏辅助的时候,如果啊你给别人用的是这个八本的这个版本的话。
别人啊很方便的来内向的一个代理,就是通过这些调试的这个函数啊,你以及相关的一个字出来,它就很容易把你的功能呢给立项出来,所以说的话我们最好的给别人用的话是发布的这个有意思的这个版本。
那么这后面的这些代码呢它就没有了,那么这里调用的这个函数呢也是一个空函数,什么都不做啊,相当于好的,那么既然我们的这个函数写好了之后呢,我们就把这个相应的这个函数来把它复制一下哈。
呃一直到啊我们的第十次课的代码里面。
那么打开我们十次课的代码。
那么我们就添加到这个结构啊,交流xp p里面添加到它的一个头部,那么添加到头部之后呢,然后我们再把这个套出一下啊,在这个结构的头部,这样套出一下,套出之后呢,以后啊,各个单元的人都可以使用。
那么重新申请一下,那么这个时候呢它会报一下这个这个单元呢不能够用啊,因为这个函数的话啊,vs qut呢它需要另外的一个同建的一个支持,那我们加上一个相应的一个条件的一个知识,就是tt,或者提前。
那就等于,那么这个时候呢我们就真正成功了,那么以后呢我们就可以用我们自己的这个呃,这个函数来打印我们的调试信息的话,比这个out debug是村民就要方便啊,就要方便许多好的,那么我们下一节课再见啊。
P40:051-动态定位技术代码优化-扫描提速 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么上一节课我们编写了嗯搜索特征码的这个函数,但是我们在测试的时候呢,我们发现了搜索的这个定位的速度特别的慢啊,占用cpu资源非常的高,那么在这节课呢我们做一些优化处理啊。
进行一个相关的提速,那么打开第50课的代码。
那么经过我们的这个测试发现呢,嗯我们所编写的代码的话,大部分代码都是自己所写的,那在循环里边的话,我们反复的要用一个啊,也就是嗯这个字节的数组转换成16进制啊,那么也就是这个函数反复的在调用。
那么这一个函数的话都是我们纯手工写的哈,里面的话应该是没有任何问题的,那么在这之前循环的外面这一层的话,也就是这个it to嗯,h e x s t2 哈字节集转成16进制的字串。
那么循环里面呢就含有这个函数,那么可能会存在一个速度的问题,那么在这里呢调用了一个格式化,这,不串也没法信啊,那么我们这节课呢就尝试一下自己写一个函数来替换,替换掉这个s p r i n g f。
那么当然我们在替换的同时呢,它的这个功能呢我们不能够变,那么也就是说我们自己要把后面的这个字节的数据,转换成16进制的字符串的一个形式,那么在这里呢我们写一个新的函数,那么在书写之前呢。
我们要做一下分析,首先比如说我们这个用c来表示后面的这一个字符啊,那么这个c这个字符的话,比如说它是二五,我们要转换成16进制的f f的话,那么我们应该怎么转换呢,那么这个时候呢我们第一位可以用呢。
还有公主,那么取它的余数取多少呢,取整除16之后的余数啊,那么这个时候呢那我们可以算一下,用计算器,255÷16,那么这个时候呢它等于一五,那么一五在乘以一六呢,240,也就是说250255。
他它的余数的话也就是多少呢,也就是幺五啊,那么这个幺五的话也就是我们个位上的这个f啊,那么我们的这个高位上的f呢,它实际上也就是我们整除的这个结果,也就是我,们先清一下名字,那么这个25255÷16。
那么这个时候呢它本身呢等于幺五啊,那么也就是说他这个低位等于幺五,高位高位也等于腰部呢有两个腰部来组成的这个,那么这个需要我们自己的转换呢,把它拆分成分成,分成两部分,那么另外一种情况下。
比如说这个幺零,那么这个幺零它如果是,来取余数的话,那么除以幺六的话本身就等于幺零,那么它的高位的话等于零,那么最终呢这结果就是0a啊,这个a呢来表示的十进制的压力。
那么这个呢是f那么比如说我们再换一个形式,比如说啊330这个数值时间最短,它要转化成我们的16进制的话就是360,首先我们取它的低位除以16,那么这个时候的低位等于14,高位呢等于一啊。
因为整除之后呢等于一,那么加起来呢腰四呢是d啊,那么最终的结果呢你就是1d啊,应该是一四,应该是1g1 e才对啊,这样的啊啊那么我们知道了大致的原理的话,那么我们就可以开始写我们的这个代码。
把这个函数的说明复制一下,那么我们就在它的前面呢进行一个相应的代码代码书写,那么首先传进来之后呢,我们就需要来取他的这个呃,低位和高位,那么这里我们建两个变量,用来专门存放它的低位和这个高位,哈哈哈。
那么第一位的话我们用l来表示no,那么低位呢我们先复制为零坏的,然后高位,那么也复制为零,那么我们这次先来进行一个初始化,那么接着呢我们再对它进行一个复制。
那么第一位的话我们就等于它的一个呃取模等于一个余数c啊,这个取余数,然后呢幺六因为它是16进制的,这里是它的一个进制,16进制,然后高位呢就直接就等于我们的c除以幺六啊,那么这样我们就取得了高位。
那么去直接问,那么这两部分我们组合起来就是我们的呃,就是我们的16进制了,那么我们要来怎么来组合它呢,现在我们得到的是一个什么呢,呃这高位肯定也是一个0~15的一个数据。
那么低位和高未来都是0~15的一个数据,所以说我们就要对它进行一个转换,那么我们要把这个数值来转换成为字符,那么这个时候呢我们要加一个判断,那么首先呢我们来进行低位的一个进行高位的一个处理啊。
应该是先进行比海,那么如果这个呢它大于嗯我们有一个范围啊,首先我们有一个嗯,如果这个数值它大于等于九的话,大于九的时候我们应该怎么处理,那么小于九的时候,我们有一个处理,它是一个两方面的一个处理。
因为大于九之后的话,我们就要用什么来表示呢,要用a b,c第1f要用这几个字母来表示,那么如果是太小,那么如果不是大于九的话,那么肯定就是小于九啊,那么它就只有这两种情况啊,那么如果是小于的话。
我们就用另外一种处理的方式,那么另外一种情况的话,肯定也就是我们的0~9个这个数值,那么分为这两种情况,那么在这种情况下呢,我们这个呃三,啊sp这个buffer,那么它的嗯我们也要取他的高位和低位。
那么他的高位的话恰好呢是从零开始的啊,那么零开始呢我们这里呢我们就要对它进行一个赋值,那么首先它从零开始的话,我们就是从多少开始呢,嗯,那么它最先的一个起始地址的话。
就应该是a b c d e f这几个数字当中去选,那么去选的话,我们在这里呢可可以来给他做一个相关的一个计算,那么就是首先我们用大写的字母a表示,那么这个a它究竟嗯我们看它究竟比这个九大多少。
或者说是这样来表示的,那么这个b还减掉一零,那么如果他恰好等于一零的话,那么这个就是10-10,那么这里呢他最终呢返回的也就是一个字符a,那么如果这个值它等于幺幺的话,它减它就等于一。
那么这个a加一的话,它恰好了,就等于我们的b,那就等于我们的b那么这样的话我们就可以了,根据这个差值呢就可以得到a b c d e f的这个高位的这个数值,那么另外我们又来算另外一种情况啊。
另外一种情况呢就是09的这种情况,那么09呢我们就是另外一种情况的一个负值,那么这里从零开始,那么0~9的话,我们同样的这里呢就是零啊,零的话我们后面我们加上多少呢。
就加上一个它相应的一个数值就行了,0~9,那么这里呢我们还是从零开始的,那么我们再加上beh,那么这个时候就行了,他也是,那么如果这个数等于一的话,那么恰好呢这个字符零它的后面一个呢也是数字一啊。
那么如果这个点二的话,那么这个数字零呢它加上二呢,他也就等于我们的这个字符的二,所以说我们这里可以这样的处理,那么另外的也就是他第一位的那几个字节,我们要进行一个判断,那么第一位的话。
我们这里呢它的下标呢就成一了哈低位,那么这里呢我们也要变成了below啊,那么这里后面的也进行一下替换就行,也是同样的一个原点好,然后呢最后呢我们还要因为它毕竟是一个字符串,那么这个处理完成了之后呢。
我们最后呢还要跟他这个季节三,这里呢要给它进行一个复制,那么这个数值呢就是我们的智慧零啊,我们要跟它写进去,那么这个字符零呢也就等于我们的零都是可以的,直接-0。
也可以直接付这个字符串转结束标志已经这两个视线相等的,这两个是相等的好,然后我们最后再返回就可以,one retur,那么我们就返回这个字符串的缓冲区,或者也可以啊,这里直接返回或者返回数据多位类型。
在这里我们把它改一下,或者他也可以没有返回类型都可以,那么这里写好了之后呢,我们呢要先做一下测试,那么在应用,一到原文件单元,然后呢我们在这里呢也前面也进行一个相关的测试,和这里加一个retur。
那么把后面的这一段数据呢就不会执行了,那么在这里我们先做一个测试,恰c等于我们的222,然后呢我们进行一个相关的啊转换翘算了,哈哈哈哈哈,好那么这里呢我们进行一个付出值啊,那么-2初始之后呢。
我们就可以对这个函数来进行一个啊相关的测试,卡图h e x嗯嗯,那么前面是缓冲区,那么后面是字符c,那么转换之后呢,我们再打印就可以,那么这里我们就可以这样写啊,c等于多少,它转换之后等于多少。
那么我们来看一下,那么这里我们少一个分号,哈哈哈哈,老铁主体,那么这里面说错了,我们重新把它嗯分离进行一下调试,再来看一下,point啊,然后呢这里面c啊,这里应该是什么呢,这个c应该是百分之d啊。
几乎呃在这个位置的话,不然的话如果没有这个格式化字符的话,它实际上打印的字串来是打印的c啊,这个数字说,所以说他去访问这个地址的话,明显就会出错啊,那么我们再运行一下,哈哈哈。
然后这里呢我们要把它暂停下来。
那么这个时候呢它是显示的-34啊。
d一等于多少多少。
那么在这里的话,我们要怎么来一一个自己的哈,那么我们要把它定义为bat的类型啊,无符号的,还有这个百分之d格式化。
这里的应该是啊或者是u也可以,那么这个时候呢就会显示222转换成了我们的16进制的字串第一。
那么我们就。
算起来算一下,对不对,二二十六进制第一,那么证明我们算的是正确的,那么接下来呢我们就可以把这段代码注释掉,注释掉我们就可以替换掉相关的这个函数,那么这里呢我们就把这个注释掉,接下来呢我们就用一个恰啊。
那么这个字符字符转16进制的,啊然后后面在b的i当然在前面呢,我们把这一串啊,把它复制一下参数好,然后呢我们再来生产,然后游戏啊这里打开,打开了之后,我们再来定位。
靠这么。
哈哈哈哈。
然后我们再编辑一下,再来看一下,那么我们这里的特征码也没有定位到。
再重新执行一下。
哈哈哈。
那么这个时候呢我们发现了他也没有结果,没有结果,我们再来看一下是不是我们这个呃转换的时候出来一些什么问题。
那么上一节课我们测试的话,这里的话它是有结果的,或者我们替换一下刚才的这一段代码,那么换成我们以前的这个格式化来看一下。
那么以前的话这个呢机子呢他会马上就找出来啊。
那么我们替换之后说明这个函数呢功能上还有一些问题啊,那么我们再来看一下啊,它所传的这个数字传进去之后呢,他应该对这个地址来进行一些改写,那么还有呢一个三字经的,那么我们再转到这个函数里面去看一下嗯。
012,那么最后呢这里是显示,两种情况啊,这里是below啊,那么这里呢我们还要进行一个相应的一个判断才对,不然的话他会出错错了,刚才的错误就在这一句啊,他判断错了啊,这上面才是高高位,这里是低位的好。
然后我们再来看一下,那么这样的话速度就非常的快了。
一下子就出来了,嗯而且我们相信的话,这个起始地址这里我们不约掉啊,从零开始收的话,他速度应该都都会很有提高啊。
再来看一下,这样的话我们也会很快搜出来。
即使我们后面这两个参数我们把它忽略掉啊。
这样的话速度也快上了许多,怀上了。
好的,那么我们下节课再见啊,那么这节课呢我们就到这里。
P41:052-动态定位,通配符支持 - 教到你会 - BV1DS4y1n7qF
大家好。
我是郁金香老师,那么这节课我们在之前的基础上,那么添加通配服的一个支持,那么也就是所谓的一个模糊的定位搜索,那么什么叫模糊搜索,我们都知道以前我们的多识命令,我们用星或者是用问号来代替一个任意的字符。
那么我们大概特征码也是这样的,那么比如说我们在这里随意的取一段特征码,那么这里它也有一段机子,那么我们以这段代码为例的话,那么我们要搜索这个位置的话,我们可以搜索这段特征码。
但是如果我们要实现一个模糊的搜索,比如说这里的话,它可能是一个任意变动的一个数字,那么在这里的话,我们就用4个星来代替这一段数字,表示我们中间的这4个字符可以是任意的字符,那么我们都可以搜索到它。
那么这里我们可以用问号来代替,那么也就是说它不属于我们16进制的这些字符,我们在转换的时候,都可以把它替代成一个任意的一个字符,那么这样来达到我们的模糊搜索,那么这样的搜索的话,它功能的话将更加的强大。
好的,那么要实现这样的功能,我们在第51课的基础上再进行一些修改,那么首先我们要修改的也就是要将这种带通配服格式的,特征字串那么进行转换,那么转换了之后后边方便我们比较,那么在这里我们将把它把4个字符。
除了我们09和AF之外的这些字符,不在这个区域里边的,我们全部把它替换成大写的X,在这,我们全部把它替换成大写的X,好的,那么在这里我们打开第51课的代码。
那么打开之后我们展开我们的源代码单元,那么在这里我们需要另外再添加一个函数,那么类似于我们字节集转我们的字串的这样的一个函数,把它复制一下,那么在这里的话。
我们是把前面的字串把它替换成后面的这种字串的这种固定的格式,那么这里实际上它只需要一个参数,它既是一个输入的参数,也是一个输出的一个参数,in out它是一个空的一个活,这两个可以,那么这个函数的作用。
也就是检查我们特征码里面有没有09以外的一个字符,09和A~F,这个之外的一个字符有的话,我们就把它统一的,那么替换成大写的X,用来代表任意的字符,当然也可以把它替换成新也是可以的。
那么可能替换成新的话,或者替换成问号,这样我们更好理解一些,代表一个自己的字符,都是可以的,那么这里我们把它替换成大写的X,然后我们复制一下相关的说明,然后我们移到开始的位置进行一个转换。
那么我们也要逐字节的把它取出来,所以说我们先要取得特征字串的长度,那么取得长度之后,我们再开始相应的一个循环检测所有的每一个字节,那么在这里面,我们依次取它相应的字节的数据,取它相应的字符。
那么字符取出来之后,我们就要做一个判断,判断它是否是16进制的判断它,那么如果不是16进制的,我们就替换成这个字符X,当然这里我们可以另外的写一个函数用来判断是否是16进制。
那么在这里我们另外写一个函数用来判断是否是16进制的字符,那么在这里我们用byte录像,用恰也是可以的,byte和恰实际上是一个是有符号的,一个是无符号,那么在这里我们对这个C这个字符来进行一个判断。
那么如果它大于等于字符0,那么并且这个C小于等于我们的字符9,那么如果是这个区间的话,那么我们把一个增值,那么如果不是这种情况,那么我们就做另外的判断,那么如果是它大于,那么如果大于等于我们的字符A。
那么这里我们只说大写的判断就行了,因为之前我们已经把所有的小写都转换成了大写,那么在这里我们就只判断大写就可,那么如果它大于等于A,并且它小于等于我们的F,那么在这里我们也返回,增值它也是属于16进制。
那么如果这两个字都不是的话,那么我们就返回,那么要注意的就是什么,这里它取出来的是一个字符,要注意是一个字符,而不是一个字串,当然这里也可以加上一个小写的判断是可以的。
那么小写这里就改成相应的小写就可以,那么只要是前面这三种情况,它都会返回一个增值,那么这个函数的作用就是检查,是否是16进制字符,那么0-9A-F这些都属于16进制,好。
那么在这个时候我们就进行一个相关的判断,把这个字节取出来,那么如果这个是16进制的,当然我们就不对它进行一个更改,那么如果它返回的不是16进制,而返回的是一个Fans。
那么说明它应该我们把它替换成一个通配符,那么这个时候SizeP16进制的,BufferHight,那么我们就等于大写的X,所以这个时候返回大写的X,就是这个X,那么这样我们经过这样的一个转换之后。
我们还要修改一个地方,那么还要修改哪一个地方,我们来看一下,在后面的比较这一部分,我们还要修改这里,那么在这里比较的话,我们就变成一个带通配符的一个比较,那么在检测的时候,只要这两个字脆的某一个字节。
它就其中包含了一个大写的X的话,那么我们就让它继续,那么所以说在循环的这一部分,我们还要给它加上一句,在前面,那么如果它等于X,那么取出来了字符等于X的话,那么我们就继续表示它相等。
那么继续进行一个下一次的一个循环,那么还有如果是H2,它两个当中的一个,只要某一个数字的话,等于X,我们都进行下一次的循环,那么这样的话,理论上我们就可以通过就能够进行一个,模糊的一个搜索。
当然还有一个地方,我们需要进行一个替换,那么也就是大小写,我们特征码搜索,看一下特征码搜索这里,那么在这里我们全部转换成大写之后,我们还要进行什么,通配服务,替换,那么我们在这个地方。
那么我们再进行一下相应的调用,好,那么这样进行这样的一个转换之后,理论上我们就可以用通配服来定位相应的,一个特征码,那么比如说现在游戏是打开的,那么我们再搜一下这串特征码,最后它得出来的地址是多少。
F598B。
那么现在的话我们就可以把特征码改掉,中间的几个字节,那么比如说我们最后几个字节,或者是,你这四个字节无的,那么我们就可以改为四个问号,或者是其他的字就代表一个通配服务,那么我们就可以这样来进行搜索。
那么这样的话,它也能够搜索到机制,但是这样的话灵活性更大一点。
那么即使我们中间的这四个字节,它有变动了游戏更新之后,那么同样的它能够定位到我们所要的代码的一个附近,好的,那么这一节课我们就讲到这里,那么特征码这里我们再来看一下,400开始,好的,那么我们下一节课。
那么这里下去也留一个作例给大家,那么这个作例就是来提取所有机制,就是所有机制的一个特征,偏移,那么我们举个例子,那么比如说我们要读04,那么我们就可以把前面的这一段定位为一个特征码,那么收到之后。
这一段特征码所占的字节数就是一个偏移,这里是两个字节,加上这里的6个字节,8个字节,8个字节,加上这里的偏移就为10,那么这里就为123456789,那么这个地方的偏移就为10,那么10的话。
我们读字节出来的话,就是04,就是04,那么今天我们要下去做的作例,就是提取特征码,这个偏移,偏移了,在后面我们说明,比如说它的要读取04的偏移的话,就是10,那么提取特征码之后,那么下一节。
可能我们再来进行一些机制的一个更新,其实,代码的形式,到时候我们生成相关的机制偏移的一个同文件,那么我们下一节课再见,這種情況 LAURAowslet 我也會強烈的支持你,在這次的投票當中。
我有贊成你的決定,謝謝他們。(音樂),(笑)。
P42:053-提取特征码和偏移 - 教到你会 - BV1DS4y1n7qF
大家好,我是喻吉箱老師,前面我們已經編輯好了特徵碼定位的函數,這幾個我們為它整理出相應的特徵碼串,以及我們機子的一個偏移距離,我們先打開第46課的Base Gun圖文件,在這裡我們先對它進行一些整理。
然後我們把機子管理單元把它複製出來,在複製之前像這種就是兩個共用機子的,我們把它放到最後,像這種我們是不需要更新的,我們只需要更新前一個就可以了,那麼我們把前面的這些複製一下,然後保存。
或者整個我們把它複製出來也可以,整個複製出來,然後我們為它每一個抓取一個相應的特徵碼,偏移,然後我們把它放在後邊,那麼首先我們從人物屬性的開始,那麼人物屬性的我們找到它的一個機子,看一下在什麼地方。
上次更新的是2F9400,我們收一下,那麼人物屬性我們並沒有添加相應的代碼,那麼沒有添加代碼的話,我們轉到OT裡面,為它重新提取一下特徵,那麼這是人物屬性。
進到OT裡面,然後我們用PC來看一下,那麼人物屬性的話,第一個地址是人物的名字,那麼我們在底邊收一下這個藏料,那麼這個時候我們可以收到很多,很多的地方,那麼可以收到很多的地方。
這個時候我們隨便選一個就可以了,那麼比如說我們選這個地方,那麼選這個地方之後,我們把前面的這一段或者是後面的這一段,複製一下都可以,然後提取相應的特徵碼偏移就可以了。
好的那麼我們複製一下,這個我們不用。
因為前面的自己提取的沒有計算它的一個偏移,那麼現在我們這個是我們的人物的屬性,那麼這個人物的屬性,我們可以看一下,它是從這裡開始,2F914D0,那麼我們提取它前面的這一段特徵碼,提取前面。
然後我們進行上色,把這個複製一下,複製到前面,那麼複製到前面之後,我們先找特徵碼,然後這裡再取一個B9就可以了,後面的我們不取,因為後面如果是遊戲更新的話,這個機制可以,可能會變。
但是前面的這些代碼它變動的可能性會小一些,會小一些,那麼這裡我們看一下,一共有多少個字節的偏移,那麼我們也可以在OD裏面把它計算出來,那麼也就是我們66,減掉我們前面的數值,用一個問號表達式。
來減掉這個地址,因為我們通過前面的字串特徵串來搜索到的機制,如果正確的話,就會返回這個地址,所以說我們要取得它的一個偏移,那麼它的偏移是,10進制的24,那麼16進制的18,那麼我們記好這個偏移。
可以記成是偏移是0x18,然後讀取的方式,我們來看一下,它也是一個直接讀取,這個機制就行了,應該是02F914D0,那麼直接讀取這個地址就行了,那麼計算出這個地址,那麼我們保存一下,好的。
這是我們第一個機制,冷幕屬性的,那麼我們把它輔助到我們的課程裏面,那麼第二個我們找背包列表的,那麼也可以直接在OD裏面找也可以,找一下,產量,因為這個產量的話,我們之前的地址已經更新了。
我們需要一個新的最新的一個機制,那麼所以說以前的是不對的,我們在這裏找一下背包的,這是才更新的地址,那麼這個時候找到的地方也比較多。
我們選比較靠前的,那麼這個是背包的機制。
那麼我們再提取一下它的一個特征碼,就以前面的這一串為特征碼進行提取,那麼這個特征碼提取之後,我們可以先在CAN裏面進行一下嘗試,那麼如果這裏能夠收到的都是501的話,那麼證明它是有效的。
注意我們這裏選的時候要選一個可寫,這個要去掉這個勾,那麼這個時候我們能夠找到一個51的,一個地址,那麼我們就記錄下來,那麼接著我們提取這個的特征碼,那麼這個的特征碼,我們可以去這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試。
那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,那麼我們就在這三行的先做一個嘗試,剪掉前面的地址,找到的地址,找到的地址。
那麼這個時候會得出一個偏移,那麼這個時候會得出一個偏移,16進制的11,10進制的17,那麼隨便選一個,那麼這裡面我們用16進制來表示,那麼這裡面我們用16進制來表示,裡面是11是它的一個偏移。
那麼加上這個偏移了,我們就能夠得到地址,然後就能夠讀出我們相關的這個地址,然後就能夠讀出我們相關的這個地址,好的,那麼這一串我們又把它剪掉,那麼這一串我們又把它剪掉,特徵碼提取了。
那麼我們再來提取兩個特徵碼,那麼我們再來提取兩個特徵碼,一個就是這個Qord這個特徵碼,一個就是這個Qord這個特徵碼,那麼我們來找一下,最新的使用背包的Qord。
那麼我們來找一下最新的使用背包的Qord,那麼我們來找一下最新的使用背包的Qord,那麼我們來找一下最新的使用背包的Qord,那麼最新更新的是這個地址,那麼最新更新的是這個地址。
我們來提取它的一個特徵,那麼這個是在一個循環裏面,那麼像這一段,那麼這個是在一個循環裏面,也似乎也做一個相應的特徵碼,也似乎也做一個相應的特徵碼,好的,我們把這一段複製一下。
那麼複製到它的下邊,那麼現在我們也開始提取它的一個特徵碼,那麼現在我們也開始提取它的一個特徵碼,那麼現在我們也開始提取它的一個特徵碼,再看一下,410。
這是9410,這是9410,這是9410,在下面的不是我們刪掉,那麼它的特徵碼,我們可以提取前面這一部分,那麼首先這一段我們也把它提出來,那麼首先這一段我們也把它提出來,那麼首先這一段我們也把它提出來。
這兩個我們可以提取一個,這兩個我們可以提取一個,後面這個是偏移,後面這個是偏移,我們用通匯服來代替,因為偏移的話它最容易變,像這一種,那麼變化,我們就用通匯服來代替,那麼這種指令。
它不涉及這種跳轉的偏移,它不涉及這種跳轉的偏移,所以說它一般是不會變的,那麼這種指令,它一般也不會變,那麼我們直接,用相關的數據直接代替就行,那麼這個JJ前面75,那麼這個JJ前面75,它是不會變的。
那麼後面的這一個字節,一般它會變,後面它實際上是一個相對的地址,後面它實際上是一個相對的地址,是通過A的值計算出來,8日的位置,偏移了10個字節,那麼這裡是一個偏移,所以說這個我們要用通匯服來表示。
那麼後面的像這種,6,6,一般也不會變化,包括後面的這種,都不會變化,好那麼這一串,我們把它編輯好之後,也放到我們的聲音裏面,搜一下,看它具不具有一個五一性,那麼這一段,可能是我們中間那裏出來的問題。
導致我們搜不到,那麼我們再來,核對一下,74或者這裡是16,兩個字節,然後是8B065,83,7,0A,然後是56,另外015,另外018,那麼我們再來測試一下,可能是後面我們剛才跟了一個,尾部的空格。
沒有搜到,那麼我們刪掉後面這一串,再試一下,刪掉後面這一串再試一下,那應該是在後面這一段出了出,7416,然後是8B40F,那麼我們先上示前面這一段,那麼我們再嘗試這一段,那麼它的錯誤,應該是在這後面。
7 0A,然後是56,6為01,6為00,18,但是看不出來,什麼地方出錯,那麼我們再把它,加進去試一下,756,750A,我的6A01,那麼可能這一段,可能是變化了,那麼後面這一段我們重新取取一下。
7,這後面這一段,7,4個0,7,那麼這一段可能是沒有顯存,我們看一下,那麼後面還有一個2A,這個地方它沒有顯示,我們進到OT裡面看一下,這裡剛才這一段,它這裡藏了一個2A,這一段剛才我們沒有抓下來。
所以說造成了,這什麼,我這個2A它被忽略掉了,所以說在調整的時候,我們要注意調整一下這個位置,造成了這個2A,沒有被複製到,所以說剛才我們一直收不到,這裡我們加一個2A,它就能夠修復,那麼75,過來了。
750A的前面,有一個2A,那麼我們再搜索一下,這個特徵書,那麼這個時候就能夠,搜索到了,那麼搜索到之後,它找到的值是這個數字,那麼所以說它的偏移的話,就等於,後面的這個數字要減掉,那麼這裡是7D。
那麼7D加上,這一字節的話應該是7E,這是它們的一個偏移,我們來計算一下,那麼它的偏移是18,搜索到之後。
我們加18,好那麼我們接著更新,下一個窗口,遊戲主窗口的一個劇本,那麼遊戲主窗口的劇本,我們來進行一下,到OD裏面直接提取。
那麼我們也選比較靠前的,那麼像這一種的,這一串全部都是機制的話,遊戲更新之後,這裡面的數字也要變,那麼我們要用很多的通匯服來進行搜索,那麼這種地址的話不太適合,做我們的特徵,那麼所以說我們換一個在這裡。
那麼換一個圖取的地址,那麼這個地方相對的話。
用來做我們的特徵,要比較好一些,那麼我們把這一段進行一下複製,那麼複製之後,我們這個比較靠前,那麼我們可以搜索,在後面的這一段做一個特徵碼,那麼把其他的刪掉,留下我們的特徵碼就可以了。
我們也可以直接數也可以,16我們看過了是多少,那麼我們直接用下面的,16過了是52,然後是8B4134,然後是FFD0,然後是8BF033C3DF,好的,那麼我們搜索一下,那麼這個時候也搜索到了。
搜索的地址是這個地址,那麼我們這個時候,用這個地址,用這個地址應該來減掉這個地址,它就等於一個負數,我們還是用比較大的數字來減,那麼減掉這個C4,好像是等於6,那麼這個時候他們的偏移是6。
但是由於我們找到的地址,它比這個還大,所以說這個數字減掉的,數字的話,它應該是等於負6,這個偏移應該是負6,實際上是要減6,而不是像我們前面的,它是一個正的偏移,所以說它是一個負的偏移。
那麼我們從這個地方開始,因為我們收的是它後面的一個特徵,再定位到前面,所以說這裡要加減掉6,但是減掉6的話,我們看一下,這裡還有兩個字,那麼實際上我們只需要減掉4,就可以了,這裡退回來。
我們是要讀取的這四個字,先退回來的這四個字,好的,那麼我們保存一下,那麼接下來我們是怪物列表機制。
怪物對象檔。
這是最新更新的機制,我們進行一下搜索,那麼這個時候,我們找比較靠前的,那麼這個特徵碼,我們選前面的後面的都可以,我們就選在前面的這一個。
這一段,我們來做一個特徵碼,那麼我們可以從這裡開始。
搜索組織我們的特徵碼,後面的我們就手動添加,53-6102-FFD233F639ED,然後這裡也有一個機制,那麼這個機制的話,我們用通配符來表示,1234,它一共是八個字,那麼後面這裡一個接127。
那麼27。
它是一個跳轉,像這種的話,它也很容易變動,這個偏移,所以說27的話,這個偏移,它不是數據的一個偏移,那麼我們也用通配符來表示,那麼這個我們直接複製,大致這麼長了,我們就可以了,進行一下定位。
然後在CE裡面搜索,那麼我們看到它定位的是這個位置,那麼所以說它也有一個偏移,那麼偏移就是我們要取得的,機制的偏移是在這裡,三字節,三字節就是B3,那麼它的偏移的話,就應該是B3。
來減掉我們前面的這個數字,最終你們看一下,多少,這個等於EF,等於十進制的31,我們統一取成16進制的。
EF,這個等於,好的,那麼剩下的還有幾個,這些機制的話,那麼請結合前面的快速更新機制的一個辦法,那麼把特徵把它按照前面的這種格式,把它提取好,那麼下一節課第54課的時候,我們在編寫代碼。
然後統一的更新出,用代碼來更新出我們所有的機制,好的,那麼我們下節課再見,那麼後面的這個就是一個作業了,大家請結合前面的快速更新機制的那一步,好的,那麼我們下一節課再見,再見,再見,再見。
P43:054-一键更新基址 - 教到你会 - BV1DS4y1n7qF
大家好。
我是郁金香老师,那么在前面呢,我们一起编写了定位特征码的函数,以及提取了特征码和机子的一个偏移,那么这节课呢,我们来编写一个一键更新机子的函数,那么打开第56课的代码。
那么首先呢我们展开机子定位的单元啊,移到最后,我们把这个函数呢再进行一些优化,那么在这个位置呢,我们在读取这个缓冲区的时候呢,每次呢是读取到1024啊自己,但是某一些地址的话。
它并不存在数据或者读取的数据的话,并没有这么多,那么我们在这里的话就用不着啊,比较做这么多次,那么说所以说我们在这个循环的结束条件,这里,我们可以用它实际读取的这个字节数。
来作为它的一个结束的一个条件好,那么我们开始封装我们的一键更新,及时的函数,那么这个呢我们就把游戏的进程句柄啊,传进去,然后我们在cp单元添加我们的代码,那么在这个函数里边呢,我们要做这么几件事啊。
于是呢呃特征码我们把它添加进来,然后我们就是定位特征码,那么然后我们通过特征码,定位的这个地址呢,读取我们的机子,那么我们在头部来先建一个,存放我们特征码的一个缓冲区,那么这个缓冲区大小呢。
我们把它定义成256个字节,在这里呢,我们就用第一个这个机子的特征码,来初始化它冷漠属性的这个注意,我不空格,我们要把它删掉,并且我们把人物属性的啊,这个,特征码啊,把它复制进来,然后注释掉。
好那么我们现在开始定位我们的特征吧,那么第一个参数来进行区别,第二个参数就是我们前面的特征字串,那么这个时候呢它会返回一个地址,那么我们还需要在前面的定义一个呃指针,来存放地址。
那么这个指针呢我们直接啊为了方便操作,我们直接就用一个d word类型来存放,那么我们先把它初始化一下,在这里呢我们来用来存放特征码,定位的一个地址,那么定位了之后呢,我们就开始读取这个机子啊。
读取相应的这个呃数据,那么在这里我们在另外呢建一个变量,indebase,用来存放这个机子,那么在这之前呢,我们还需要分装一个函数,用来读取我们基础的这个函数,那么在前面呢我们再进行一下封装。
d word返回一个地址,那么第一个呢我们也是进行了一个具体,那么第二个呢就是我们要,读取的一个地址,然后最后呢我们就返回这个地址,先定一个变量,关于地对,然后我们用api函数来读取。
第一个参数呢就是进程句柄,第二个参数呢就是我们的起始地址,转换一下心,那么第三个参数呢就是我们的缓冲区啊,debase,那么第四个参数呢我们要读取的字节,因为地址都是四字写的。
所以说这里的话我们就不需要另外传地址,就直接呃读取四个字节,因为32位的系统的话,它的地址都是四字节,那么最后这个呢我们可以通啊,然后呢最后我们返回inbase就可以了,然后在这个地方呢。
我们直接就用前面我们b中的函数rebase,来读取它pd当前的地址,那么这是普通的呃,这种机制的一种读取方法,读取好了之后,我们打印出相关的这个数据,把前面这一段啊记一下。
那么后面呢我们就跟这个nd base,好的,那么我们先来进行一下测试,转到我们的南海宿舍,那么把前面的这一段啊全部删掉,这里呢是只只需要传传入一个呃,进程的句柄就可以了。
那么这个时候呢,我们读取出来的数值为69064,18a啊,好像这个数值是错的啊。
呃我们再来看一下,首先这个地方是6565,加上这一字节的话是六六,六六来减掉前面的这个数字,那么我们首先看一下它的偏移,我们上一节课是否计算正确了,那么它的偏移呢是幺九,上一节课的时候呢。
我们计算偏移也不,那么这个时候我们再改一下它的一个偏移,对了这个地方呢我们还要加上一个偏移,这样才才对啊,还还不止一个地方出错啊。
那么这个时候呢。
读出来的数值是2f94 d0 啊,也就是这个人物属性的机制。
那么这个时候呢我们已经读取正确了,那么然后我们来更新第二个啊,背包的机子,那么背包机制的一个特征或偏移,我们添加进来,然后我们再把上面的代码复制一下,这串代码,那么复制下来之后呢,我们这个数组的话。
它肯定不能够这样的进行一个复制,这样编译的话就通不过,那么所以说在这里的话,我们需要借助一个函数,来把它拷贝到这个前面的这个缓冲区里边,再编一下,那么然后呢,再把我们的这一串偏移啊添加进去。
那么添加进去之后呢,在这里的话我们加上0x11 的一个偏移,然后在这里打印出来的是背包的一个机子,好的,那么我们再测试一下。
3140f4 ,那我们来看一下3140f54 ,那么这个时候读取也是正确的,那么接下来呢,我们嗯来更新这个扩的这个地址。
那么这个扩的地址的话,它稍微要更新的复杂一些。
那么首先我们也是把前面的代码复制一下,那么第一步呢我们也是把特征码添加进来,那么添加进来之后哈,呃这里也是找到了他当前的一个地址,也要加上它的一个偏移x18 ,但是最后呢我们这里打印出地址的时候呢。
呃我们要注意啊,他因为这个扩的话,它读出来的数值的话实际上是前面这个啊,这个的话我们从高位算起来的话,也就是0017啊,然后呢再是795亿,实际上读出来的数值的话会是这个数值,那么我们可以做一下测试。
而这个数值的话,实际上它不是我们真正的一个扩的,一个地址,那么读出来的这个177951,实际上是这个呃,扩你当前地址的一个偏移啊,离这个地址的一个偏移,那么这个地址的话,我们要加上前面的这五个字解。
实际上也就是我们这个从7d这里开始,那么实际上呢,就是从我们搜索到的这个621b66 啊,这个位置呢要加上幺八,加上幺八之后的话,是到了这个位置啊,还要加上这四肢解。
才等于当前这个获得一个相对的一个机制,然后呢再加上这个偏移,也就是我们的17795g,那么最后呢才会等于我们的这个扩的,真实的一个,地址,那么所以说在这里的话,我们要加上幺八。
然后再要好这里读取的时候加上幺八哈,最后打印这个地址的时候,来这里也要加上0x18 ,再加上它所占的四字节,还要加上一个当前的一个地址,那么这样的话才是最后,最后我们的这个货的一个机制好的。
那么我们再来看一下,那么这个时候呢799799410。
读出来的话,就是我们这个获得真实的一个地址,而不是读出来的前面的那个偏移啊,那么这个偏移,为什么它会显示成177951了,因为这里的话这后面的是高位,他会放在前面啊,这个幺七是高位。
那么在最低位呢它是5g啊,他就这这样要反过来显示,显示成16进制的时候。
好的,那么我们再看一下下一个,那么下一个呢,是我们游戏的主窗口的一个区别,那么我们也把它复制一下,好再把前面的这个地址复制一下这段代码,那么复制进来之后呢,替换特征码,哈哈哈哈哈。
那么特征码替换了之后呢,我们的偏移啊也要替换,那么这里不再是加四,这个偏移是减四,那么最后这里呢因为我们不是空啊,所以说不需要加这种偏移,那么直接打印出这个地址就可以了,嗯还有一点哈。
我们这里呢它是我们的游戏主窗口,句柄打印的红是这一句,那我们再看一下后面一段啊,那么游戏主窗口句柄的话读出来的,它也是这个地址,读出来的是f28584 ,我们先运行一下。
啊这个时候呢啊读取也正确了啊。
那么后面的话这个呢就当成是一个坐列啊。
大家按照相同的方法把后面的这些机制嗯,也把它更新一下,那么下一节课呢我们再一起探讨一下,怎么来生成呢,通过编程怎么来生成一个相应的直接啊,实现真正的一键更新啊,生成这样一个头文件啊。
直接就不用我们再去动手了,好的。
P44:055-一键更新基址生成BaseGameH - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么在上一节课呢,我们一起编写了代码,来实现了机制的更新啊,但是当时的更新的话,我们只是更新到屏幕上,并没有来生成我们的白根的头文件,没有自动的,那么所以说呢这节课呢。
我们继续来完善它啊,添加代码,让它生成一个呃basic的头文件啊,那么我们直接把这个文件,那么复制到我们的项目里面呢,就直接可以用啊,生成一个类似这样的一个头文件啊,当然这个机子呢是没有更新的啊。
那么我们需要一个更新的机制,那么在上一节课来给大家留了一个,作业啊,就是来把相应的代码呢,后面的代码呢把它添加完整啊,那么下来之后呢,我也跟大家一起做了这个作品,并把它添加完整的。
那么现在我们把这个做类的代码啊,添加到我们第54课啊,那这个项目里边。
那么展开我们的机子定位单元,那么移到最后,那么我们用新的这个拙劣的这个函数,来替换掉它,嗯然后我们编译一下,看能否通过,但是这个时候的话我们呢更新呢它只是,把我们的更新的数据呢,显示在我们的屏幕上。
显示在我们的屏幕上标一起。
那么现在我们要的效果的话,是要让它自动的生成文件啊,那么还有一点我们需要注意,那么这个数据前面呢,呃我们需要加上linux的前缀,这一点我们忘了。
那么我们在这个作业里边再把它更新好,然后添加进去,那么首先呢我们这个0x啊,那么前面我们需要呃把它替换一下,相关的这个格式,那么我们需要把这个0x的前面再加一个,0x的一个前缀,再是2%啊。
然后你这个x然后全部替换好。
那么我们替换了之后呢,我们再把它复制到代码里面。
那么我们再来测试一下,那么这个时候呢,它就有一个相应的一个前缀了啊,那么但是现在的这些数据来显示在屏幕上,我们如果是去手动的去添加这些代码的话。
那么呢也比较麻烦,那么所以说呢我们可以把它生成,生成一个文件啊,跟ve,那么这个呢我们需要在这里添加一些代码,这里我们可以来把这个输出来,重定向到我们的文件,也就是跟bs点来取,那么用完了之后呢。
我们再来啊恢复这个输出啊,的这个恢复这个标准的输出,那么这个呢我们可以用控制呃。
可以用到这个相关的函数来实现,那么这这个c语言当中,它提供了一个f2 open的这样一个文件,那么可以呢它实现可以实现一个从进项啊,呃也可以实现文件的打开这一类的操作。
那么我们先来看一下这个文件的一个说明。
那么首先呢在前面的第一个,它是一个文件文件名,带带路径的一个文件名,当然它也可以是一个相对的路径啊,相对路径就只有一个文件名带路径,那么第二个是它的一个打开的模式。
它模式有下边这些模式啊,那么我们需要用到的是这个w这个模式,那么如果我们需要这种模式的话,它会来每次呃使用这个函数的时候呢,它会先创建一个新的空文件啊,用来写入,那么如果这个文件存在的话。
那么它将啊销毁并且覆盖的它的一个内容,那么这就是我们所需要的,那么后面的这些呢我们暂时用不到啊,那么并且呢我们可以来啊,打开像htttt out,s tt一这一类的标准的输入输出,那么这些都是控制台的。
那么这个s t d out了啊,它表示的是一个,我们就是控制台的一个输出的,一个文件的一个职称啊,这个是输入的,那么现在我们控制台,就是我们需要把这个输出的,这就是这些数据,来重定向到我们的文件里面啊。
我们可以用下面的这个语句来实现,那么这个函数呢,它与我们上面这个函数呢有一些差别,那么这个呢它到了一个下划线加s的,表示了,这个函数呢更加的安全,它是新的版本里面提供的,那么这个他把前面这个。
把这个文件的指针返回值呢,作为了它的第一个参数啊,作为它的一个第一个参数,它是一个指向文件文件指针的指针,好的,那么我们一起来使用一下它。
那么首先呢我们就用一个啊f r o s,那么o o s呢,它需要的第一个呢,是指向一个文件的指针的一个尺寸,那么这里呢我们需要啊,用这个file来定义它指针的一个尺寸,那么首先呢我们定义一个啊文件指针。
file,p file,然后呢我们给它进行一个初始化,那么作为他的第一个参数,但是它是指向一个指针的指针啊,那么所以说这里呢我们传它的地址进去,那么第二个呢是我们的一个呃,要打开的一个文件名。
那么这里呢就是我们的根best,点h,第三个呢是我们就是打开的一个模式啊,掐略性的,那么我们在这里呢用w啊,就是说每次我们生成一个新的啊,通的空文件啊,让我们这个数据输入进去。
那么最后呢这个就是我们的一个呃,文件流的一个职称,就是说我们数据的一个来源,像我们这个跟bs加h这个文件里面写的,这个数据的来源,那么这个数据的来源呢就来源于s t d2 。
那么这个指针呢它在相关的头文件里面呢,已经定义了啊,就是我们控制台的屏幕输出的这些数据,然后呢写入到它里面好,那么然后我们也就是执行这个弯k啊,updated base的时候呢,所有的啊像屏幕输。
输出的数据来,都将啊输入到我们的这个文件里面,当然这个文件我们要用完了,我们还要输出信息啊,比如说我们在后面我们要输出啊,这期已经完成了,那么这些的话数据的话,如果我们不做相应的恢复的话。
它同样的会更新到我们的这个跟贝嗯,这个文件里面,所以说这里呢我们要做一些还原啊,首先我们关闭之前的一个距离,并且呢释放掉相应的这些资源,p,那么然后呢我们再重新打开它,进行一个定向批判。
这是他这是一个用来啊,返回这个打开了一个文件的一个指针,的一个指针,那么第二个这个参数相相当的重要啊,那么这个参数呢,它是一个特殊的一个字串啊,特殊的一个计算,come out这个字串。
那么这个字串的话,它表示的意义呢,就是我们的控制台的一个呃,标准的一个输出,那么我们就恢复它就是它,然后然后后边的这个模式呢我们也用w啊,那么写入那么这个设备啊,相当于是。
那么后面呢也是s tt out它的一个来源啊,那么我们,把它重重定向啊,进行一个恢复,回复标准的这个输出,这里呢是把输出来定向到我们的文件啊,这里呢是关掉我们之前的一个区别。
当然在后面呢我们就用手关关掉了啊,后面这个控制台退出的时候呢,它自动的会关掉这个距离,好的,那么我们再生成一下,重新,那么这个时候我们还要需要有有一个设置,那么也就是我们的一个调试的,一个中间目录。
我们需要把它嗯,这里我们设一个统一的一个目录,b或者是ex一就可以,那么这样可能更容易理解一些,那么调试这里呢它的工作目录呢,我们也给他设置一下,这样方便我们找这个头文件,那我重新生成嗯,然后执行一下。
那么他调试的这个目录呢,我们需要了也要跟他更新一下,这是工作的目录,调试目录,然后还有一个再看一下,常规中间目录啊,中间目录我们也把它设置到这个ex一的,这个目录下面啊,然后呢我们点确定重新生成一。
那么这个时候呢我们有一个错误,我们来看一下啊,open的时候错误的打开模式。
那么可能是这个大小写啊,它有一定的关系啊,在这里的话它是写了一个小写的啊,那么我们把它替换成小写,那么重新再编译一下。
再运行,当然这个更新这个机子的话,它需要一点时间啊,因为它更新的机子比较多啊,不得收索。
好这个时候更新完成了之后,我们去找一下我们的文件嗯。
在ex e的这个目录上,在我们上一级的这个ex e的这个目录上。
然后呢我们找一下这里有个跟boss啊,那么这里所有的这个数据呢,都生成在里面来了,那么所以说我们在设置的时候的话,我们可以把那个上级的目录啊取消掉,那直接我们设置成1x一就行了。
因为这个工程呢它没有它的上一级目录,网上的,那就在本目录下面啊啊运行就可以了,然后调试的时候,这里呢我们把前面的上级目录的那两个点,把它取消掉,那么再重,新申请一下,把这个关掉啊,好的。
那么我们这个时候再生成一下,这个时候呢生成失败了,他说的这个某个文件的一个打开,看一下update gx g,再重新生成一下,试一下,看一下我们路径的一个设置,啊中间目录啊。
这里中间目录e x g输出目录,中间目录和这个输出的目录,可能是相同的啊,那么在这里呢,我们另外它跟它下一条再试一下,调试,应用。
我们把工程关掉,然后再重新打开一下这个目录。
我们删掉。
再重新生成一下,啊这个选项有问题啊,我们再来看一下吧,那么这是一个中间的一个目录啊,那么后面这个名字我们把它去掉。
好那么这个时候生成成功了,那么我们执行一下。
那么这个时候呢,我们看一下它执行的路径的话,在c盘的根目录下面去了,这个路径有点不太对啊。
我们再来看一下它的一个路径的一个设置,输出的一个目录啊,调试的一个封装功能,那我们还是把它设置设置成这个上级的。
这个目录,好那么这个时候更新完成了,那么更新完成的话。
它应当是在这个c盘的根目录下面去了,这个生成的文件,那我们在它的根目录下面去找一下,啊到这个地方来了,生成了我们的文件,但是是成成功的,只是我们设置的一个路径啊,出来一点问题,好的。
那么我们在设置路径的时候呢,重新刚才把它设置了一下,再重新的编译一下,目录名必须以斜杠结尾了,我们这个参数里面它设置有一点问题,调色,啊这个中间目录啊,看懂,啊这个时候更新呢我们再看一下,关掉啊。
这个时候呢,在我们上一级的这个exe的目录下面呢,它就生成了我们相关的文件,那么我们在这里啊运行的时候呢。
它也会在这下面呢,申请一个跟bs的这个目录。
那么等它更新完成了之后呢,我们就可以拷贝到我们之前的项目文件,里面去啊,运行了。
好那么更新完成我们关掉啊,在这里呢,它就会把我们所有的机子呢,都生存成一个文件啊,然后我们只需要把这个文件复制一下。
然后复制到我们第46课的代码里面,就可以了,我们找一下这里有没有第46章的代码。
教程规范的。
46课的代码,然后呢我们把它复制出来。
把我们的这个新的跟贝斯呢,把它粘贴进去就行哦,叫base ga啊,不是叫跟贝斯啊,那么我们把它复制一下,重命名吧,叫bison啊,那么在这里的话,我们需要再改动一下它的一个源代码。
那么这里要改成我们的bg,啊这样就可以了好的,那么我们下一节课再见。
P45:056-更新基址后的测试 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么上一节课呢我们自动的更新的头文件啊,这个机制单元的,那么这节课呢我们主要是进行一些相关的调试,看还有些什么错误,那么首先呢我们打开第55课的代码。
那么打开这个工程,那么首先我们上一节课呢,已经生成了这个白根的这个头文件啊,那么我们先编译一下啊,看能不能够通过,那么最后生成的时候呢,他说有一个失败哈。
请将原文件转换为多次格式或者是unit music,什么格式啊,那么我们注意到这里的换行呢,比如我们其他头文件里面的换行它不一样,那么这个换行是我们在前面的这个生成的时候呢。
它就是说加了一个换行和一个回车啊,那么实际上我们只要一个斜杠r就可以了,那么我们先更改一下第55课的代码。
那么首先我们提到这个基础单元移到最后,那么我们可以注意到这里的我们每一每一个文件的换行呢,都是一个斜杠r或一个斜杠n表示一个换行,一个是不凑,那么我们只需要后面的一个换行就行了。
前面这个来表示的是回车键啊,那么所以说我们可以把这段代码呢先复制出来。
啊剪剪切掉,然后呢,我们打开一个记事本,选一下替换,那么我们把这个回车和换行呢替换成一个直接的换行,然后呢我们再把这段代码复制回去。
那么这个时候呢我们再生成一下,生产好了之后呢,我们把这个相应的呃exe的文件对了,我们看一下它生成的地方在什么地方啊,对不起,1x一有个1x一的这个目录,但是我们没有找到这个ex的这个目录。
我们看一下它的项目的属性输出目录,ex 1,目标文件再重新生成一下,再打开这个资源,可能是申请到我们的这个上一层来了这个地方,那么这里呢我们可以啊。
这个ex e的这个文件呢啊复制到我们这个56克的啊跟代替单元,让它重新生产,那么替换掉这个跟best的这个文件,那么生成成功了之后呢,我们再看一下,那个头文件,那么在这两个地方啊,这两个地址好像。
这这个机子好像有一些错误啊,那么我们先来测试一下有没有错误,再重新的编译一下啊,这个时候呢我们说全是啊,重新再移一下,然后再编译生成,然后呢他又说提示有一个标签的未定义,这是由于我们改动了这个标签。
在这个地方我加了一个1c x的后缀,再重新编译一下,好编译成功之后呢,我们进入到游戏里面进行一下测试,那么启动项项目啊,然后呢这里我们需要在它的项目属性里面设一下它的调试目录,好那么我们注入到游戏里面。
挂机主线层显示外挂自动打开应用设置,开启挂机,用调试信息查看器,我们查看一下,那么这个时候呢它报异常了啊,我们先停掉嗯,卸载掉主线程退出来,那么一个是gtdt这里报的异常,一个是这个都是f 10相关的。
一个是f 10的这个get it代替,一个是f4 的这个哦,一个是放置技能的这个空有两个地方,那么我们证明就是说这两个相关的机制可能有问题,一个是我们的f一到f4 ,那么。
这个机子可能有问题,那么我们转到他相应的这个特征码看一下。
一个是f一到f 10的,那么当时我们提取的偏移的话是17114这个地方124,这里啊是正确的,124来减掉f d,那么我们啊这两个呢剪一下。
看我们的ot再次来计算一下这个数字,那么我把这个公式复制到里面。
这个幺七好像是没有错的,x17 e14 减d f d那么我们再来看一下异常的信息,f一到f 10的gd,但是我们看一下头文件啊,f一到f4 ,那么这个机子明显是错的啊,那么再来看一下它文件的生成单元。
f一到f 10的这一部分,这是f一的功能call,这是它的list相关啊,加幺,那么我们这里呢是加幺七,这个偏离啊,我们当时可能是不小心啊,这里有一个失误啊,那么这个地方错了。
那么它还有一段调制信息的异常,是在,标题标题还有一个是放置技能,这里异常,还有一个是f一到f 10的个体代替,这个我们已经改变了,还有一个就是我们f一到f 10放置这个空。
那我们看一下相应的条文件的一个设计,f一到f 10放置了这个勾啊,那么这个数值放置技能的控,这是f一和f4 的这个库,那么这个库好像也有问题嗯,我们来看一下,f一和f4 的这个库做的这个笔记。
还有应该是f一到f4 的库,我们先找到这个库库在这个地方,那么这个地方da这个地方是db,那么db呢要减掉前面的这个b,我们看一下db这个数字。
等ec那么我们转到这里边看一下它的一个偏移,是不是ec f一到f 10的这个库,那么这里呢我们写的是二八,这个库呢我们要把它改一下,这里是1c放到前面,这,这个平局我们看有没有错。
前面一个偏移41010好的,那么我们看一下还有什么地方做f一做,放置技能的这个,那我们先把这个异常清清掉啊,等一会儿我们再测试一下,这个我们保存一下,然后我们切换到这个单元。
那么我们从这里还看到有一个f一和f 10的这个过错,还有一个放置技能,这个技能呢他说这个破解是错的,7a7 a0 这个啊,那我们来看一下放置技能的这个空,在这个地方它的偏移是一七啊,慢慢c嗯。
它正确的地址,720a90 ,那么这个地址是没有错的啊,没有错的,我们把这个工程呢关掉,然后在这里来重新生成一下这个重建,再试一下,把这个ec x复制一下,在上一层吧。
那么如果我们要在这个本目录下面生成这个ex一的话,这里去掉一个点输出目的,那么同样的这里调试这里,90分钟都给我们的感情重新再生成一下,那么这个时候呢会出来一个1e x e啊,我们复制一下。
关掉这个工程,桌面上这个ex让我们删掉,复制到56页的代码,下面,替换变化,那么再重新生成一下,要等大致一分钟的时间好的,那么更新完了之后,我们再来看一下这个头文件嗯,let's go。
那么我们再检查一下,看有没有异常的一些地址,那么用用我们的肉眼来看的话,暂时还没有发现问题,那么我们还是让我们的这个代码来检测一下,那么重新生成一下,好那么我们再次运行,那么输入好了之后。
我们再来看一下挂机主线程,显示外挂自动档案,然后把我们的这个调试器开启啊,开始挂机,这个时候好像能够使用了,我们转到游戏里边来看一下嗯,那么我们的更新来说明已经完成了啊,ook这个时候没有报异常的。
好好的,那么今天这节课呢我们就到这里。
P46:057-寻路分析-相关数据准备 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么今天这节课我们来讨论一下怎么分析寻路的这个扩,那么我认为呢我把这个寻路的这个课的一个分析来分分为了两种情况,那么一种呢我们是通过关键的数据啊来理想分析啊。
比如说通过我们的目的地的一个坐标啊,这一类或者是相关的一些判断,那么另外一种呢就是因为我们在寻路的时候,肯定他要就是说像服务器啊发送一些数据,表示我得要移动到某一个点。
那么也可以通过发包的函数来来进行一个相应的一个逆向回溯,那么今天呢我们先讨论一下这个关键数据的一个逆向分析,鬼畜这个呃寻路,那么我们进行尝试看这样能不能够找到我们的寻路扩。
那么首先呢这个这些关键的数据的话啊,我认为呢应该有目的地的一个坐标,它应该会有这样的一个判断哈,根据当前的一个坐标与目的地的一个坐标来进行一个比较,那么既然要访问坐标的话。
这个坐标呢是我们当前的嗯人物角色的一个属性,那么可能呢他也会有一个关键的数据呢,可能也是我们的呃人物的角色对象啊,他也会对对它进行一些访问,那么还有呢可能还有我们的一个寻路的一个状态。
可能有这样的一个值啊,那么我们就是寻路结束了之后呢,他会把这个寻路的状态啊关掉,那么我们就不会走动了,这个人物就不会移动嗯,暂时的话可能就是这几个数据的话比较关键啊,当然可能还有其他的一些呃。
我们说的这个寻路的时候,可能呢它也会产生一个呃坐标的一个数组的一个序列啊,比如说我们在这个小地图上啊寻路,那么这个时候呢我们看到有一个有一个弧线的很多红色的小点,那么每一点的话它肯定都代表着一个坐标。
当然这个坐标的话可能早起来要复杂一点啊,因为我们不知道呃它的这个点的坐标的一个具体的一个数值,那么如果能够找到的话,它也是一个关键的数据啊,那么今天呢我们先来分析呃,看这三个数据是否存在。
那么如果存在的话,在下一节课的时候时候呢,我们就用这三个啊数据来做一个立项的一个突破口来进行一下分析,好的,那么我们首先来分析一下目的地的一个坐标,那么打开我们的c附加到游戏里面。
那么首先呢我们这个时候看一下当前的坐标是多少,我们就收x坐标,那么收到之后呢,因为xy坐标的话,他肯定能比如说是有可能它的一个主播是x y z或者是x z y。
那么这样的一个祖国或者是xy哈这样的一个组合3d游戏呢,一般它有三个坐标啊,那么这个z坐标呢有可能它把它放在中间,也可能是放到最后都有可能,那么这三个坐标它一般都是在一片与连续的空间里边。
那么所以说我们一般只需要找到目的地的x坐标了,那么后面就能够自然而然地找到它的z坐标和y坐标,那么现在的话我们不知道他要前往的目的地坐标是多少,那么现在呢我们先搜一下位置的一个初始值。
那么这里呢我们一般来说它是用佛点数来表示,也可能是用双火点数来表示,那么也可能是用我们的四字节,八字节都有可能,那么甚至有可能用字串来表示,那么我们只有一样一样的去尝试,那么最大的可能呢就是佛点数。
那么所以说我们先选否定数,再选,再选这个未知的初始值,那么选了之后呢,我们再让它跑起来,那么跑起来之后呢,这个目的地的坐标可能就有变动了,那么我们这个时候呢收下变动的数值。
那么这个时候呢我们还没有到达这个目的地,那么这个最终的这个目的地的坐标的话,应当是人为变动的一个数值,然后我们改动一下它的这个坐标啊,另外找一个来点击一下,让它进入一个寻路的状态。
那么这个时候呢我们再搜一下变动的数值,那么我们所说的是最后的这个结束点,不是前面的这个红点,然后我们再另外换一个地方再搜一下变动的数值,而且这个数字的话呃,它是呢比零一般说要大。
那么这个数字呢当然它也可能产生这个负数啊,可能产生负数,所以说我们最好不这样收,那么我们还是搜一下未变动的数值,那么现在呢是负的啊,-509,那么现在这个坐标,那么我们所以说这个时候呢我们可以搜一下啊。
负的509是负的506之间啊,这里我们收510~507啊之间的一个数值,那么受到这样一个坐标,那么我们再呃访问一下其他的,让他寻路跑起来,这个时候呢它最终显示的地址呢是879。
那么我们看一下最终他跑到的地址是不是这个879,那么最终的地址呢这个地址就是879,那么证明呢这个就是我们的目的地的一个坐标,那么我们再搜一下有没有其他相同的一些坐标。
当然现在的当前坐标它也与它的这个数字呢也相同了啊,那么这个时候我们可以搜一下呃,精确的数值,在次数的时候欣赏秒,那么这个时候呢我们未来达到一个精确的数值呢,我们可以收啊,把它转换成16进制来显示。
那么这个数字比较多啊,然后呢我们再换一个目的地的一个坐标,让这个数字来发生改变,那么我们再搜一下新的数字,那么这个时候我们可以看到,实际上呢这个目的地坐标来它也有两个啊,有两个,好了。
那么我们把它显示成我们的考点数,方便我们查看,那么这个时候呢我们就显示了这两个都是目的地坐标,那么接下来呢因为我们扫到的这两个坐标呢,它不是机子,那么所以说我们还需要来访问它的一个偏移。
偏移和机子要给他找出来,好那么这一段呢我们随便只访问了一次的这个地方,那么这个地方的话它最有可能呢就是我们的寻路过的这个附近啊,那么后面呢这一段呢他应该是在那个走路的库里边啊。
因为它会反复的调用这个目的地坐标啊,因为寻路的话它就是反复的调用了一个走路走路的一个库,那么所以说我们在后面的啊,这些地址的话可能就是在我们的整个库里面,那么我们都可以把它复制出来。
这个呢我们可以标标记一下,寻路啊,执行这个寻路动作时,只访问了一次,那么我们的寻路课的话,实际上的话他也只是执行一次,而什么会执行多次呢,走路的这个扣它会循环的在执行。
那么所以说在后面这个的话是走路客的附近的可能性要大一些,那么前面这个呢是寻路库的附近嗯,可能性要大一些,那么接着我们把它停掉,那么再来看一下第二个啊,目标地址,那么等一会儿我们再来分析它的一个机子。
那么我们先来看一下第二个呢这个数值的一个偏移,那么再次让它跑起来,那么前面这里呢它也会反复的会执行,那么这两个地方呢也只执行了一次啊,那么执行一次的我们把它分对在前边,那么执行了多次的。
我们把它分类在后边,好的保存一下,那么保存了之后呢,接着呢我们那一会儿啊,一会儿我们在d里面去追他的这个相关的一个机制,那么这是目的地坐标的一个分析,那么我们再来分析一下啊。
它相关的看有没有这个对人物角色,这个对象有没有这个访问在寻路的时候,那么人物角色对象的话,我们嗯之前好像是有分析的,来看一下,今天,那么当时我们分析的这个人物对象啊,好像是这个地址。
那么我们加上一八来看一下,对不对啊,咳,从今,那么这是我们的人物对象,这是我们的人物名,那么人物对象的话,这个也很很好分析啊,当时我们好像分析过,那么可以通过我们人物的这个名字没搜索到它。
那么也可以来通过我们啊相关的一些坐标的一些数字,应该也没有收到他,而且我们发现还有一个问题,就是这里是2d1 d这里是2018,这两个数值的话,实际上目的地的坐标哈,这两个坐标它好像也相对的比较近。
看一下三,它的其实是2。18,这是d还是相差的,还是嗯不算计啊,那么这是我们的人物的这个指针,那么我们把它加进来看一下,那么它在寻路的时候有没有对我们这个地址产生一些反问。
当然访问这个地址的地方呢非常的多啊,前面的反复的访问这个人物对象的,那么我们看一下寻路的时候有没有新产生地址,那么这个时候我们按下了寻路啊,找一下这个时候呢这几个地方呢它执行了一次啊。
那么执行一次的我们看一下啊,人物角色的访问,然后把它停掉,房子,嗯,那么这个时候呢他寻路结束之后呢,有第二次访问他,他可能会这个人物的对象里面可能会有一个什么状态这一类的啊,他再一次掉入了他。
这个时候他已经执行了两次好,相当于这个地方,那么我们把一次的地方复制一下,还有这个地方它也是执行了一次,那么还有这三个地方呢,它也是执行了一次,好的大致就是这些地方我们把它保存一下啊。
呃那么人物角色对象的这个我们也分析了,然后我们再分析一下有没有一个寻路的一个状态啊,那么许诺的状态的话,他有可能是用特殊的字来表示的,那么最常见的表示呢,它就是用我们的灵活一来表示这个操作状态。
当然它也可以用其他的任意数值,比如说他用幺幺来表示我们寻路啊,用我们啊三三来表示不许动,他也有可能,那么我们只是说这种用灵活依赖表示的这种可能性大一些,我们先进行一下尝试,那么如果他是用灵活一来表示的。
我们先把它记录一下啊,如果不是呢,我们就先分析在前面的这些数据先进行验证,看能不能够找到我们的寻路库,好的,那么我们现在看一下,现在呢他们又进入一个寻路的一个状态,那么没有进入巡逻状态的话。
我们可以尝试一下so数值零啊,重重新搜一下啊,清扫描这个时候呢因为灵活一的话,我们用一字节来表示就够了,嗯所以说这里呢我们苏宁,然后我们让它跑起来寻路,这个时候呢我们搜一下数值一。
而且我们这个时候还发现有一个问题,那么这个目目的地的这个坐标的话啊,这两个坐标呢呃它不一样了,那么哪一个才是我们真实的目的地坐标哈,我们会来看一下,那么可能是一个刚才更新的一个速度啊,它可能是跟不上。
啊我们得重新搜一下了啊,因为刚才我们这个跑的寻路状态已经结束了,那么我们在欣赏描下一,现在是寻路状态,然后呢我们让他停止寻路,那么停止寻路之后呢,我们找一下离,然后呢我们再次让它跑起来收一。
然后我们再次让它停下,来,是数字零,然后我们再让它跑起来,收数值一,然后再停下来,只有数字领域,然后我们再让它跑起来,那么数字音,再停下来数字零,这那么大概这两个呢就是我们的呃走路状态,有没有状态图的。
想,那我们再来做一下测试,因为在这里的话,我们只是来走路,那么走路的时候我们发现了这个状态是之一的,这个应该是走路,那么寻路的话,我们访问小地图,那么寻路的话,这两个人都值一啊,那走路的话只有一个。
那么所以说我们这上面这个是寻路啊,下面这个是走路,可能那么在因为在寻路的时候,他同时来走路的状态呢也要质疑,那么这个呢是我们真正寻路的状态,应该我们再来测试一下,走路的时候呢,下面这个五一。
那么寻路的时候呢,两个都不一,因为在寻路的时候,肯定他也要调用我们指路的这个空,那么所以说在这个时候呢,我们在呃寻路这个状态这里我们看它是几字节的,我们用字节来看一下啊,证明他这个地方呢可能是四字写的。
我们在这里找一下什么地址啊,访问了这个什么代码,访问了这个地址,然后呢我们再让它跑起来寻路,那么这个时候我们发现这两个地方呢它进行了比较,而且只执行了一次,那么我们把它复制下来,那么越靠前的话。
他可能性还越大,那么我们再保存一下,那么顺便我们可以分析一下他ei的这个机制是多少,看一下e si的值是129c12 f d0 ,我们看一下有没有这个数字,419多少,我们在这里面搜一下他的这个机子。
这里选是自己19412675,那么这里只知道一个地方是七次,那么这里存在一个对象啊,相应的那么这个对象的话可能是在我们这的所有对象数组里面啊,也有可能我们看一下我们的人口是31c e啊。
不是我们人物的属性的,可,那么我们再来看一下,把这个机子添加进来,看是不是这个机子嗯,我们看到这里呢是一个数组的一个访问方式啊,那么在这里的话,他可能就是我们的所有数组,而不是我们直接的这个机子啊。
所以所以说这个绿色的机制相当于是无效的,但是这里边也有很多地方访问到了这个地址,我们先把这个去掉,从最开始的这个19f开始,我们看一下有没有访问它的地方,好那么这个时候呢我们又能够找到另外一个啊。
这个机子好偏移,那么我们来看一下这个时候ex的数值是多少,ec x19 ,还有511070,那么我们把它记录下来,我们再来看一下这里的偏移是多少,i,那么e下来刚才是228的这个偏移,这里呢他只取了呃。
当时比较的时候,他只取了一个字节,而且那么我们暂时把这个人取一个字节。
那么他的第一个p是298,第二个偏移呢是二八,幺九的时候我应该只有一个偏移啊,这里加上加上298145,我170所在的呃支撑收出来,那么这个时候呢已经收到了两个机子嗯,那么我们随便拿一个出来。
用这个f598 的可能性要大一些,没有f598 ,它是一个机制,然后呢在这里我们添加它的两个偏移,一个是498,应该是228,那么最后呢它计算出来的机制就是这个寻路的状态,好的。
那么游戏呢这个时候呢呃已经异常退出了,由于我们的这个访问可能是过于太频繁了哈,那么可能是与我们的主线程之间呢,它产生了这个冲突,因为他毕竟啊多线程之间这个数据库的一个访问呢,呃平常了之后嗯。
频繁了之后的话就会出现战略的异常,那么我们重新再进一下游戏,进入游戏之后呢,等一会儿我们再搜一下其他的机子,那么这个是我们的人物角色啊,没有对象,那么等一会儿我们再搜索一下哈。
目的地坐标与我们的嗯人物对象,这个已经搜出来了,主要是搜一下目的地坐标的一个机制,那么我们再次打开游戏,那,么这次呢我们可以直接用d来找一下也可以了。
刚才我们用c e来找,那么现在呢我们可以直接用o d附下来找一下它的一个机子。
那么这里呢我们要把它记录一下它的机子呢,就是嗯水路的状态啊,那么我们再次把它附加进去,那么寻路的状态的话,其实呢它的一个298,一个28的一个偏移。
那么这个就是我们的巡逻状态啊,它只有一个字节啊,应该是,那么在这里我们也可以给它加一个相应的断点,来看一下究竟是几字节的,那么这里呢我们看到它比较的是前缀是bt啊,那么所以说呢它是一个字节的js i。
所以说这个时候呢我们把它备注一下,那么走路的这个状态的话,暂时我们用不到啊,那么寻路的这个我们暂时把它分析了就可以了,那么接下来呢我们再分析一下目的地的一个坐标,那我们看一下目的地坐标的话。
是在这个位置,还有一个访问,那么我们转到这个地方,234这个地方e d x,那么这个时候呢我们需要找1d x的一个来源,那么dx啊,它来源于ec x加298,那么所以说我们在这里的话可以这样表示。
加298,那么再加上我们的234,好那么我们在这里下一个段,然后呢我们点寻路,这个时候呢它会断下来,断下来之后我们看一下e4 x的数值是多少,我们把e4 x的数字来带进去。
那么这个数值的话也是19f开头的,这比我们这里的这个数字呢离得比较近,19f906 又不理,那么的话也就是说他的机子的话跟我们寻觅的状态的话是在一起的,他的机制就是这个啊,那么我们就用不着去找。
而且在前面的话也有啊,这个地方就有它的一个机制,他们是一起的,看着他让他跑起来,那么就在前面不远处啊,再加上这个机子就可以了,按下空格键把机子复制出来,看来这个寻路和寻路状态哈,寻路坐标呢。
他们都是一起干嘛,这里括号啊,多加了一个。
那么再来看一下它坐标的形式呃,坐标有两个坐标,19452079啊,那么它也就只有一个x坐标和一个y坐标,这个目的地坐标呢它没有我们所说的z坐标,那么寻路的话,它这些坐标看来是自动调整的。
好那么这个坐标呢我们也把它复制一下,做一下标记,那我们就做到后面一起这个状态嗯,加,加2号这个地方呢是我们的巡逻状态,那么加上我们的234,这是x坐标加238,这里面就是我们的y坐标。
那么但是另外还有一个目的地坐标,那么我们来看一下当时的话第二个目的地坐标,我们看还需不需要分析,可能这个第二个坐标的话,分起来的作用都不是很大了,嗯那么在这里呢它有一个写入的一个读取的一个动作。
那么我们走到这个地址去看一下,那么这个e a x呢它来源于是我们前面的e s i加1964,那么我们在这里呢下一个段,寻路啊,那么它是先从这个地方断下来。
那么说明这个扩的话离我们的寻路的话应该还要近一点,那么另外这个的话分布分析的话应该嗯都可以啊,我们来看一下e s i加1964,那么e s i的坐标是多少,2d低多少多少2d d b c610 。
那么我们找一下它的一个来源,加上164,那么这里的话我们也能够看到两个坐标,但是这两个坐标后的话,它有一个z坐标,然后呢再是我们后面的这个坐标嗯,y坐标,那么我们再找一下这个2d d bc啊。
它的数值的一个来源,那么我们先用c一找一下,看看成不成。
在机制,啊这个时候呢我们能够找到一个机子45f980 啊,还有这一个啊,31c163 岁,那么这个的话也就是我们角色对象的这个机制,那么就可以用角色对象呢来表示它,再来看一下啊。
对象里面他也有这样一个机制,说明的话说明我们在寻路的时候的话,肯定要访问到这个对象,要,那么我们来看一下这个是不是对象加上一八,dc啊,这个的确是我们的这个对象啊,那么我们就把这个地址记录一下。
好组织下来,那么今天这节课我们的分析呢就到这里,那么下一节课的时候,我们在利用这些数据呢,嗯再来进行我们就是群路过的一个分析,那么顺便我们把这个数据栏再整理一下。
在人物角色这里边呢,我们再加上一个呃相应的一个偏移,就是刚才我们复制的这个公式,他加上我们的啊,加上我们的161964,这个时候呢是我们的坐标指针入体就做掉,我们再来看一下是不是这样,加上1。4。
那么这个地方里面呢就是放在我们物体地坐标的指针,而且这里他接连三个啊都是放的这个目的地啊,对象的这个指针它实际上是放了一个结构的一个指针,这个结构呢就是我们所说的x y嗯,x z y。
然后这中间这是z坐标,它是稳赢的,那么我们写下p x z y保存一下,然后这个地址呢我们也把它保存一下,我们看一下我们的头文件里面有没有这个呃f59830 的这个地址,看了一下56克的著名的这个代码。
然后我们把刚才分析的这个机子啊,找一下有病,啊,这里我们找到一个,那么这个机子的话是在我们的呃动作,或者这个机子里面已经存在这个数值了吧,那么我们就也把它进行一下备注,动作克里,那么也就是这个数字。
那么这个数字呢我们另外再把它定义成一个红,现在还不知道怎么来取名这个对象啊,因为这个对象呃它是一个什么对象,我们暂时我们还不知道嗯,动作也是这个对象为机制嗯,今天我们的目的地坐标也是以它为基础。
那么暂时它把它备份一下,那么用得到的时候呢,我们再做一个相关的一个呃注释,那么这里呢我们就把它叫做动作吧,因为我们在询问一下动作啊,u3 x,那么这里呢我们到时候也把它改动一下。
就把它替换成我们这个前面的这个不就可以了好的,那么这节课呢我们暂时就到这里。
P47:058-寻路分析CALL分析测试 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么今天这节课呢我们一起来分析一下寻路的课,在第56课的57课的时候呢,我们一起分析了寻鹿相关的一些数据啊,那么我们并把访问了这些数据的代码呢做了标记。
那么这节课呢我们就根据这些代码来来分析一下我们寻路的空。
首先打开我们的固定工具。
然后附加到我们的进程里面,转到我们的第一个地址,那么这个地址呢是我们的目的地的一个坐标,那么在我们巡逻的时候呢。
他访问了一次,那我们在这个地方呢进行下段,当然这个时候我们走路的话,它不会断下,而且我们走近了,好像他也不会断断一下,我们走远一点,把大地图打开啊,因为这个扩的话。
它可能的话上一层扩呢不是我们要找的寻路扣啊,如果是寻路扣的话,应该说一访问可能他就会断下了,那么这个时候我们按ctrl f9 执行到返回,那么这个时候会返回到这个地址,我们在这个地方呢跟它下一个断点。
但是呢这个地方它可能是我们的选修课,我们做一个标记,然后再次按下ctrl t执行到返回这个地方呢,我们是第二个可疑的地方啊,你跟他做上一个标记,按f2 下段,再次按下我们的ctrl f9 执行到返回。
然后我们返回到这个地方啊,是第三个壁纸,你给他做下一个标记,然后继续的执行到返回,那么这个地方呢是第四个地址,再给他下一个段,然后我们也可以通过这个堆栈哈转到我们的b p。
那么它的上一层呢也就是我们的上一个空啊,这个地方当然也可以通过执行调返回它,同样的会返返回到这个地址,那么这两种操作呢都是一样的,那么在这个地方呢也给了下一个段,那么这里可能是我们的寻路货物。
然后让它跑起来,跑起来之后呢,我们然后再走上几步,这个时候没有断下,然后再点一下小地图的寻路,那么这个时候我们点任意地址的话,它都会断下了,那么第一个段下的扣,那么我们来看一下,那么这个扩的话。
它有可能是我们点击了鼠标的一个鼠标啊,点击的一个响应的一个扩,那么也有可能是我们的寻路,那么在这里呢我们看它有一个三是固定的一个常量,那么另外一个七八和零啊,那么另外这里有两个参数。
它显然都不是我们的坐标啊,那么四坐标的话也可能是窗口里面的相对的一个坐标,那么我们可以,那么再次执行的时候呢,我们执行到这个地方,那么这个地方呢我们一个是七八,一个是零啊,还有一个也是七八。
那么这里有一个地址,我们跟进去看一下,那我也看不到坐标的眼,那么所以说这个的话我们也把它的断点取消掉,那么再执行到下一个,那么这里有一个路障的参数是三ef。
那么这里呢一八cc 34呢是这个地方的一个地址,那么这个地方的地址的话,我们看它这里有两个数啊,这两个数的话这种数值比较大的,一般都是否定数,那么可能是一个坐标,那么另外这里还有一个验证的参数是五四啊。
那么这个站嗯这个地址呢比较考虑一点,我们转到数据窗口来看一下,那么36位的佛典数,我们发现呢这个呢是一个坐标啊,我们把它标记一下坐标地址x z y,因为中间一个是零,然后我们再次执行啊。
再来看一下呃这个数值,那么这个数值的话都在里面呢,他直接好像就是一个坐标dd sp来看一下。
那么这里呢也是一个坐标,但是与我们上一层的坐标呢它不一样啊,那么所以说的话像这种情况的话,上一层的困难应该是比较最上层的,应该是最可靠的啊,但是这个呢也有可能是啊,我们都把它复制一下。
那么然后把它的断点呢取消掉,那么这里呢它也是原封不动的啊,与上一层的这个坐标也是一样的,736多少多少,然后我们把这个段里面也取消掉,把它抓一下,抓一下相应的代码,但是这个呢它是叫里程的。
可我们跟它标记三这个标记二,那么最顶层的那个带参数的呢,我们等一会儿啊,再抓起它的一个特征码,让它跑起来按减号,然后我们退回来退回退回到这个地方,那么这个是最外层的,最外层的可能性是最大。
那么我们要优先的进行测试,那么这个呢我们标记为一,那么这三个空它的参数呢都带有一个坐标的一个地址,那么这三个扩理论上来说都有可能是我们的寻路扩,因为它的参数里面呢代表我们的坐标啊。
但是我们目前还不知道这个是不是我们目的地的一个坐标,那么接下来呢我们先对它进行测试啊,那么如果这里通不过测试的话,我们再继续的啊,下面的还有这么这么多代码啊,我们可以一个一个的进行一个测试,好的。
那么我们开始编写第一个call的一个测试,那么第一个我们首先呢要知道他压榨的参数,那么它看起来的话,这个货呢只有两个压榨参数,一个是普sh ex,另外一个是三级f,但是呢我们要确定的话。
第一个方法呢是按f7 跟进这个空,那么还有一种简单的方法,那么我们再次让它断下,我们先把它取消掉啊,先让它复活了才能够走动,好的,那么我们再次下段嗯,然后呢我们点击寻路来看一下它的参数。
那么现在我们看一下e s p的指南是c418 ,也就是这个位置我们双击一下这个地方,那么因为它或执行完了之后呢,它会执行一个return多少多少自己,那么我们这个时候来观察一下。
因为return的话也就是对我们esp的值来进行一个呃相应的增加,它会增加相应的一个数值,那我们看一下这个时候usp的一个数值,它增加了多少ren之后,嗯现在的数值的话是c24 。
那么大概是在我们在后面这个位置来了,它大概是加了啊12个字节,我们看一下日式与幺八之间的话,它是现在是c24 ,这里是c18 ,那么加了16个字节的话,呃也就是说我们的参数的话要占到我们的16个字节。
它应该是压占了三个啊,嗯三三个参数,也就是说它前面还有一个,那么另外一种方式呢,我们就可以来再次断下的时候跟到这个框里面去看一下,按f7 跟进,那么跟进了我们一直执行到return。
也可以看到它实际的呃屏占的字节数,也可以计算出它压榨的一个参数,那么我们可以看到这个时候return是零碎啊,也就是12个字节,而我们每一压压战一次呢,实际上它要让我们的1p的职能啊要剪掉啊。
应该是是要减掉啊四个字节啊,那么所以说这里呢他要加上12个字节来评价,也就是说之前的话我们亚洲的话一共12个字节,是一个分住三次亚战的好的,那么我们既然知道了,我们就能够呃它参数的一个数量。
那么知道数量之后呢,我们就知道3f4 ,还有这个呢是我们一个指针的一个地址,那么这个地址也是啊,地址的话,它可能呢呃有一片是一个什么什么结构啊,前面是一个指称,后面可能还有一片地址。
那么还有一个职能是五四之前的啊,那么五四人是第一个压榨的一个数值,那么我们知道这些的话,我们就可以开始写我们的代码测试了,第一个复习0x54 ,第二个ex第三个呢0x3 f。
然后接下来就是我们的ex为什么是e4 x呢,因为这里呢它用到了e4 x来计算我们科的一个地址,或者地址呢是存放到e d x的比例,那么最后呢叫我们1d x,那么在这里的话,后面的这个写法都很简单。
关键是我们的这个ex的这个地址啊,它究竟分配了多少个字节呃,这个结构的大小有多大啊,这个才是我们的难点,那么我们往前找一下,看能不能找到他有没有分配空间的一些相关数据,那么在这里的话可能很难找到。
可能再找的话可能要找到我们的这个函数的同步去啊,那么我们还有一种简单的方法,就是通过这个六四的这个偏移来减掉我们最小的这个偏移,最小的这个偏应该是3864-38,那么这样呢我们能够得到一个偏移值。
因为在这里的话,他出战也对,这里的相当于是我们传进去的数据来进行了一个相相当的反访问,那么最大的这个偏移,最大的偏移应该是6868 -68减掉三八嗯,那大概他的所占空间的话就是0x30 。
那么我们可以先给它分配这么大的一个空间,然后去填充相关的数据,那么这个数据呢我们就在堆栈里面进行抓取,那么看一下现在的ex,那么这一篇数据我们抓2c啊,这么多个字节,那么实际上呢加上零这个偏移来。
一共它就抓了三点各自己。
那么我们先把它复制出来,然后在这里呢我们也要跟他分配这么大的空间,那么分配这个空间的话,或者说我们依次从下面的零开始谱写复习零铺起名,谱写这个数字,这个这个这样谱写下去也可以。
那么最后呢我们这里呢给它屏障啊,a d t usp 30就可以,那么除了突袭之外呢,我们还可以来给它进行赋值,当然这个push的话,我们要从最大的数值来开始剖析,因为这这个人才是占比啊。
当然我们也有另外的一种写法哈,另外一种写法呢我们就是先分配一个空间,sub e s p3 年,然后分配了这个空间之后呢,我们就把这个暂停的这个地址呢给我们的ex。
然后呢我们再用这个ex来为偏移加0+4+8加c,这样来负责也是可以的,那么这种结构呢可能会清晰一些,那么这个呢我们因为你是在堆栈上啊,所以说这里的他的这个状态寄存器呢是s s。
那么后面呢就是ex加零开始,后面就是我们的副词啊,这个数值x坐标,然后我们把这一串的复制一下,哈哈,然后我们加上它的一个偏移484,这过的是101418142024,28,那么再加一个呢就是日c啊。
就是绿色的话,再加上我们前面的这四个字节的话,就是三零啊,全部都复制完毕,那么这里呢是我们的z坐标,它本身是为零的,那么我们传一个零值进去,那么下面后面这里来跟两个零,我们也传进去。
明确这个地方是你的一零,这个地方是零,一,是这个地方呢是f f下面这个地方呢是一,那么在下面这个地方呢,它是一个数值,具体我不知道它是多少,那么在下面呢是零,那么在下面呢,这里是一个地址。
那么一般用到这个地址的话,这个地址呢也是堆在里面的,那么可能从24开始,在后面的这些数据的话,可能都是无关紧要的好的,那么这样我们就可以进行一个相关的测试,复制一下,然后用代码输入器打开。
然后呢我们就可以开始测试输入,然后把断点取消掉。
然后我们用代码输入器啊,输入我们的代码,那么这个时候呢我们就发现了他已经跑起来了,就能够向某一个地址呢呃进行移动了,那么证明的话我们的寻路代码的话已经ok了,那么这个呢可能就是我们的寻路空。
那么我们再尝试改一下后面的数值,看它有没有影响,那么发现他是没有影响的,那么说说明后面这八个字节的话可能就可以不要啊,那么或者是无关紧要的,还改一下这个地址,看有没有用,我们发现它也能跑。
说明这个地址呢也是没有影响的,再改一下这个数字,但是这个数值改了之后呢,我们就发现它不能够跑,我们再改为一,这个时候他又能跑了,那么说明它影响的这个结构的话,大概就在二零个字节可能就够了。
但是我们可以多分配一些呢,这个也没有错啊,只是我们把多余的这一点小小的空间浪费了日子好,那么我们的call就写好了,那么这个呢就是我们的一个呃寻路的一个空,那么后面的话我们都可以了啊。
这样子都可以不进行测试啊,那么大家有时间的时候呢,大家可以把剩下的这些地方呢进行一下测试啊,看还有没有其他的地方也能够达到一个寻路的一个功能啊,那么理论上来说,在后面这些的话啊。
从这后面这些数据来追的话,可能也能够追溯我们群众的空,那么可能会要稍显复杂一些而已,好的,那么这节课呢就到这里了,那么下一节课呢我们再编写一个代码的一个测试嗯,那么另外呢这个后来还有另外的一种写法。
在这里呢我也说一下啊,因为在这里的话我们传的都是一个16进制的一个数字,不是直接传的一个法点数,那么这样的话我们来测试的时候的话,就显得的话不是很方便,那么实际上我们也可以看一下现在的坐标是多少。
是负的153和正的1545,那么如果我们要移到253 154,那么如果我们要移到这个地址的话,我们可以了嗯,用另外的一种方法来进行尝试,那么腰杀我们看16字节的153是多少,130。
那么这里呢就是获得九九十六进制啊,然后1545我们再来看一下啊,1545609,那么我们可以借助一些佛典指令啊,这个我们以前在2013的这个网速教程里面有讲这些佛典指令。
那么我们可以用火点指令呢来进行呃一些转换,那么可以使它更具有一个考图性,那么我通过不点指令的话,这里呢我们就可以来直接全复米x99 这个坐标整形的,那么这里呢我们也可以穿啊,x609 。
那么前面的这个前缀呢也可以去掉,它默认的就是16进制,那么这个16进制的话,我们要转换成借助我们的浮点指令来转换的话,他们有一个呃可以通过两个指令配合,一个是f l l d,f i l l d。
就是把整形的数字来转换成我们的佛点数,那么然后呢压到我们的佛顶上,然后我们再通过另外一条指令ftp,谈战啊,把它弹到我们的堆栈里边,这个时候呢就完成了我们的一个呃,整数转换成我们的浮点数的一个过程。
那么后边呢我们也把这一段复制一下,那么y坐标呢我们也用同样的方法,好的,那么这个时候呢它就会移动到负的1531545,那么我们来测试一下,当然我们现在要走几步,然后再让他回到这个位置去好。
那么如果我们这里的话,要其他的数值的话,我们这里来可以给它增加一下,看来它转换成十进制的话是1801,我们来看一下,那么所以说我们也可以用这种方式,那么用后面这种方式呢。
它也就是看起来呢可能要容易懂一些哈,这个坐标呢它更容易让我们理解一些好的,那么这节课呢我们就到这里,那么下一节课呢我们在编写代码,把它封装到我们的社交夹里边好,那么我们下节课再见,那么这里给一个坐对啊。
大家可以下去之后呢进行一下尝试,嗯嗯那,么根据我们下面这些代码,看能不能够找到我们的群入库啊。
根据下面这些代码进行返回进行尝试。
P48:059-寻路CALL封装测试 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么今天这节课呢我们一起来封装一下寻路的课,那么在第58课的时候呢,我们分析了这个寻路的课,那么我们把相关的资料打开再看一下,那么这一段呢是我们测试通过的代码。
那么其中这个负的九九呢是x坐标,这里是我们的y坐标,那么我们先把它测试一下。
那么打开游戏啊,修改我们的呃相应的坐标,然后呢我们进行测试对了,要注入到我们的游戏里面,然后输入代码,那么这个时候呢它就可以了,开始巡逻了啊好的,那么既然我们的空测试通过了,我们把这段代码复制一下。
然后我们添加到我们的呃项目工程里面,把第56课的代码打开。
然后我们展开我们的基础单元,添加我们相关的机制。
那么这个时候我们可以看一下,那么涉及到的机子呢只有一个人物角色对象的。
而这个机子的话我们已经有过定义啊,那么在这里呢我们直接把它替换成这个机子就可以了。
复制一下,那么在这个位置来替换成它,那么在这里的话,我们宁愿这部分数据呢就替换成e c x,要注意的是,不能够直接啊替换在这这个里边啊,不能够直接的这样替换,那么另外呢还要需要重要的是。
我们所有的都是16进制的,那么在我们c c加加编程的时候,如果你不加这个0x的前缀的话啊,他是认不了啊,不能够认识这个数据,所以说在这里呢我们每一个数前面的都要加上0x的前缀,当然九以下的这些数字呢。
我们可以不加啊,因为它代表的是一样的,可以加也可以不加,但是也不要加这个零的前缀,那么这两部分呢我们就把它变为我们的y坐标,那么这里呢就替换成我们的x坐标啊,接下来我们就可以进行我们函数的一个封装了。
当然还有这个位置,你要注意加上我们的前缀,好的,那么我们把这段代码复制一下。
然后转到我们的结构单元,转到我们的呃人物角色对象啊的封装,那么这里呢有一个选中对象的类型啊,那么我们就在它的后面的添加相应的寻路函数,啊,那么这里呢我们可以不用定义成驼点数嗯,定义成简单的整数就行了。
而且呢我们也是需要两个坐标就可以了,因为中间一个坐标的话,它都是一样的,是您可以被忽略掉啊,为了简化它呢,我们就定义两个坐标,然后我们转到呃前面这个函数的后面嗯,为它添加代码。
那么首先我们是进行一个异常的处理,那么这里呢我们打印出如果出现了异常的,我们打印出调试信息,啊,123,那么最后呢我们这个执行完了之后呢,我们还是跟他正常的执行完了之后呢,我们还是跟他返回一个数值。
那么这里呢我们返回真啊,如果是产生了异常呢,我们在这里呢就直接返回f,那么在这里呢我们添加我们的汇编代码,那么把我们刚才写的这一段啊,汇编呢我们把它复制进来,当然这一段的话。
我们也可以来用我们的呃这个临时变量来代替这个数据块啊,这样的话我们显得更加的简单一些,好的,那么我们先把它排列一下,那么还有这个地方呢,我们需要加上一个里面x的前缀,这两个地方我们也需要加上。
那当时我们测试的话,好像后面这两个数据的话都是没有多大的用处的啊,但是呢我们可以这样的啊,把这个空间呢这个结构的空间给它分配大一些啊,这样呢不容易出错,好的我们编译一下。
那么这个时候呢我们看一下他说不正确的一个操作数,因为我们这个nx呢它是变量局部变量,而这个局部变量呢它也是一个内存的地址,那么这种内存地址到内存地址的寻址方式呢,它是不允许的。
所以说我们必须来先先把它放到一个寄存器变量里边,然后呢把这个数字呢再转进去,这样才可以后面的这个y坐标也是一样,我们先把它放在inc x里面,然后再把这个数值呢传进去。
那么这个时候呢我们重新编译的话就可以了,那么我们可以标注一下这个地方呢是我们的啊,z坐标,那么这个坐标是我们的y坐标,那么前面这个坐标呢,是的,x做,好的,那么我们写好了之后呢,我们编译也成功了。
那么接下来呢我们进行一下测试,那么转到我们的mfc啊,这个单元在这里呢。
我们添加我们的测试,那么这个测试的话我们需要来带一个参数,当然你可以添加两个边界框,但是这里为了我们为了简单的测试呢,我们就把其他的先去掉啊,先把其他的呢我们先注释掉,那么我们看一下我们的全局变量单元。
是否添加了它相关的一个全局变量啊,关于我们对象角色,那么这里有一个对象啊,我们把它复制过来,啊测试单元,嗯ba会,当然之前的话我们也要用个gt dirt,看它有没有封装这个gt di体的单元。
那么这样呢是一个良好的习惯,虽然说我们没有用到里面的一个数据,那么在这里呢我们给它传入相应的一个坐标进去,那么我们最好能让他跑近一点啊,方便我们测试111801啊,那么我们这里呢就是18011800。
那么这样的话我们可以来测试的速度可以快一些啊,然后我们再编译一下,那么这里呢我们需要包含我们的全局变量单元,咳,那么还有一个问题呢,就是这样的测试的话,实际上哈呃它是容易出错的。
因为我们还没有挂靠在主线程上,而是直接调用的啊,当然我们可以先做一下测试。
那么设置一下它的一个调试目录。
嗯,好那么我们把游戏展开测试,那么这个时候呢我们发现呢啊因为这个坐标呢它离得比较近,所以说它几步就走回来了,那么我们可以走到一个远的位置,那么再进行一个测试啊,那么他这个时候呢就走到了1111800。
那么这个坐标,那么我们看一下我们的坐标也是这个负的1111800啊,所以说我们的测试呢也是成功的嗯,但是这种测试的话它并不是安全的,那么我们还需要在主线程单位呢给它进行一个相应的封装啊。
那么把这一行注释掉,那么展开我们的主线程单元,那么在这里呢我们还需要跟它封装一个啊寻路的函数,啊,那么然后呢我们再给它添加相应的代码,把这个函数的说明啊复制一下,然后我们转到它的定义后,变。
然后呢我们把这里面的代码复制一下,那么现在前面一段呢我们可以把它取消掉,那么这里呢我们还需要来给他注册一个相应的一个消息啊,这一个红用来表示了我们是呃是寻路,那么转到头文件里面。
那么在这里呢我们注册一个啊相应的消息,注意我们这里的话一定不能与前面的值相同,那么这里呢就是我们的find the way,全都好,然后呢在这里我们改变它的消息的一个种类。
当然后面的话这里呢我们第一次出现的啊,呃之前我们都是传递的字串这一类的,那么在这里的话我们需要来传递的是什么呢,那么我们需要的是传递的一个结构啊进去,那么这个结构呢它包含了两个数字啊。
那么这里呢我们可以稍微规范一点的话,我们可以去定义一个啊这个坐标的一个结构啊,那么这里呢我们简单的写一下呢,我们就直接用数组来传递这个数值进去,打错了,那么首先呢它的,呃第一个下标啊。
零这里呢我们用来存放我们的这个x坐标,放在x y,那么y坐标呢我们放在下标一这,那么这里呢我们再传送啊它的这个指针地址进去,修底针,这个指针的地址进去就行了,那么这样呢我们就能够把我们的坐标来传进去。
那么传进去之后呢,我们在这里来增加这个寻路消息的一个处理,那么在这后边我们添加一个寻路的一个处理,开始,那么寻路的时候呢,我们就调用这个全局变量啊,对象里面的寻路注意先get到,然后再去用。
然后我们再呃在之前呢我们先要去,取出取出我们的这个数组里面的数字,因为它传进来的是一个参数,那么在这里呢我们定义一个int型,另外one,那么这个指针呢我们呢就来源于它的最后一个参数。
那么取出这个指针之后呢,我们就用n i x y0 和n i x y一来把这个坐标传进去,那么我们再次编译一下,那么它的一个定义呢,我把它放在啊前面哈,这里我们用括号把它括起来,代码块,那么再次编译一下。
啊不然的话它会这里呢它编译会通不过会报错,所以说这里呢我们给它添加一个相应的一个代码块,那么这个时候我们再来进行一下相应的一个测试,那么这个时候呢我们嗯就调用这个主线程的这个函数来进行一个测试。
那么再转到我们的资源测试证,那么传入我们的坐标,那么比如说我们的-122888这个坐标,那么再次编译,嗯,这那么这个时候呢我们就需要了啊,挂解主线程,不然的话测试它是没有啊,没有这个反应的,嗯。
然后呢再做我们的测试,把游戏打开点测试,那么这个时候呢我们发现呢它也能够移动,那么我们所要的目的地坐标,我们再来看一下,可能移动了,它要要等待一些时间,那么是12888啊,现在的坐标的话应该还早。
那么我们用这个来可以快一些,12888快到了啊,最终停留在12888这个距离,那么说说明我们的测试呢也ok了,那么这节课呢我们就到这里,下一节课我们再见。
P49:060-存仓库CALL相关数据收集 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们一起来分析一下纯仓库的啊,库的一个相关的一个数据,那么陈仓库这个库的话,它一般呢会做这几件事啊,那么肯定呢它会向服务器啊发送数据。
表示是某一个物品我们存放到这个仓库里面去了,那么肯定它存在着一个呃物品的id的一个属性,那么之前呢我们也分分析了这个物品背包的这个列表,那么而且我们要存的这个物品的话。
肯定也就是这个背包里面的这些东西呢,要把它存到这个仓库里边去,那么我们怎么知道是具体是存放的哪一个物品呢,那么它在发送的时候是表示的啊,第一格的物品栏或者是第二个的这个物品栏,那么肯定他有一个啊标识。
那么有可能是用背包的这个下标来做一个标记,那么也可能是这个背包的这个对象里面呢,它有一个呃关于物品id的这样一个属性啊,某某偏移用来表示我们的物品唯一性的这样一个物品的i d,那么分为这两种情况。
那么无论是哪一种情况呢,它都会向我们的服务器发送一些数据过去啊,在我们存放这个物品的时候,那么另外一个呢它肯定叫我们存放的这个物品的时候呢,他要访问这个物品对象的一些属性啊,比如说是它的一个下标啊啊。
或者是我们说的idea啊,或者是其他的一些呃相应的数据他肯定要做一个访问好的,那么我们有了这些准备之后呢,我们就一起来看一下,那么首先呢我们打开我们的d哈。
附加到我们的游戏里边,然后呢我们用bp啊,圣的下段,但是一般的游戏呢我们可以在生的这个位置下段啊,但是这个游戏的话我们要在w a w a s,是的啊,这个地方下断了,那么按下回车之后呢。
呃当然这个时候呢他立即就会断下,这个时候我们下断了还不是时候,那么我们应该在什么时候进行下一段呢,先把这个物品来选中哈,选中这这个时候呢它应该是呃就有一个相应的对象啊,写到我们这个选中的啊。
就像地址里面去了,然后我们要放到这个仓库里边的时候呢,我们在从这个地方下断,那么这个时候呢我们再断一下,然后呢嘛按下鼠标,那么按下鼠标之后啊,这个时候呢它就像我们的服务器啊,发送了一个程序。
我们嗯这个物品的一个数据啊,那么这个时候呢我们就呃按一下ctrl f9 ,然后一层一层的回溯,一个是通过ctrl f9 ,那么另外一个呢我们可以在这个独立站里面回溯,那么我们还能够看到一些字串啊。
陈仓库的,那么我们还是用ctrl f9 来回溯,然后呢第一层,那么这个时候我们可以看到这个地方来调用的一个发包的一个函数,那么肯定还在上一层,好那么在这一层的时候呢,我们就可以了啊,开始备注了啊。
存仓库第一,然后进行下段,然后呢我们再次执行到返回,在这里呢我们也写一个啊存仓库,那么在这里呢我们也跟他下一个段,然后呢我们再执行到返回,那么在这个地方呢,我们在,备注一下,在这个地方眼下断。
然后继续返回,那么我们可以多返回七层啊,那么直到这个地方的时候呃,就在这里吧,这里从仓库,然后在这个地方你下断再返回一层,那么再返回城的话,就到这个位置啊,好了,那么这返回了五六层之后的话。
一般是够用了,然后呢我们再把按下water b啊,打开这些断点,把所有的断点呢先禁止掉,先让他跑起来。
然后再把它激活,那么激活之后马上就断下来的啊,这因为现在我没有像这个仓库存东西啊,它就断下来了,那么说明这个地方的话啊,不是我们的这个相应的一个库啊,有可能不是啊,那么我们先把这个地方先去掉啊。
只是说有可能不是,那么也有可能这个地方也是,因为我们还有一个地方打开这个断点,因为这个层仓库六还在它的更上层,但是这个地方的话嗯他们并没有断线,那么有可能的话,陈仓库和六这两个地方都有可能是我们的嗯。
这个,存仓库的一个库,那么我们再接下来再来分析一下,另外用一个物品,但是这个时候呢我们点一下啊,这个时候我们点一下这个物品的时候呢,这个地方马上就断下了啊,说明这个地方的可能性的话也比较小。
因为现在我们还没有成仓库,好的我们把这个地方给取消掉,那么存仓库山这个地方呢它也断下了啊,那我们把这个地方呢嗯也取消掉,那么这个时候呢我们在放到仓库里面啊,那么这个时候来存仓库,按这个地方呢嗯他断下了。
那么说明的话在这个地方的话啊,它是存仓库的,这个扩的可能性的话要大一些,好的,那么我们先来看一下它的一个参数,那么现在来压榨的参数有088这两个嗯,一次就是最后的,这个是零,这个是八的。
那么这个也是宝马好的,那么先把它放下,陈仓库基,这个地方肯定有个断路,那么我们再另外放一个啊,放到放到第一个,第二个这个地方,我们再来看一下它的一个变化,那么第二点的话,这里的这里有个180。
我记得是081,那么这个腰的话看起来呢有一点像是仓库的,仓库的啊,这个,数组下标,那么再让它跑起来,然后我们再存存一个东西啊,成一个这个甲进去,然后我们放在第四个这个地方。
那么这个时候呢我们发现了这个地方呢,它的下标为三啊,那么恰好的话就是我们仓库的一个下标,那么另外两个数字呢是不变的,不变的,那么这里呢也是一个,那么这个呢我们暂时我们把它这两个都复制一下。
把这个断点先取消掉,那么按减号再退回来啊,那么这个扩的话极有可能就是我们成仓库的这个扩,那么这个库的话,因为它有一个参数是啊,我们这个仓库的一个下标啊,这两个参数是固定的,那么要执行这个扩的话。
应该前面还有一个动作啊,必须要完成,就像我们之前的呃移动我们的技能到这个技能栏上一样,那么这里呢首先他需要一个选中啊,选中我们的物品,这样来模拟,那么然后再有后面这个动作才可以。
那么也就是说我们必须要有一个前提要选中它,然后呢再存到我们的仓库,但这个时候呢我们看发现呢在背包里面移动的时候呢,它也会在这个地方断下啊,也会在在这个地方断下,那么说明这个扩的话。
它实际上不是一个真正的一个纯仓库的一个空,而是一个这个物品移动的一个扩啊,应该是,但是通过这个扩的话,它应该来说也能够完成这个功能,那么我们来看一下现在ec x看一下这个参数它会不会变化。
那么这是ec x的数值,那么我们再次让它跑起来,但是这个时候呢我们看一下呃,第六个参数,这里是这里有变动了啊,这个时候是唯一啊唯一,那么这里呢是二,这个表示我们背包的一个下标,那么说明还是有区别的。
这个移动的话,那么如果这个参数为八的话,表示移动到这个仓库里面去,那么如果只是在背包里边移动的话,那么比如说把这个物品移动到啊第七个,那么它就是六啊,这个下标就是六,而这里的是一。
如果我们是移动到仓库里面的话,那么比如说我们移动到也是第六个,那么下标来是下标,这里是,但这里呢这里应该是一个分类啊,分类这里是八,这里应该是我们的嗯,背包类型应该是一个分类,看似我们的仓库。
那么我们把代表的是仓库被保一呢代表的是玩家在一个背包,或者说叫做玩家的一个数组,那么我们还还要注意一下啊,e4 x的一个数值的一个变化,那么我们再来测试一下。
那么首先我们在这里在我们个人的背包里面移动的时候,e4 x的数值我们看一下648,那么我们移动到仓库看一下,那么移动到仓库的时候,我们看一下这个时候e cx的数值而且变化了啊。
那么说明这个e c x的数值它也是不同的,我们仓库与个人背包里面的这个对象的话可能是不一样的,那么我们再做一次测试,然后取物品出来啊,也是相当于是移动,那么移动的时候我们看一下啊,68。
那么68的话说明表示了是这个啊个人的背包,那么后面这个呢是仓库背包,好的再次让他跑起来,那么知道这么多的话,我们接下来呢就可以做一个大致的测试了,那么这个空那么首先我们是一个要放到对象的一个下标。
那么实际上这个值的话,那么我们随便给他传一个值,它就会自动排列,那么第二个呢我们是是要存放到我们的背包里面,元素嗯,背包的话是一仓库18,然后下边还有一个数值,好像一直视频再来做一下测试。
从仓库取物品出来,那么这里是011,那么这个是腰,那么这个位置它也不一样,偶像那么取物品好像是妖而成,物品进去好像是零,那我们再看一下哦,这里是1b,那么1p好像也可能是下标的,我们再来看一下。
那么比如说在这里从一个物品进去再来看一下,那么这个的话好像在下面这个啊,对这个是仓库的下标,这里应该是零,那么我们存存东西的时候呢,这里是零,然后我们看取东西的是呃,取物品的时候,那么取物品的时候。
我们下面的这一个这个数字呢也是零,那么无论是纯或者是取,那么这个数值呢它都是你好的,那么这个零呢我们是一个固定式,123好了,慢慢有了这么多之后呢,我们就可以用我们的代码输入器进行输入。
那么比如说我们是从仓库取物品出来啊,然后呢我们用c x的一个数字,那我们再看一下实物品的方法,e cx的数值是648,那么我们把它复制出来,然后起飞my汉语好的,那么这呢就是一个取物品的一个库。
但是呢它必须有一个前提,要先选中一个对象,那么比如说选中这个幸运符,然后我们输入一下,那么这个时候呢我们就会把幸幸运符来取出来哈,然后呢我们再选中一个对象,这个时候呢我们也会把它啊取到我们的这个取出来。
那么如果我们是乘,比如说我们选中的是这个角,那么我们要存的话,就应该换另外一个对象,这样应该画418,这个啊,刚才是60mm看一下,那么是存仓库的话,就应该选这个吧,嗯然后呢我们需要这个数值要改八。
然后我们再测试一下,那么这个时候呢这个甲呢也就存到我们的这个仓库里面去了,但是用这个扣的话啊,相对来说相对来说的话比较麻烦,他要执行两个动作啊才可以才可以,那么我们下一节课呢我们一起来分析一下。
另外的还有一个空,那么另外这个库呢在我们的这个呃备注的时候呢,叫仓库一看,我们看一下有没有抓取相关的一个信息出来看,哦对了,这里有个陈仓库一,那么下一节课我们再分析一下仓库,一个库。
那么这个呢也当作是一个坐力啊,大家一起去分析一下这个库的一个参数,看第二用这个扩的话,能不能够有一些呃辩解啊,能不能够简单一点,是我们这个存仓库的这个动作,那么今天呢我们就分析到这里。
我把相应的代码把它复制出来,那么这个参数呢八表示是,仓库一表示物品,那么这个呢是我们的一个下标,那么这个下标的话,实际上它可以是任意的一个数字都可以,只要不超出我们的这个列表。
那么我们固定可以把它设为一嗯,可以,因为它自动会调整啊,这个那么主要就是这两个了,一个是呃八代表是纯仓库,一表示是曲物品,但是它有一个前提啊,要先,选中物品,那么如果我们不选中物品。
我们看调用调用会出现什么问题,那么直接我们这样调用,那么直接这样调用的话,我们发现了没有任何的效果,那么必须呢我们要选中一个东西啊,再调用,当然我们如果只是选中这里面的东西的话啊,选中仓库的东西呢。
存到仓库的话,它也是相当于是在这个仓库里面这样移动啊,那么我们找到的这个库呢,它实际上不是我们重复品的库,应该是一个,物品移动后,那么既然是物品的移动货的话,那么理论上来说的话。
在这个物品移动的内部的话,肯定有由我们这个程序啊,仓库的这个库一个是全物品的仓库,另外一个是取物品,取出仓库,这两个动作的话,他应该都在这个扩的一个内部啊,那么说明这个扩的话作为一个突破口。
应当也是很关键的,那么我们今天这节课呢我们就先分析到这里,那么下节课呢我们再详细的分析这个呃存储物品的这个空,好的。
P5:016-代码运行久了游戏为何异常 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,QQ1503307,欢迎大家参加郁金香技术编程培训,那么我们在第14课的时候,我们测试我们物品使用的课的时候,那么当时出现了异常,那么但是这种异常一般情况下它不会出现。
一般情况下不出现,因为当时我们所用的注入的窗口,它与我们的游戏的主线城窗口它是不对的,也就是说它是两个线程,那么相关的有一些数据,它是共享的一些数据,那么当游戏的主线城也在访问这个数据的时候。
而我们的编写的代码也在访问这个数据的时候,那么有可能就会产生一些冲突,造成我们的这种异常,那么这种异常的话,平时的话它可能不容易出现,但是它容易造成我们编写的代码的一个不稳定性,有的可能是几个小时。
那么甚至更久的时间,它才出现这种,出现这种错误,那么今天我们通过C++的代码来说明一下,这种异常是怎么产生的,那么我们该怎么解决这种未知的一些异常,那么我们打开OS2010。
我们用一个MFC的程序,说一下,那么这种数据的话,一般来说是一个多线程访问一些共享的一些数据,也就是我们游戏里面的,比如说怪物列表或者是背包的一些列表,这样它有可能造成一些冲突,多线程的时候。
因为我们的线程与游戏的线程,它们有一个同步的一个机制,那么在这里我们添加两个按钮,复制一下按钮,按住Ctrl键,然后拖动一下,就可以复制它了,然后我们取名游戏主线程,那么我们取名为外挂线程。
那么首先我们模拟游戏的数据,定义一个全局的一个数据块,那么这个数据块,我们用一个文数是10的一个数组来表示,给它复一下数字,好的,那么另外我们再定一个全局的一个变量。
这个是一个指针指向刚才我们的游戏的数据,也是一时,这里我们定义成指针,那么定义成指针之后,我们模拟一下游戏的一个主线程,我们先写一个游戏的主线程,那么在这个线程里面,我们写一个循环,循环的操作。
那么循环是每次的我们先给这个指针复出,这里我们用N设定来给它复出,GP,全部复制为空,它的大小就是sizeO,GP复制为空之后,我们再用一个Full循环,把这个数组的这些相应的地址,复给这个指针。
那么这里我们可以这样写,也可以有另外一种写法,取它相应的一个地址,它就这样写,随便怎么写都可以,那么这里我们相当于给它复制,复制,这个指针复制,那么复制完成了之后,我们后面模拟一个物品使用的库。
那么我们另外写一个,选一个core,那么在这个core里面呢,我们先把第15个的打印调试信息的代码,先复制过来,这是我们上一节都写的,那么在这里,我们就把指针里面的速度的信息全部把它打印出来。
那么这里呢,我们也要用一个循环,因为它有第10个,那么我们是把地址里面的,实际上就是打的这些数据,只是我们在这里是用指针的方式来访问的,然后进行一个换行,那么为了让它打印的速度放慢一点,方便我们测试了。
这里我们在看有一个一秒的一个时间的一个间隔,那么我们这里是游戏渲染在使用,那么这个函数我们写完了之后,我们先更新一下,没错,我们在这个资源视图里面先创建一个主线程,那么在这个主线程里面。
也就是在引起来的主线程,那么只需要一个参数就行了,第三个参数就是我们的主线程的一个地址就行, the game's GameCenter。com。cn,我们先测试一下开启我们的游戏的主线程。
RTPUT输出的时候出错了,我们来看一下游戏主线程转到地址这里,对了,我们扫描了一个参数,再看一下,那么这里它就会去骗你我们的数据,读出它的一个数据,这是我们主线程这样读的话,它是不会出错的。
反复的读都不会出错,但是如果我们在另外再开启一个线程来调用一下,这个MuseQuotes,也就是物品使用的这个库,比如说我们再开一个线程2,当然我们要先写一个线程,我们把这个游戏的主线程把它写一下。
但是写一下我们只使用后面这一部分,那么这里我们也循环到调用台,当然为了方便测试,我们加上一个延迟,用不了的一个延迟,把上面的复制一下,这里来改成我们的线程,那么这个时候就有两个线程了,一个是我们的线程。
一个是游戏的线程,那么我们再来访问,那么只开一个线程的时候,这个时候你随便运行多久,它都是不会出错的,但如果我们把外挂的线程给开了,开始它也不会出错,时间一旦久了之后的话,它就有可能出错。
那么有哪种情况还可能出错的,我们可以把这个时间再给它调快一点,这里我们调成或者是把上面的时间,我们给它调慢一点,在这里复制,这里我们给它加上一个延迟,那么这样的话,它的异常就容易体现出来。
那么这个时候我们再开启我们的外挂线程,去访问它,那么当访问到一定的程度的时候,访问到这个位置的时候,我们就出错了,为什么会出错,实际上我们从这里也能够看到一些,这个时候我们主线程的话,打了一个0。
这是外挂线程,是这里,那么这个指针的话,它所指向的可能还没有进行一个初始化,那么这个时候为什么会产生冲突,那么实际上就是我们在这里,因为这两个数据线程的话,都会来访问我们的指针,访问我们的指针。
但是当我们这个游戏的主线程,比如说这里的下标,它只是这里的下标为4的时候,它只有前面那么4个指针,它对它进行了一个初始,它能够正常的访问,如果这里下标超过了4,在另外我们的外挂线程里面,它如果超过了4。
因为它这里会转到我们的,比如说固值使用物品这里面,那么如果这里的话,它爱的下标超过了4,那么后面的因为这些,它还没有来得及复制,那么它只是一个空指针,那么这个时候的话我们去读取它。
那么肯定会产生相应的一个异常,会产生异常,但是如果是我们自己的代码的话,要解决这种异常的话,很简单,我们可以用事件的临界区,或者是信号量这一类的,或者是加上一些其他的一些条件的,一个判断。
都可以解决这种冲突的一个问题,但是我们恰好是这个代码,我们是模拟的游戏的一个代码,那么游戏的代码,它是很方便我们Hook,这一类的,那么所以说我们要用另外的方法来解决,那么解决的办法就是我们可以了。
挂靠在用我们的代码输入到主线程里面来运行,它就不会有这种冲突,好,那么我们接下来讨论一下我们自己的代码,如果是我们自己的代码,怎么来解决这种数据的一个冲突。
访问的一个冲突,那么这里我们实际上我们系统,它提供了一些API接口,比如说我们的临界区。
比如说临界区,它提供了一些相应的,那么我们可以创建了一个临界区,先看一下相关的一个函数,那么这个是一个初始化一个临界区,它就是用来解决这种数据的共享数据的一些冲突,那么我们要使用一个临界区的话。
我们首先要对它进行一个初始化,当然我们先定义一个临界区的一个变量,定义了这个变量之后,我们首先要对临界区要使用它的话,进行一个初始化,把它的指示传进去,那么初始化做完了之后,我们在这里共享数据访问。
这里我们可以进入函数的时候,我们就进入这个临界区,进入我们的临界区,那么使用完这个共享数据了,然后我们再离开这个临界区,这个单手晃看一下,相关的一个函数进入临界区,那么使用完之后。
我们离开这个临界区就可以,那么这样的话,我们这两个线程实际上它就是排队,在使用这里面的共享数据,它就不会同时的来调用这个空,那么还有我们这个地方,线程里面也要加上这两句,用到了共享数据的这个地方。
都要加上这两句,那么在这里,我们要加上这个进入临界区,那么后面我们也要加上,然后我们再来运行,这个我们要把前面的那个LP,说了它表示的是指针的一个类型,我们这里是直接传到地址,所以说不需要指针,好。
那么我们先初始一下,初始化一下临界区,然后再开启我们游戏的一个主线程,然后我们再开启我们外挂的一个线程,然后我们再开启我们的一个主线程,然后我们再开启我们的一个主线程,然后我们再开启我们的一个主线程。
然后我们再开启我们的一个主线程,那么这个时候外挂线程,它会一直的在这里等待,但是一直等不到,因为这个主线程,它一直在使用,那么也就是说临界区,它相当于被锁死掉了,一直都是它在用,那么要解决这种办法。
我们在这里来开一个Sleep,那么这里我们腾出一点时间片,来给其他的进程使用临界区,这里我们可以调小一点,这个时候外挂线程和我们的游戏的主线程,就会能用的来使用这个库,而且他们就不会产生相应的冲突。
好了,那么这一节课我们就讨论到这里,那么我们下一节课就解决我们的游戏的一个冲突,把我们的代码到时候挂靠在我们游戏的,主线程上面来解决共享数据的一个冲突。
(字幕製作:貝爾)。
P50:061-存仓库CALL参数分析测试 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,欢迎大家参加郁金香技术编程培训,那么上一节课呢我们已经分析了一些纯仓库的这个功能的一些数据啊,那么以及参数呃,那么这节课呢我们再来对他的一个相关的机制进行一下分析。
也就是ecx这个参数e d i它的一个来源,那么如果我们分析到这个参数的话,实际上那么前面的1b x和啊,这个ecx我一dx的数据的话,就直接可以通过它的偏移来来获取。
那么只有这个下标呢它是一个唯一的参数,相当于那么实际上这一个e4 x或e dx呢,它的来源的话都是来源于e d i加上这个偏移,而这个扩的话,实际上我们在前面的物品使用的库里面的话,就见到过这两个偏移。
那么我们再来回顾一下,呃物品使用的这个空,那么当时我们分析的物品使用库,它也有这两个偏移,那么也是瑞士啊,所在的代码段的话也是在这个附近的,但是呢它调用的库不一样,7203908。
那么这里是720a20 ,但是前面的这几个参数的话,它的形式也都是类似的,当时我们分析的时候的话,也是呢前面这里呢是参数,这里呢一个是16081b0 d8 e x e4 x也是来源于这两个偏移。
那么这里呢他也是啊,当时我们这个这里是背包的一个机子啊,但是呢这是我们不凭使用的这个空,那么今天我们的这个扩的话,那么这个参数的话有可能的话也是一个背包的一个机子,那么我们先来分析一下。
用o d先加载到我们的游戏里面。
先打开游戏。
那么先附加到我们的游戏里面。
那么首先我们先在背包里面进行一下移动啊,移动到比如说任意一个呃,让它断下,让我们上一节课所分析的这个地方。
先转到ca a2 e这个地方,转到之后呢,我们进行一个下段,然后呢我们先在背包里边啊移动,那么这个时候呢我们发现在背包移动的时候呢,它也会断一下啊,因为我们上一节课分析了。
那么这个呢是一个呃物品移动的入口,那么只是说可以用通过这个物品的移动课呢,来实现一个成仓库和嗯移动到我们的这个技能栏这一类的操纵,那么它在一移动的同时呢,我们看一下它的ecx的参数是多少。
嗯ec x当时我们说它是一个背包的一个机子,那么我们先把这个数据来记录一下,那么我们这次那么有可能这个就是背包的机子,那么我们看一下现在背包的机子是多少,最新的背包机制,那么是这个数字。
嗯嗯,那么我们可以可以看到啊,这个背包机子这里成的这个对象呢的确就是这个对象啊,那么也就是说,这个对象的加上我们的,410偏移,这就是我们背包的第一个,那么它加上5c,这里呢就是它的一个名字。
那么说如果我们换成仓库的话,它会不会这个地方就是我们仓库的一个呃相关的一个对象呢,那么我们在这里呢也跟他下一个断点,那么我们就在仓库里面啊移动一个数据,那么取出来或者是什么的啊。
那么我们先在仓库里边啊移动一下,那么这个时候e c a x的e d i的这个数值我们要看啊,因为我们执行一步之后呢,才会变成e c x好,那么我们看一下这个时候e4 x e d i的数字呢都是6090。
那么我们找一下这个数字的一个来源,先打开我们的c一附加到六七点,选16进制,那么这个时候呢我们会收到两个地方,那么一个人是,31c9 a24 ,那么另外一个呢是这个i d里面的啊。
那么我们在游戏里面再搜索一下这两个常量,我先下一个段,然后再搜索所有的常量,那么这个时候呢我们可以搜索出很多很多的地址啊。
但是呢我们任意的拿一个地址先来做一下示例,比如说我们这个地区,那么我们替换掉前面的这个背包的机制,因为我们发现的话,但凡是这种背包的这种数据,无论是我们的技能栏背包还是我们的啊物品背包。
以及我们嗯其他的这些背包的话,还有就是我们动作的这些背包呢,好像它都有一个410的偏移,那么我们也可以把这个410的偏移来加上去试一下,那么这个时候呢它会显示是皮革啊,恰好是他的第二个。
第二个呢是一个金刚石,那么我们选下标一啊,这个时候呢金刚石全部气功等级二,增加它的属性也在里面,那么第三个呢是一个青玉珠,那么说明我们找到的这个地方的话,它就是我们的一个呃仓库的一个背包的一个机制。
那么我们顺便也把它记录一下,那么同时呢把它的公式我们也记录一下,好的我们也把它复制在我们的后边。
那么我们看一下这个仓库对象,它的一个属性是什么。
那么它的属性呢是ea,那么背包的话,这里呢也是1a,那么它都是背包里面的,只是呢这个是仓库的一个背包,我就把它放在这里边嗯,这是仓库背包的一个机制,怎,么,那么或者我们取存仓库列表和背包列表的话。
这样来便于我们的一个区分好的保存好之后呢。
我们关掉,那么我们再退回到我们之前的这个地址,那么现在的话我们大致知道了嗯,它的一个对象啊,哈哈,那么这个690的话是我们的仓库背包,这个是我们的背包,那这个呢是仓库列表,那么我们再来做一下试炼。
那么如果我们是乘务频道,背包里面,我们看一下他用的是哪一个机子,那么我们这个时候呢我们发现的话啊,把这个数值也是八零,那么实际上这个的话我们可以把它啊射程e也可以,因为它会自动的调整,这个时候移动。
那么我们看一下ec x的值的话,我们存到仓库的话,呃,移动到啊,那么这个e4 x的话,我们要存到仓库来,那么这里就是嗯仓库的一个机制,那么这个一是x的话,我们就可以这样的倍数,这是我们的目的地列表机制。
那么如果目的地是我们的背包的背包的话,那么呢嗯这个机子呢就是背包,如果我们的目的地是仓库呢,这个地方呢就是仓库,那么另外呢它两个参数的话都是来源于我们背包机制的一个1608。
以及一个1b d0 的一个地方,好的,那么有了这些数据的话,我们就可以了,把这个呃地方呢把这个扣啊重新的整理一下。
那么我们就可以了,第一个是,把这前面的代码我们可以直接把它抄下来,当然在抄这段这段代码之前呢,我们还有还有一点要做啊,就是要把他的机子给它加加上,仓库的这个,two two two。
那么另外的话这里呢我们就可以直接仿照他的来复习就行,第一个坐标呢我们陈仓库里面的话,我们直接呃嗯复习一就可以,任意的字都可以,实际上只要不超出它下边的范围,应该都是可以的。
那么第二个数字呢就是我们的ec x,第三个数字的人就是一tx啊,那么这样的话我们呢也要方便一些,我们可以少少用两个场面啊,因为这个偏移里面呢它自动的就代表了一个目的地的一个类别。
那么最后呢我们这里呢用e c x一加照着写就行,最后调用这个库,当然我们说了,他也有一个前提啊,那么有一个前提呢,就是要先选中我们的这个物品,那么选中物品的这一部分的话,之前我们已经有过这个分析。
那么我们再来看一下移动技能相关的这个机制,啊这个drops scary这里了,当时的话我们有对它相关的一个参数进行一个分析,放置技能,这,也是另外一个,我这里有一个选中物品的这个机子,那么就是这个地方。
那么当时选中技能的话,大概是在这个位置,7a a372 ,那么我们再转到这个地址看一下,但是呢这个地址的代码呢它已经发生了一些变化啊。
这个时候我们可以看到,那么发生了变化的话,我们先搜一下它的一个特征吧,游戏行。
有更新的啊,那么选中我们的大数据,然后这里可写呢,我们把它去掉。
那么我们重新再搜索一下,那么这个时候已经变成7a2 f。
那我们改一下2f1 。
那么收到帖子帖子码之后呢,我们可以看到这里呢直接写入我们的ex就行了,那么写入到这个地方,那么实际上它要选中的话,就是我们啊我们要存到仓库的话,就是选中背包里面的一个物品好。
那么这一点的话我们用代码来实现呢,呃用户从汇编的话相对要麻烦一些啊,那么写好了之后呢,这里呢它还有一个往这里写了一个东西,那么这段代码的话应该就是要嗯选中某个对象啊,并且显示出来啊。
那么在这里的话它传到了b i呢,是他的机子1b x是它的一个下标,那么实际上我们也只需要把这一段代码的话啊,复制一下就可以了,那么选中对象的话。
这里呢我们最好呢还是把它整理在哈相应的这个单元里选中或评测,那么这段代码呢我们可以啊,直接也把它照抄下,那么后面呢这几句呢都是一个读取数据的啊,没有写入数据,那么你们来上来说的话。
对于我们来说的话就没有必要了,那么我们所需要的就是前面的这一段呢写入的这个数据啊,需要写一个数据,因为读取数据的话,它是为了后后边的这个一个比较判断,这里为了一个相应的一个跳转。
那么所以说我们要需要的呢就是前面这些主要是写入的这一段,那我写入的这一段呢,我们还有一个e d i或e bx呢,需要给它赋予一个初值,那么这个eb x就是我们背包的一个下标啊。
那么背包的某个物品我们要选中它,那么这里呢应该就是我们背包的这个机子啊,那么我们先在这里看一下我们现在背包的机制是多少,那么我们看一下这个背包机制还可不可以用啊,嗯,那我们看一下背包的第一个。
在进到游戏里面看一下,那么看来的话是可以用的,那么我们再看一下第三个是不是相应的幸运符啊,那么证明这个机子是可以用的,那么我们把这个机子呢把它复制出来,选中物品这方,那么di的这个数值我们把它写好了。
那么另外还有一个e bx蓝色背包的一个下标,那么我们也需要把它写好,那么我们就写它的第一个,第一个就是零,那么这就是我们的选中哈物品,那么我们先来测试一下选中物品的这一个啊,第一步。
那么现在我们是没有选中的,那么首先呢我们用代码注入器啊,把我们这段代码复制进去,那么我们再做一下最后的检测,那么看有没有相应的计算器没有初始化的,那么用到的嗯,一个是e d i初始化了。
e bx呢也初始化了,那么后边的话这些呢都是另外的一个曲子,就用不着还管它了,呃那么注入到一部戏里面,好的我们运行一下代码,那么这个时候的话我们发现呢他就选择选中了第一个的这个物品啊。
那么我们把断点呢取消掉,那么如果我们要选中这是第七个的这个物品啊,那么我们要选中它的话,我们改变一下它的下标试一下,那么现在移移动过来了,这个鼠标下面的图片呢没有变,那么在移动过来我们发现呢。
这个时候就选中了第八个的这个相应的金刚石,那么如果我们要选中这个含义时的话,回避是十这个的话,那么我们这里下标可以选,那么移动到第二个思想,但是这个时候呢我们发现移动的时候好像还有一点问题不能够移动。
你这样搞,本来这个时候就是不能够移动的,因为我们打开了仓库,如果没有打开仓库的话,应该说可以移动,那么这个时候呢我们可以把它放到第二个啊,那么如果是没有物品的话,可能还会出错啊。
那么这个下去之后我们再做测试,那么第四个的物品的话,我们也可以做一下尝试,第四个是这个幸运符,那么我们移动到啊,第二个好的,那么移动的这段代码呢,我们已经呢就是选中物品的这段代码呢,我们已经把它写好了。
那么如果是要选中仓库的这个物品栏,也应该可以用类似的一个办法,好,嗯,嗯嗯,那么我们的第一步已经实现了,第二步呢就是调用我们的移动的这个扣,那么移动的扣我们放在下边,再来看一下我们移动的相关的一个参数。
那么这是移动到我们的仓库的这个代码,那么这个下边的话它是可以为一个呃,零到下边的一个最大值应该是都可以的,因为在城仓库的时候,他的目的地的一个呃这个下标的地址的话,它是会自动调整的。
那么我们把这段代码你复制一下,那么复制到里边啊,那么理论上来说,执行完上面的这个代码之后呢,我们就会把背包里面的某一个物品的存放到我们仓库里面,那么我们再来做一下测试啊,打开我们的仓库。
那么这个时候我们把第一个的这个物品存进去,啊哈,好的,那么这个时候成功了,如果我们把第二个的物品存存到这个仓库里面去,那么从第三格的物品,那么这是第五格的物品,嗯那么这第五格的话啊。
我们应该是存的是第六格哈,第五格的话,这里呢下标是四啊,所以说的话我们在纯仓库的时候呢,我们要做一些判断啊,看它相应的个相应的背包里边是不是有这个对象存在啊,如果是不存在的话。
我们这样把它放进去的话就会出错,好的,那么我们把这个代码呢嗯存一下档,那么下一节课的时候呢,我们把它整理成我们的一个代码啊,存仓库的,那么在这段代码的功能呢,就是,把背包里的,作品也是移动到仓库仓库啊。
那么是通过这个下标来移动的,它只有一个参数法,就是这个下标,那么其他的这些都是常量,但是呢在这种存仓库的方式呢,它有一些弊端啊,就是呢他还需要先打开我们的npc,然后再打开仓库之后。
他才可以做这些相应的动作啊,那么我们在后面的课程里边呢,一步一步的来完善这些啊,那么有时间的时候呢,大家也可以分析一下存仓库,一这个库看调用它来存放到我们仓库里面的时候嗯,会是怎样的一种形式啊。
需要是不是会更加的简单一些,那么这节课呢我们先到这里,那么下一节课呢我们封装相应的测试代码写成,把我们的这段代码写成我们的呃函数,好的,那么我们下一节课了再见,好,这个应该是一个分类的一个编号啊。
嗯仓库的时候好像是八,背包的时候好像是一啊,在背包里面启动的时,那这是一个背包的机制,那么这个呢是仓库的介质啊,这个是最高的介质,这个是仓库列表气质,好的,我们下节课再见。
那么这节课的作业呢就是把这段代码了,大家自己把它呃,用c语言啊,把它编写成一个啊相关的一个函数,好的。
P51:062-移动物品仓库代码封装 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么今天这节课呢,我们对前面分析的这些数据呢进行相应的封装,先打开第59课的代码。
那么首先呢我们把仓库列表的机子以及移动盲物品的这个扩展,这个地址呢我们放到我们的基础单元。
那么然后呢我们需要对这下面的这一段代码来进行一些处理。
首先呢背包的机子呢我们把它替换成红。
你看。
那么然后是后边这些数数字的,我们把它也进行相应的替换。
那么这个呢我们把它替换成我们的选中的物品技能的这个红啊,在这个地方。
那么还有一个呢也就是仓库的一个机制,我们也需要进行一个替换,那么最后呢是我们的这个扩扩呢,我们也需要替换成一个红,但但是这个地方呢我们不能够直接的替换,那么我们需要先把它放到我们的一个寄存器里边。
那么这里呢我选1a x,好的,那么做完这些工作之后呢,我们再把我们函数的这个格式添加到我们的相应结构里面。
那么在这里呢我们添加到背包列表里面,那么在这里我们可以给它加上一个前缀,也可以不加啊,那么加上前缀之后呢,我们方便复制,那么复制这个函数的一个说明,然后我们对它进行一个代码的添加,转到第一。
去掉后面的分号,先随意的给他一个返回值,然后我们再选中背包里面的某一格。
那么我们先把前面的这一段代码复制进来。
那么因为我们需要读取机制这一类的,那么我们也要做一个相应的异常处理,二,哈哈哈,复制一下哈,然后粘贴到我们这个地方,啊,然后这里呢我们需要来进行一个汇编的快的一个说明,哈哈,对它进行一下整理。
然后这个地方呢是我们背包的下标,那么我们把这个下标值呢把它传进来,那么这个地方如果出现了异常,当然我们返回flash或者是返回空,那么如果这里返回空的话,我们返回类型呢我们最好把它改一下。
那么这里我们有一个取出的对象,那么如果我们选中的这个对象啊,指定的这个下标那一个他没有这个对象存在的话,那么呢我们就返回相应的就返回空啊,那么在这里呢我们在另外的建一个变量,用来指向这个对象。
那么这个ex呢就是我们根据下标取出来的对象,那么在这个时候我们把它放到我们的临时变量里面,那么最后呢我们在这里来返回这个对象就可以了,那么所以说这里的类型呢我们也可以改变一下啊,那么我们编译一下。
在这里呢我们把它的一个默认值来给它取消掉,然后再编一下,重新编译所有的这个代码,好那么这个时候编译成功了,那么我们进行一下相关的测试,那么要测试的话,我们需要在主线程单元啊,测试的这个代码这里。
那么先把后面的这个注释掉,多余的啊,这是技能的一个偏离,那么我们选中第一个啊,这里我选择第一,然后切换到我们的资源视图窗口啊。
测试这个地方来调用我们的测试函数,那么调用的时候呢,我们把后面的寻路的关掉,再进行编译。
那么我们看一下第一个是瑞把武器,那么我们挂机主线程测试,这个时候我们移动到游戏窗口的时候,我们发现他已经他选中了我们的这个相应的物品,那么如果我们第一个是这个相应的金刚石,那我们测试的时候呢。
我们发现了它也能够选中相应的这个金刚石,那么证明了我们的测试是成功的,那么接下来我们嗯嗯。
进行第二步啊,也就是调用这个移动移动物品到仓库里面,那么这是它的一个相应的一个下标好的,我们复制一下这段代码,在这里呢我们也需要来添加一个异常处理,那么添加我们的会汇编去复制进来,那么如果出现异常的话。
这里呢我们就返回数值零啊,那么如果是没有产生异常呢,我们返回数值一,那么这里呢是我们的一个下标,那么这里呢我们还是把这个下边那个数字呢给它传进来,那么我们先把它放到我们的呃,另外一个ex这个先读出来。
然后呢再把它进行一个复习,嗯,好的,那么我们再编译一下嗯,如果成功的话,我们就能够把指定的物品来,能够把它移动到我们的仓库里面去,那么我们再进行一下相关的一个测试,那么移到我们的主线程单元。
那么选中第一个之后呢,我们就把它移动到我们的仓库里边。
那么这里呢应该已经有一个默认的一个数值了,那么这个默认的数值呢,我们把它放到头文件,说明这,应该是在这个地方实现了,啊,那我们再看一下前面的一个说明,好的,那么我们在主线程单元呢添加我们相关的一个代码。
那么当然了,这里我们也可以给他传一个数字进去,那么我们看一下现在第一个呢他没有这个物品,那么首先呢我们需要来测试的时候,我们需要把仓库打开,那么打开之后呢,我们呃首先我们是需要第一个有一个相应的物品。
那么我们以这个骨气无力,那么我们化解到主线程,然后测试,那么这个时候呢他没有这个反应啊,那么我们先用调试器啊,信息啊,查看一下调试的一个信息。
那我们再来看一下我们的这个相应的代码,那么已选中了第一格的物品,然后是移动到我们的仓库里面,那么我们再重新编译一下,子,你,再测试一下,那么这个时候还是没有反应,我们在这里打印一段调试信息。
看我们这里有没有被执行到,嗯,那么这段代码呢它是被执行到的,但是没有出现相应的效果,那么可能是我们后面封装到这个函数呢,它出了问题,那么我们再来看一下相关的参数,他也没有出现一个相关的一个异常。
仓库基层,那么我们再把这里看是不是这个参数的一个传递出现了问题,那我先把这个参数啊这里改一下嗯,然后我们再编译重新再看一下。
那么首先呢我们看一下相关的这些机子是不是正确的,我们再来核对一下呃,仓库列表的一个基础,3140f4 ,那么我们再看一下前一刻更新的。
31c0 f54 。
嗯嗯那么我们先测试一下这段汇编代码。
我们看能不能够执行,然后把下标为五的这个物品呢我们存到仓库里面去,我们看一下下表为没有东西啊,那么我们第四个这里有个戒指,那么我们下标为三啊,试一下,那么证明我们的代码是没有问题的。
那么我们用这段代码都是可以呃,那么可以执行的,那么我们再来检测一下我们的这个c语言里面的这个代码的一个问题。
那我们先进行一下对照啊修改,那么可能是后面这一段出了问题,31c9 好像是这个这个机子好像是出了问题,那么我们知道这个仓库的列表机制,这个地方嗯,把它进行一下修改,然后我们再进行测试,挂在主线程中。
那么这个时候呢我们测试成功了啊,那么我们能够把我们背包里面的物品移动到我们的这个仓库里边,好的,那么这节课呢我们的测试就到这里,那么这节课下去之后呢,大家也去把我们的呃相应的这个机子的特征码啊。
进行一下这个收集仓库列表的。
还有这个移动物品的,然后呢添加相应的代码,那么我们把它更新到我们的头文件里边。
好的,那么这节课我们就到这里,那么呃还有一个作业呢,我们就是这里来留了一个函数,让大家自己去封装一下,那么也就是我们在存放的时候呢,我们不通过啊下标,搜索到之后呢。
我们直接就把相应的物品栏存到我们仓库里边去了,大家可以呃运行这样一个函数,那么编写这个函数的时候呢,我们可以借用一些现有的函数,那么比如说betty goindex或类啊。
那么这个呢它就能够取得相应的这个下标,然后再来调用我们的这个ca库组,下周应该就可以了啊,那么大家自己下去动一下子,那进行一下相应的赏识,那么并且把我们的机子也进行一下更新好的。
P52:063-装备更换功能分析 - 教到你会 - BV1DS4y1n7qF
大家好,我是玉溪香老师,前面的几课呢我们分析了移动物品的这个库,那么这节课呢我们在他前面几节课的一个基础上来分析呃,更换我们装备的这个库,那么比如说我们要上一个装备武器到这个地方。
那那么实际上呢它也是从这个背包里边的移动,我们的这个对象到这个装备的这个列表里边,那么可能有可能的话它是调用的同一个库啊,所以说我们可以接着上一节课呃的这些数据来继续的进行一个分析。
我们打开第61课的相关的这个代码,那么我们在相应的这个扣嗯,这个地方我们进行一个下段先进行尝试。
那么我们先打开d附加到游戏里面。
那么在这个物品移动的这个库呢,这里我们进行下段,那么因为我们更换装备的时候的话,它也是一个物品的一个移动,那么可能会在这个地方断下,那么这个时候我们看它一点也断下啊,从这个地方那么断下之后呢。
我们看一下现在的e4 x是680啊,那么我们记录一下这个ex的一个数字,那么并且呢我们看一下它是不是一个相关的一个数据,加上我们的410加上c你们看一下。
那么这个时候呢我们发现了他的第一格的话是一个地藏枪一,那么第一个呢他应该是中间这个位置是他的第一个这个数组啊,因为它的格式的话,这个对象的格式基本上都是一样的,它都是用相关的一个偏移。
410这个偏移来表示的啊,背包仓库嗯,还有我们的装备以及我们的快捷栏里,那么我们再来看一下第二个它是在什么地方,那么第二可能是一个理应副手啊,防御八防八防八,这是它的几个属性的一个增加啊。
是这个领域的一个副手,那么我们看第四第三个是什么啊,也是零命,不是啊,他是这样来的,那么第四个呢才是我们的武器啊,坐标为三,这个地方啊,那么我们知道这些的话下标,那么更换武器的这个下标呢。
这里就应该是数值就是为三,那么我们再来看一下下段,那么这个时候呢我们发现了下标四三,后面这两个呢它数值都是零,而这个数字呢它来源于我们的这个装备列表的这个偏移,加上我们的1608这个地方它是零。
那么还有一个地方来源于我们的yb d0 ,那么这两个地方都是零,所以说这两个参数呢它是零,那么这里呢是我们要更换的装备的一个下标值,但是这个参数我们必须得传进去了,他跟我们这个移动到仓库的时候不一样。
那么移动到仓库的时候呢,我们这个值呢它可以自动的进行一个调整好的,那我知道了这么多之后呢,我们接下来呢可以找一下他相关的一个机制,那么我们首先也是用c a一来搜一下。
那么这个时候呢也是搜出两个机子,那么一个机子应该是我们所有对象列表里面呃,那个数组里面的,另外一个呢才是我们真实的这个装备列表的一个机制的指针,那么我们对它进行一下修改,然后呢到og里面进行搜索。
那么这个时候来找出来的这个数字呢,就是我们的机子他用到的地方呢也非常的多啊,我们选第一个在这个地方,嗯然后呢我们把它复制下来,这里注意一下,是我们的装备,这个贴纸,好然后我们进行一下复制。
那么第二个因为第一个找到的话,第二个的话这个呢可能就是我们的所有列表的这个建机制,所有对象的,那么我们也可以搜一下,那么这个的话就搜不到啊,呃因为它是所有对象列表里面的哈,这个虽然说搜出来。
因为我们c e里面搜出来这个是绿色的话,实际上它是在数据段,所以说它这里呢它就会显示是绿色啊,也就是我们平时看到的这个d e s这个前缀所标示的这一段,那么即使它没有这样一个变量,它也会显示嗯。
从这个绿色的在c里面,好的,那么我们接下来来进行一下相关的测试,那么按减号哈退回来,那么同样的这个地方呢它也可以更换我们的装备,哈哈哈,那么我们看一下啊应该怎么写。
那么首先呢我们把前面几句啊可以照抄下来,就可以,那么实际上我们可以在前面的基础上进行修改就行了,在我们上一节课62课里边写的这个代码里面。
移动的这个代码,把这段代码在他的基础上进行一下修改,那么就很好完成,61课啊,我们来看一下61克的这个代码,这里呢没有用我们的替换掉,方便我们测试,那么只是这个地址呢我们需要呃哦仓库列表。
它的一个机制呢我们需要更改一下,应该为我们装备啊等一个地址,那么后边的话这里呢我们如果是武器的话,它的下标是三就行,那么这里呢我们是需要更换我们武器,它所放在的呃,所放置的相应格子,那么我们也选一。
那么也就是第二个,那么我们现在接触到这个地方,放置我们的服务器,那我们再来看一下第二格的武器,那么我们要用我们的代码输入器来进行相关的测试,这,怎么会。
那么这个时候呢我们发现呢它就可以来更换我们的这个武器装备哈,那么这个时候呢我们有的时候呢在编写我们的程序的时候呢,也需要用到这个功能,那么这节课呢我们的分析呢就到这里。
那么下一节课呢我们对这个装备更换的呃代码来进行一个相应的封装,那么大家呢也可以把它当成是一个坐垫啊,下去之后呢进行一下,完完成,哈哈哈,哈哈哈哈哈,嗯。
好的。
P53:064-封装更换装备代码 - 教到你会 - BV1DS4y1n7qF
大家好,我是喻吉祥老師,那麼前面的幾個我們已經對更換裝備的相關數據來進行分析,那麼這幾個我們主要是對更換裝備的功能進行一個封裝。
那麼在封裝之前,我們要來了解一下裝備列表,那麼裝備列表的話,我們在更換武器的時候我們就必須要放在,武器的下標裏面才可以,那麼我們在傳遞下標的時候就要注意,那麼下標的話就必須是武器的下標才可以。
那麼如果我們要更換的是副手,那麼也要獲得副手相應位置的下標,那麼才可以,而不是說隨意的像我們存放倉庫一樣,隨意的傳遞一個下標進去就可以,那麼所以說這個時候我們需要打開OD,來先取得相應位置的一個下標。
那麼我們看起來的話,武器的位置它位於的所有裝備列表的左上角。
那麼可能它的下標是0,但是我們還是要來進行一下測試。
那麼我們用DC來顯示一下它的名字,我們就能夠看出來,加5C偏移這個地方。
但是我們可以看到下標為0這個位置,它是衣服,那麼這個時候我們可以來定義成紅,把衣服相關的地方的紅定義為0,那麼第二個我們看一下是副手,那麼副手有兩個,我們看一下究竟是某一個副手,那麼這個時候我們發現是。
那麼下標為1的時候是左邊的副手,那麼所以說我們在這裡定義的時候,我們可以分別是第一個下標是衣服,第二個是副手左,副手右,然後第三個下標,這裡為3的時候是武器,也就是流星槍,這個是武器。
那麼我們換一個上去,這個是武器,那麼所以說的定義的時候,我們可以直接定義成紅的形式,那麼還有一種更簡單的方式,我們就是定義成每一局類型的長量,把它定義成每一局類型的一個長量,這樣也可以來使用。
那麼我們可以來先認識一下每一局類型,簡單的做一下介紹。
那麼我們隨便定義一個每一局的一個類型,那麼後邊就是它的一個長量,它的長量如果我們沒有指定的話,它就會從0開始編號,比如說我們隨便寫一個ID1、ID2、ID3,那麼這個時候我們可以打印出這些長量的值。
它就是012這個數字,那麼實際上它本身的一個每一局類型,它也是就是一個整數的一個序列,那麼這個時候我們看到它實際上就是012這幾個數字。
那麼同樣的,如果我們的相應的數值表示我們相應武器和裝備的,下標的值,我們也可以把它定義成每一局類型,那麼定義成這兩種形式都是可以的,那麼實際上它都代表同樣的值,那麼這個放在第一個位置的它代表的是0。
第二個位置1、2、3、4,那麼這樣我們就可以用這種符號的這種長量來替代我們的下標,可以使我們的程序更具有一個可讀性,當然你也可以直接傳012,比如說我們更換武器的時候。
你也可以直接傳長量3進去也是一樣的,但是我們的威懾++它對我們的中文的一個提示不是很完善,所以說我們還是建議用英文的,或者是用拼音都是可以的,那麼首先我們打開第62課的代碼,那麼首先我們添加相關的武器。
裝備的機制,然後我們再添加相應的一個函數,展開我們的結構單元,你到我們的背包列表裏面,之前我們是封裝的移動到倉庫的某一個,那麼在這裏我們改一下,把它改為裝備,那麼實際上我們也是要移動到裝備列表的某一格。
但是由於我們的某一格的話,如果我們單純的用數字來表示的話,代碼的可讀性不是很高,那麼所以說在這裏我們也用剛才所認識的,每一局的類型,那麼在結構的前面我們給它添加每一局的類型,那麼表示衣服所在的下標。
表示武器所在的一個下標,那麼今天我們就以武器這個為例,等會來進行相應的一個測試,然後我們把函數來複製一下,轉到我們移動到倉庫的後邊,那麼首先我們把在前面的代碼移動到我們倉庫的代碼,我們把它複製一下。
因為它的核心代碼都是一樣的,那麼複製下來之後,我們要改動的就是這個Base,這裏,那麼這裏我們需要改為我們裝備的一個機制,那麼還有這個地方我們需要改動一下,上一期我們忘了改動,同樣的在上邊這裏。
我們也需要傳進來的是它的一個下標,那麼代表放在了某一格,那麼武器的話,這裏我們肯定要傳入到下標就是3,好的,那麼我們接下來進行一下測試,轉到我們的測試單元,那麼在這裏我們看一下,把它放在第三格,狼牙槍。
我們把它更換上去,第三格的話,第四格下標是為3,然後在選中第三格,然後在這裏的話,我們是要移動到我們的裝備列表,那麼在這裏,我們就直接用我們的NPM,全機變量,背包,用這個,數字來代表3。
當然這裏它的效果與我們直接傳,長量3的效果是一樣的,實際上在編譯的時候,它也會自動的就用3這個長量來替換它,只是我們這樣來它的一個可讀性的話,要高一些,這個就是武器的一個所在裝備列表裏面的一個下標。
好的,那麼我們把它編譯一下,那麼在說明的時候,我們把這裏的後面的複製核心數字刪掉,只需要在說明的時候,給它進行一個默認值就可以了,好。
然後我們開始進行測試,那麼這個時候。
由於我們Od附加到了遊戲裏面,那麼所以說它輸入會慢一些,掛機到主線程,然後測試,那麼這個時候我們發現的話,它就能夠把狼牙槍換上去了,實際上它會把背包裏面的第四個裝備換到上面,但是這個必須是武器。
如果是其他的裝備的話,這樣的話就換不上去,好的,那麼這個時候我們測試成功的,那麼測試成功了之後,我們再對它進行一下相應的改進,那麼我們比如說我們的更換武器,更換衣服,更換我們的副手左,副手右。
那麼這些我們可以再單獨的把它封裝成一個函數,更換裝備,那麼比如說我們更換武器裝備,那麼後邊的話,我們在這裏,我們就把它改一下,就改成我們的背包裏面的一個名字,裝備的一個名字。
我們要把背包裏面的某一個裝備,然後更換到我們的武器在欄上面,那麼我們可以這樣的封裝這個函數,那麼其他的封裝就當成是一個座列,大家下去之後對它進行一下相應的封裝,那麼我們在移動到武器的後邊。
我們再來添加一個這樣的函數,那麼首先我們要做的函數,就是要取得裝備名,它在背包裏面的一個下標,那麼這個的話,我們之前有封裝函數,GetGoodIndexFlip,那麼我們直接用這個函數就可以了。
那麼獲取裝備名在背包裏面的下標,那麼獲取這個下標之後,我們再調用的我們的選中,選中這個物品,當然我們還要做一個判斷,那麼因為這個它傳回來的一個值的話,是整形的,那麼如果它傳回來的數值,如果是<0的話。
那麼如果這個值<0的話,那麼我們就直接去看,就調用Spark,那麼如果這個返回值大於0的時候,我們再執行後面的代碼,那麼我們首先來選中,那麼選中了之後,我們再調用之前的一個代碼,那麼我們替換哪一個。
就把我們的MDM傳進去,那麼替換的是第三個裝備裏面的,我們替換的是武器,好了,那麼我們再來測試一下,那麼在這裏的時候,我們就可以直接的移到我們的主現成單元,進行一下代碼的修改。
那麼這前面的這一行就注釋掉,然後把我們的武器的名字傳進去。
那麼我們看一下,我們就以狼牙槍為例,好的,那麼我們進行一下測試,編輯,這個時候我們可以退出OD,這樣我們注入的時候。
速度會快一些,掛接到主現成,然後我們看一下遊戲裏面進行測試,那麼這個時候它能夠測試成功,我們再把它移下來,再進行一下測試,都是可以的,但是這個時候我們發現移動到後面某一格的時候,我們測試都不成功了。
那麼可能是在訪問這一格的時候,我們沒有做一下相應的一個判斷,可能造成了異常,因為這裏是一個空的對象,那麼我們來看一下,如果是出現異常的話,在哪一個地方容易出現,因為後面這兩個我們都是測試過的。
如果出現異常的話,應該是獲取這個名字,這裏面比較容易出現,那麼在比較名字的時候,我們對它相應的對象沒有進行一個判斷,那麼在這裏我們加上一個判斷的語句,那麼如果它沒有對象的話,我們先來看一下。
在GOTY的時候,它是怎樣進行複製的,那麼在這前邊,我們來看一下,GOTY。那麼在這裏,我們對數量進行了一個零的複製,那麼如果,那麼實際上我們可以對整個列表進行一個初始化,在進行複製之前,那麼在前面。
我們進行一個初始化就可以了,那麼在這個地方,我們就用不著做相應的一個判斷,直接contain就行了,那麼所有的結構裏面全部都清零了,那麼我們現在我們做判斷的時候的話,就很好判斷。
那麼我們再回到更換武器的函數,獲取我們的下標,然後在這個位置的話,我們就直接來判斷它的一個名字,那麼如果它的名字為空的話,是一個空指針的話,那麼我們這裏就繼續進行一個,下一次的一個循環,好的。
那麼我們再重新把它編譯一下,對了,這個時候我們還需要一個返回值,那麼我們直接用它的返回值就可以了,移動裝備,好,生成之後,我們再一次進行測試,掛接到主線程,然後測試,那麼這個時候我們無論放在任意格的話。
我們都能夠把相應的武器把它替換上去,好的,那麼這節課我們就講到這裏,那麼我們下一期課再見,那麼如果出現了剛才的這種錯誤,如果我們是猜不到,它所出現錯誤的原因是在這個函數裏面。
我們可以在前面打印我們相應的一個調試信息,那麼我們可以做一些相應的標記,然後在它的後邊也做一些標記,那麼直到每一個地方我們都做一些標記,看它究竟執行到某個地方,那麼我們再去定位它出現錯誤的代碼。
那麼也是一種方法,好的,那麼我們這節課就講到這裏,下一節課再見,那麼這節課也留了一些作例給大家,那麼這個作例的話,我們就是來自己封裝一下,更換我們其他的這些裝備的一個函數。
比如說更換我們的左邊的一個介質,更換我們的副手左邊的,比如說更換我們的項鍊,或者是我們的靴子這一類的,當然這裏都已經把相應的下標已經定義好了,那麼大家有條件的話就下去了,測試一下,編寫一下相應的代碼。
那麼我們代碼的話是要多寫多念,好的,那麼我們下一節課再見,如果遇到什麽問題的話,可以發帖到論壇。
也可以直接留言到我的QQ裏面,請不吝點贊訂閱轉發打賞支持明鏡與點點欄目。
P54:065-打开NPC 对话菜单 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们一起来分析一下啊,打开npc对话的相关的一个功能,那么首先呢我们在打开m p c之前呢,我们需要选中这个对象,或者是我们直接用鼠标来点这个n p c呢。
那么就可以打开我们的n p c对象啊,但是这个时候呢我们可以从两个方面来入手,那么第一个呢我们是在打开n p c的时候,因为我们打开不同的n p c的话,那么它的菜单它是不一样的。
那么所以说我们在打开的时候呢,它很有可能要访问我们的n p c对象,那么这个npc的对象里边呢它有存放哈相关的啊,用来区分这个n p c对象的数据啊,那么在访问你这个相关的这个区分npc数据的时候呢。
它就会打开一个不同的一个菜单,那么我们可以想办法呢先找出n p c对象啊,那么找出这个n p c对象的话,我们在之前的分析里面哈经找到一个呃,我们个人对象加上幺四比八。
这个地方呢就是我们选中对象的一个下标啊,在所有数组里面的一个下标,那么我们通过这个下标取出来乘以四啊,就可以得到它的一个偏移的一个地址,那么因为我们嗯所有对象列表的公式呢就是前面的啊。
这个公式当然地址呢它不一样,刚才这个是周围怪物的啊,那么我们所有对象的它的机制呢是我们下载这个,那么这个我们加上它的一个下标啊,这一段就可以取出我们当前选中的一个对象,那么我们取出这个对象之后呢。
我们就对这个对象的指针呢,下一个访问的断点啊,用c来搜索啊,访问的一些代码,好的,那么我们先来进行一下尝试啊,先我们把相关的这个公式来添加到我们的c里面去,先找出我们当前选中的对象。
那么我们先尝试用第一种方式,因为我们用第二种方式的时候呢,我们在走路的时候呢,它也会被断下哈,所以说不是很好跟啊,那么我们先尝试用第一种方式,那么如果要尝试用第二种方式的话。
那么我建议呢先让这个我这个人物角色来走到这个n p c的跟前啊,也就是说我们在选n p c的时候呢,它本身呢不会再走动啊,不会再移动,那么在这样分析的话呃,更加准确一些,好的。
那么我们先打开我们的游戏进程,那么我们先用第一种方式来找看能不能够分析道,那么首先呢我们把这个公式啊添加进去,那么呢这里我们有一个机子啊,先把它放进来,那么这个机子放进来之后呢。
我们还要求得它的一个偏移啊,那么我们先把这个偏移的话,我们需要计算出来啊,那么我们先另外再添加一个地址啊,先求它的一个偏移,那么这个是我们当前的人物角色,它加上腰四比八,这个位置是当前的好。
或者是我们说啊下标,那么我们用16进制来查看一下啊,现在它在我们所有对象数组里面的下标是这个,那么下标记这个下标计算出来之后呢,我们还需要乘以四,然后呢才是这个偏移,那么这个是我们当前选中对象。
那么这个时候呢我们需要进去把这个偏移把它求出来,12a34 ,但是这里呢它并不能够把它计算出来,它不能够计算出来的话,我们就需要自己来先把这个偏移了计算出来,因为它在我们的c一里边呢不支持这样的表达式。
那么我们先选16进制粘贴进来,把我们的下标啊粘贴进来,然后再乘以四,那么这才是我们的相应的一个偏移,那么我们在这里呢加上这个偏移,而且这里它的这个偏移的话是直接加在这个地方才对的。
那么我们把这个相应的呃偏移来移调,3116640,再加上我们的这个偏移,那么这才是我们当前的一个选中的对象,那么我们为了验证一下它,因为我们的np c对象的话,它也是怪物类型的。
那么它的320这个位置的话应该就是n p c对象的一个名字,那么我们来验证一下添加指针,添加320的一个偏移,然后我们再用啊数组的形式来访问它,那么这个时候呢会显示神秘商人啊。
那么跟我们这个n p c啊的名字是一样的,那么说明的话我们这个当前选中的n p c对象啊,它的指针啊我们选对了,那么我们看一下有哪些地方对它造成了一个相应的一个访问。
那么这个时候呢对他访问的地方非常非常的多啊,那么我们要看的是呢,等一会儿我们新的啊访问在打开mp的对象的时候,那么这个时候呢我们,点击一下np c对象,那么这个时候访问了一次的这些地方呢。
它的可能性呢就是最大的啊,就是后面这一片,那么在这段代码里边的话,就有可能有其中的一个啊,就是我们的打开m p c的这个空,好的,那么我们取得了这些信息之后呢,我们先把游戏最小化。
那么我们先把这些访问了一次的地方呢,把它提取出来,那么这些地方的话都有可能是我们的呃n p c,打开n p c对象的一个扩。
好的,那么我们把这些代码提取完了之后呢,我们就关掉啊,然后呢我们现在调相应的这个调试器,然后我们用d来进行一个附加。
那么d附加之后呢,我们依次对这些被访问的地方呢进行一个下段。
然后呢我们可以对这个地方来跟它进行一个编号,一,啊然后呢co,然后这个地方呢我们标记为三,这个地方我们标记为四,然后这个地方我们标记为,这个地方呢我们标记为六。
那么我们对前前面几个地方呢先进行一些分析啊,如果我们能够找到正确的这个打开p c的这个扩的话,我们就不用再对后面的这些数据了进行分析哈,那么如果前面的这几个地方我们都找不到正确的这个扩的话。
那么我们在对后面的这些数据呢进行一个分析,然后我们按减号退回来,对这些相应的有注释的地方来进行一个f2 啊,下一个断点,按减号啊,退回来好,那么这个时候呢我们再一次关掉我们的npc对话框啊。
再一次我们用鼠标点击npc啊,让他断下来,那么断下来之后我们看一下啊,上移它的上一级的话,这里呢有一个12a3 ,那么我们看一下这个1a3 是多少,那么恰好就是npc的一个i t那么传进来了啊。
上一集的这个空,那么很有可能也就是我们打开npc的这个扩的话,就是通过啊npc的这个id号来打开的,在这上面这这一个地方,那么这个地方呢很有可能就是我们打开mp 3,对话的这个空,好的。
那么我们先把其他的断点先禁止掉。
然后让他跑起来,那么既然我们刚才第一个断点的时候,我们就对他啊,嗯那么可能就已经找不到了这个正确的这个扣,那么我们先对它进行一下测试啊,对这个空,那么我们首先呢要分析它的参数。
刚才我们分析到了它的这个参数呢,嗯这里是我们的n p c的i d,或者是我们说是所有对象数据和下标,然后我们就调用这个库啊,另外呢还有一个是e4 x,那么ex的很有可能就是嗯从这里取得的啊。
那么我们可以再次在这个地方下段来看一下e4 x的一个变化,好那么再次点击npc的时候,我们看一下,注意一下e4 x的一个变化,那么12a3 ec x的一个数值390。
那么这个时候呢e4 x发生了一个变化啊,我们看一下e d i啊,e d i的一个数值啊,e4 x是来源于e d i的,那么这个e d i这里有个一四比八好,那么这个一四比八的这个偏移的话。
我们也很熟悉呃,就是我们的人物角色的对象,那么我们来看一下这个人物角色对象里面放的地址,是不是,我们的,e4 ,x,因为这个偏移引起了我们的一个注意,那么我们发现啊二dd 580啊。
恰好就是我们角色对象啊,这个参数,好的,那么我们参数分析完了之后呢,我们让它跑起来,那么接下来呢我们就用我们的嗯这个代码输入器来进行一下测试,那么这段代码的话,我们就可以这样写了。
那么因为它的这个参数的话也是来源于我们人物的这个角色对象,加上幺四比八这个地方,那么我们就可以了,先把我们的人物角色的这个数字来放到e d i里面,加上前缀啊,dond的前缀p t r代表是指针。
后面d呢我们仿照这里写,表示呢是在数据段,那么加上括号了,晚上那么在这样取出来的对象的话,就是我们的当前的人物角色的对象,那么取出来之后呢,我们再再仿制啊这段代码来写啊,直接把这段代码复制出来。
然后取出我们当前的这个选中的对象的一个下标,然后呢复习ex,那么最后这里呢e4 x呢来源于e d i,就是前面这一句前面,那么如果写的再简单一点的话。
我们直接就e d i这里来用我们的ec x来来替换也是可以的,那么然后呢再接着调用这个库。
好的,那么我们来看一下啊,进行一下测试,那么我们选择游戏啊进行注入,但是这个时候我们注入的时候呢,发现嗯是没有作用的,它不能够打开mp c,那么所以说这个库呢它只是长得有一点像啊。
但不是我们实际所要的这个库啊,好的我们还是把这个相应的测试来放在这里,那么这个地方不是的话,它极有可能呢嗯是在它的更上一层的这个库,那么我们再返回到它的上一层来进行一下相应的测试。
在这个地方呢我们再进行一次下段,再次我们选择打开这个np c的一个对话,然后呢这个时候会断下断下,那么我们再看一下上一层,执行到返回这个时候,那么执行到返回之后呢,会执行到这个地方。
那么我们在这个地方进行一个下段啊,然后再跑起来,但是我们发现在这个地方的话,它会反复的断向啊,这样的话就不方便我们的一个测试,那么如果是反复的断线的话,那么这个扩的可能性的话要小一些。
因为现在我们还没有打开这个mp 3的对话,他应当来说是不会断下的,那么还有一种可能呢就是在它的更上层,那么我们在再次打开我们的n p c对话,让他断下来啊,按减号退回来,在这个地方呢再次进行下段。
然后打开mp c对话,那么这次呢我们返回两次哈,ctrl f7 ,执行到返回,然后呢我们再按f8 再上一层,我们在这个地方进行下段看,是不是,那么我们在这个地方下段的时候呢,我们仍然发现它会反复的断下。
那么我们接着再分析后面的这个空,那么我们分析第二个啊,嗯用water加b打开我们的断点列表,那么我们在第二个位置,在这个地方的断点呢,我们把它打开,然后我们接着哈再次来分析。
那么这个断点呢我们就取消掉了啊,因为这里的话已经不是我们所要的,然后我们会执行到这个位置,那么在这个位置的时候,我们再次执行到返回看一下,那么我们发现呢它也也是返回到这个位置。
那么刚才这个位置好像我们已经做过测试了啊,那么这个地方是我们打开这个npc对话框的可能性来极小,那么我们再次退回来啊,把这个断点呢也取消掉,再用alt b啊,打开我们第三个猝死的地方。
那么第三个这个地方的话,它也在同一个框里面,我们发现啊,那么所以说这个地方的话,我们也用不着分析,我们接下来分析第四个地方,那么在这个地方呢下断,这个时候呢它会断下来啊,断下来之后呢。
我们再次返回到上一层,结果他返回的地方呢还是同一个位置啊,所以说我们这个断点呢也取消掉,那么我们再看第四个位置,第五个啊,在这个地方呢进行下段,然后我们打开我们的npc,那么呢再返回到我们的上一层。
好那我们在这个地方进行一个下段,看一下e si的这个数值的一个来源,那么同时呢我们再返回一层啊,那么再返回一层之后呢,我们发现了也是这个位置的,好那我们现在来运行起来,好再次断一下之后呢。
我们看一下它的一个参数e s i,那么e s这个12a3 的话,同样的是我们的一个下标啊,因为这个数字di呢也是我们人物角色的这个地址,刚才啊外八这个,那么我们在对这个地方来进行一个测试。
那么这里测试的话,我们只需要改动一下后面这个扩的一个地址,前面的参数来都是一样的,这两个孔。
好的,那么我们再次进入到游戏里面进行一下测试,那么这个时候测试呢我们发现仍然没有反应啊,那么证明这个地方呢它也不是等差,我们已经测试到这个位置了,那,么我们接着来第六个啊,这个断点这里呢我们进行一下。
就是4c b啊,4c那么在这几个地方好像也挨着挨得很近啊,那么我们转到相应的地址进行下段第六个地方,然后第七个地方,那么这里呢我们也给他标注一下啊,七,然后第八个地方,那我们也下下一个断点标注八。
那么再找一下后面的啊,第九个地方,标注一下记录,好的,那么我们先测测试这几个地方,那么首先呢我们打开npc啊,让他断下来,那么这个地方呢我们已经做过测试了,它不是的,那么我们在测试另外几个地方。
那么这个地方我们看一下它的上层,那么上层的话依然是传的这个参数坐标啊,呃嗯,会返回到这个位置啊,然后然后我们调用一下这个库啊,进行一下相应的测试,而它的ecx的话,我们看一下,同样是没有变化。
然后我们再看一下这个扣的一个返回值,执行到八这个地方来了,然后再返回一下啊,同样的会返回到这个地址,啊让他跑起来,那么第九个位置,我们再来看一下,那么第九个位置呢会返回到这个位置。
我们跟他下一个段再访问一次,啊也是返回到同样的一个地址啊,嗯那么我们先让它跑起来,那么这个地方会反复的断下,我们取消掉它的一个断点,然后在这里呢我们先做一下测试吧,扩一下这个地址啊。
那么刚才我们测试的时候,在这个地方它的参数也是一样的,是一个下标,那么我们注入到游戏里面,那么注入到游戏里边的时候呢,我们这个时候呢它因为会调用到这个第六个哈,这个扩的一个内部调调用到这里来好的。
那我们再看一下有没有效果。
那么这个时候呢依然没有打开我们相应的一个操作啊,那么证明的话我们的访问呢还是失败了,那么接着呢我们再来看一下后面的一个代码,那么我们尝试一下啊,从七开始的这两个代码,因为前面我们从四开始的这一段来。
全部都是失败的,那么我们来看一下从七开始的这一段代码,那么在这个地方呢,我们进行一个下段,然后再打开我们的n p c,然后我们再返回到上一层,然后我们发现呢也断代了,断在了这个地方啊,那么我们从这里来。
再返回一层,再试一下,那么我们再返回一层试一下,应,下段之后啊也不行,好的我们再次让它跑起来,那么跑起来之后我们再重新打开一次npc对话,然后再返回到上一层,那么我们再试一下最后这个地方,这。
那么在这个地方呢我们进行一个下段,然后呢我们,打开我们的npc对话,把前面的这个断点呢取消掉啊,然后呢我们执行到返回,嗯跑起来啊,然后在最后我们下的这个断点,这里呢执行到返回,那么这里好像是一个循环。
在执行到返回,那么这个地方呢它会有一个循环啊,好像是可能是找过了,也有可能,那么再次在这个地方进行一个下段,那么这个地方的话明显是找过了啊,那么无论我们呃就是说走路啊,这些都会断下啊。
那么我们再次倒回来再看一下,那么这个时候呢我们走上两步啊,然后再打开我们的npc,这个时候呢它会在这个地方呢断向,那么断线之后呢,我们从这个地方呢再返回一下,那么它会返回到这个地址。
下一个断点再次缓缓的啊,会返回到这个地址,那么我们再次跟他下一个段战,再次返回一下啊,然后呢在这个地方哈,再次跟他下断,然后再执行到防护,在这个地方同样下断,再执行到访问题,那么在这个地方呢。
我们再次下一个段让它跑起来,那么这个地方会反复的断下的啊,我们把它去掉,然后我们发现了这个时候呢关掉n p c对话的时候呢,它也会在这个地方断下啊,那么这个地方的话可能是与嗯打开打开和关闭npc啊。
可能的话都有一些关系,那,么我们把它放在后边,然后我们再次打开npc,那么这个时候呢,首先呢是断在这个地方,我们看一下di的一个数值是多少,那么e d i的话,后面呢他跟了一个cg。
那么证明呢这个呢它本身是一个机子,应该,我们应该在里面啊,能够收到这样一个常量,这里能够收到这个常量,然后我们按减号再退回来,然后我们再按运行啊,这个时候呢也会执行到这个地方。
我们看一下1a x的数值来是二七啊,这个这个地方我们给他标注一下,然后ecx的数值呢是99d828 这个数字我们不知道是怎么来的,它来源于1d x加八的这个位置,那么eb x呢这个呢它也是一个呃机子。
我们从这里看到,好的我们再让它跑起来,那么这个时候呢又会执行到这个地址,那么这个地址的话我们就看的不是太懂了,ec x直接又掉用的,那么我们先把所有的断点呢先禁止掉,然后呢我们先进行获得一个测试。
让减号退回来好,那么我们着重来对这个地方呢进行一个扩的一个调用进行尝试,那么我们再次看一下e d i的一个数字是多少,啊关掉的时候也会这个地方也会断下啊,e di的一个数值看一下,把它复制出来。
那么这个呢可能是一个打开和关闭都是相关的一个括号,但是肯定不是说是我们打开这个n p c对话的一个空,那么你便他可能的话还有另外的一个空,就是我们刚才传送二期的那一个地方,那么我们再按减号退回去。
啊日期这个地方按加号啊,好的,那么我们主要测试一下这个地方进行一下尝试,看不见,这个地方ex 427啊,然后我们的e4 x把它复制出来,好的,那么接下来我们就可以进行相应的测试了,不写27盘。
mod 4 x co 737 b c0 ,好的,那么我们再次注入到游戏里面,那么这个时候我们可以看到可以打开我们的npc了,那么我们换一个npc来,打开之后。
我们看一下它下的一个参数的一个断点又是什么样的,那么这个时候也断下了啊,但是这个时候呢我们ex的值呢它是一,那么说明这个地方的话很有可能是一个n p c的一个npc的一个编号啊,n p c的一个编号。
那么通过这个来来打开我们不同的n p c,那么有有这样的一个可能好的,我们让它跑起来,那么跑起来之后呢,我们打开了我的大宝啊,那么我们再次输入我们之前的代码,我们看会打开某一个npc。
那么这个时候的话我们发现呢是打开了升级手势的这一个啊,这不是打开仓库的这种,应该是打开的这边啊,这个神秘的商人这个pc啊,那么所以说我们这个课呢就是我们的呃,打开npc的这个库,那,么经过测试的话。
这个就是打开mp c对话的来扣,那么这个呢就是n p c的一个编号啊,而这个参数的话我们来看一下它的一个机制来源于火出,那么我们搜一下这个数字。
那么今天由于时间的原因呢,那么我们暂时就讨论到这里,那么关于他的机子了,那么我们下一节课呢再继续来分析它好的。
标签:我們,教程,这个,一下,郁金香,笔记,那么,那麼,我们 From: https://www.cnblogs.com/apachecn/p/18441505