郁金香游戏辅助教程笔记(九)
P55:066-NPC菜单选择CALL - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么在上一节课呢,我们分析了打开npc菜单的功能,那么这节课呢我们主要来分析一下呃,npc菜单选择的一个功能,我们说的肾的函数进行一个下段,然后回溯。
当然我们今天这个游戏呢它是用的w s a sm的啊来进行的发包,好的,那么我们先来打开我们的啊。
打开游戏之后,我们把调试器啊附加到游戏里面。
然后按下回车回车键哈,我们下一个断点,那么下断点之后,我们先让它跑起来,然后我们再打开仓库啊,那么这个时候断下了啊,断下来的话证明我们在打开仓库的时候呢,它向我们的服务器发送了相应的一些数据请求。
那么如果是当时没有断下的话,那么我们也可以找一些啊关键的一些数据来进行相应的一个分析,那么如果我们在打开仓库的时候,没有向我们的服务器啊发送这个数据,那么实际上这个步骤的话,我们就可以省略掉啊。
啊但是这个时候他向服务器发送了数据的啊,说明这个与我们的服务器数据呢有一些关联,那么所以说呢我们嗯今天来分析一下这个功能,那么我们再次在顺德啊发布这个函数,这里按下f2 下段再次打开仓库,然后我们。
执行到返回ctrl f9 ,然后在这个位置的时候呢,我们可以备注一下,打开仓库,然后再算一下ctrl f9 ,返回在这个地方,我们再次给他做一个标记,打开仓库二,然后再次按ctrl f9 。
在这个地方呢我们再次下一个到f2 ,然后再次按下ctrl f7 ,那么执行到这个位置的时候呢,我们就可以把呃相应的断点可以取消掉了,因为这个位置的话,很多地方他都会照执行到这个位置啊,很多地方。
那么我们对npc对嗯进行一些相关操作的时候呢,它都会断断在这里啊,断在这里,那么我们再执行到上一层,那么这是一个循环啊,那么我们可以下一个段进行尝试,然后我们再把所有的断点呢,把前面的这些断点删掉。
把我们新设置的这三个断点呢我们禁止掉,然后呢我们再次把它激活,那么这样呢我们就可以过滤掉一些哈,与我们打开仓仓库没有关系的地方啊,如果这个时候我们把这个断点开启了。
他马上就断下了啊,那么说明的话这个货的话与我们打开仓库是没有关系的,好然后我们关掉仓库的时候呢,我们发现呢它也会在这个地方呢呃断下,那么我们也备注一下,然后让它跑起来,而且它断下会断下很多次。
这里是一个循环,然后打开仓库,这个这个地方呢也与我们的关闭仓库有关了,好的,那么我们再一次打开我们的npc,打开仓库,那么这个时候呢也会断下,我们看打开仓库的时候,ex的数是多少,是319记录一下啊。
然后这里呢e s i的数字我们也把它记下,yes,i这个时候打开仓库是三好,然后我们再关掉仓库,那么关闭仓库的时候,我们看一下ex的数值呢是六二,那么e4 x的数字呢,我们也把它记录一下。
好然后再次让它跑起来,然后我们再次打开仓库啊,分析一下它的参数,这个时候我们发现呢319这个参数没有变,但是变化的是这个ecx的一个数字,它发生了一个变化,那么ex和我们的一dx实际上都有变化,好用。
因为它是两个不同的对象啊,在这里呢它实际上也是调用的两个不同的空,因为e d x e d x的一个数值的话也不一样啊,那么也就是说在调用这个库的时候,它关键是这个对象啊。
然后是调用对象的一个成员函数加四啊,这个地方的,然后我们再次让它跑起来运行,再次我们看一下一si的数值,那么ex e s i的数值来是三,那我们看一下现在e4 x的数值,啊。
那么这个三的话它是从啊从前面这个数组这里,好像过去的加174这个位置,那么我们从前面的分析来看的话,那么这个库呢更像是我们的呃,打开仓库的这个功能库啊,因为它的参数来比较稳定。
那么我们对这个后来可以做一个测试来试一下,那么这个地方呢我们先把它记录一下,然后把断点取消掉,那么理论上调用这个库的话也是可以来实现的,但是我们要先找到之前的这个ec x对象的一个来源才可以。
这,打开仓库,那么这个的可能性可能会大一些,好的,那么我们看一下e4 x的数值呢也是没有变的,那么我们用代码输入器来进行测试好,知道,那么首先呢我们要打开我们的n p c对话,然后呢我们再输入。
那么这个时候呢我们发现注入之后呢,呃这个程序来终止了。
那么说明我们传的这个参数呢可能有问题,我们再来看一下,退回来,首先我们看一下七三嗯。
应该是传入的这个数值的话,应该是734cm,那么这里扩的这个地址的话,我们刚才写写错了,写成了,我当时是看成前面这个73b021 来了,好的,那么我们重新再进一次游戏,那么游戏打开之后呢。
我们再次啊附加到游戏里面。
然后我们再用d来,可能这个ecx的数值的话,可能他已经重新启动之后,可能已经变化了,那么我们先用d来附加进去,把ec x的数值来获取。
好的呢,那我们再次打开一下仓库,看一下呃e4 x的数值,那么这个时候e4 x的数值已经变化了,那么我们先找到e4 x的数值,先进行测试,测试成功了之后呢,我们再去找这个数值的一个来源,啊然后输入代码。
那么这个时候我们可以看到它可以来打开我们的这个仓库了,但是如果我们单独的注入的话,它没有任何的效果,他必须要有一步哈打开mp 3的这个操作啊,看来他两部呢应该都是向服务器已经发送了数据。
然后服务器它获取这个数据之后呢,再传送了一些相应的指令过来啊,让他打开我们这个相应的一个仓库,那么好的,接下来呢我们分析一下这个e4 x数据的一个来源。
那么我们看一下它来。
白云ti,那么di的话,我们向前边找一下,那我们记一下现在e4 x的一个数值,我们先用c a e来找一下,看能不能够直接找到机子,这样会更快速有效一些。
那么这里呢只有一个地方哈,那么我们先搜一下这个数值能不能够在我们的d里面收到,如果能够在在这里边收到的话,他肯定就是一个机子,那么搜不到的话,那么可能就是我们其他的呃数组里边去了。
我们可以下一个断点看一下,那么现在ebx的一个数值,就是我们刚才的呃下的一个断点,那么它这个机子的话是来源于前面这一个数字,那么这里的ebx的话,它的数值应应当是在这个循环里面变动的。
那么这里呢每次来让11b x的数值来加了四,相当于每次呢我们的一个数数组的一个下标啊,加了一啊,相当于是这种情况,那么所以说在在这里的话,它是一个数组的一个访问的一个方式。
那么在最下边的话应该是一个数组的最大的一个下标的一个地址,好的我们再删掉它吧。
那么现在呢我们有两种方法来找这个机子,那么第一种方法呢,我们就是通过在,在这个c e里边哈不停的去搜索啊,去尝试一个一个的,那么我们可以从呃这种比较单一的地址来开始找,那么另外一种方式呢。
我们就是在o d里边找这个相应的数值,那么我们可以先进行一下尝试嗯,再一次我们让它断下,打开仓库啊,断一下,那么我们看一下这个bf 0啊,998f1 bf 0,我们看一下它的一个来源。
那么首先呢我们可以在这个堆栈里面找,从这个18a49 c里面看一下,看一下它是不是来源于我们呃前面的某一个地址,那么我们可以呢在这里边来找一下堆栈的一个数字,那么移到最开始的18a开头的。
那么我们发现的话,这里边没有啊,没有18a开头的,那么没有的话,我们,就只能从前边啊一步一步的来讲,或者是我们先回到上一层来看看一下,执行到返回,那么这个时候看一下上一层的e4 x的一个数值。
那么好像它的这个来源的话就是来源于这个ecx这个地方,那我们在这个地方再下一个段,重新再打开我们的仓库,好,那么这个时候断下,我们看一下这个时候e c x的数字呢。
我们发现啊恰好就是这个98f p f0 啊,那么这个时候的话,我们只需要来往前面继续找这个ecx的一个来源,但从这个e c x这里来的话,它又来源于e s i。
那么我们也就是要找这个腰1a2853130 啊,找这个数字,那么找这个数字呢,我们可以先在我们的ca一里面来找一下,那么先把公式计算出来,那么在c里边我们先找一下,那么这个时候呢我们也会找到一个啊。
又找到了这个968这个地方是一个机子,但是这个968这个地方刚才我们进行了尝试,那么这个是在所有对象里边啊,所以说我们不能够找这个,那么在这个时候呢,下面的这些指针的话数量比较少。
我们可以一个一个的尝试。
看能不能够找到机子,那么首先我们对这个地方呢进行一个呃访问的一个断点,hr,那么我们在这个断点下了之后呢,我们看一下好像是在e s i,那么好像是在它的上一步的时候呢,这里呢有一个断点。
我们981f00 ,你就该杀,1a3 加上我们的310,我看一下,那么恰好就是1s来i来加上我们的310啊,然后呢我们再取出来,本来之前的公司的话是这一个,啊那么但是这个130它的这个数字的话啊。
我们在这里呢就可以用前面的这个e s i,加310的替换掉,那么现在一si的数字呢,我们把它复制出来,那么最后呢我们这个公司啊就变成了这样啊,八好的。
那么我们接着来我们去找一下这个数值e si的一个来源,那么我们可以前面呢有两个地方跳转到这到这里,那么我们先看第一个地方,那么这个第一个地方的话,我们附近没有发现有对这个e si进行赋值的。
那么我们跳到前边那个地方来看一下,那么再找一下对e si这个地方进行赋值的,那么我们发现了它来源于我们上一级的e4 x,但是我们上一期的话,我们可以看到很多地方呢都会调用这个库。
那么我们先下一个断点进行尝试,那么我们发现呢嗯看一下现在的ei,那么现在的e si的话,刚好是我们所要找的这个e si啊,我们看一下e4 x啊,对啊,那么我们这个时候来返回到上一层。
那么也就是说这个e4 x呢就是我们刚才所要找的数值,而它的数值呢又来源于e s i,那么我们再往上面走,啊先让他跑起来,按减号再退回到我们刚才找的这个位置,嗯,那么我们发现的话。
它也是来源于再上一层的啊,e4 x,那么我们继续讲,当然也可以用c来搜一下。
可能会更简单一些。
那么这里我们收到一个3117 958,只有一个地方是吧,那么这个地方的话我们看一下它是不是机子,那么四基石的话,我们在d里边呢就能够找到它的常量,那么这个时候呢我们同样的没有搜索到啊,没有搜索到来。
我们继续让这个地方断下,再进行回溯,把这些断点呢我们先取消掉,那么这个时候呢我们会在这里呢断下,断下之后呢,我们再返回到上一层来看一下上层这个e4 x bbf 0呢,就是我们要找到地方了。
返回到上一层找ex e si,那么我们跳转到最前边,那么这个地方呢我们找到啊有一个对这个e s i进行赋值的地方,那么我们对他下一个段看,等会儿会不会在这个地方断下来,那么没有在这个地方断下来的话。
说明的话它的数字应当不是来源于这里,那么可能还在更前边一些,或者我们也可以移到这个扩的头部,那么来看一下它的一个来源,那么头部的话一般呢会有这两条指令啊,那么如果一个是谱写bp。
另外一个是move e bp后面e s p的话,那么这样呢一般就是一个函数的头部啊,很大的可能性当然不是绝对的,那么我们在这个地方来下段,那么这个时候呢它也断下来了,断下来之后呢。
我们看一下e c x这个b f0 呢恰好就是我们要找的一个数值,那么我们又返回到它的上一层去找,那么我们发现呢实际上嗯找到了这个打打开关闭npc这个地方,那么它呢这个ecx呢来源呢更上一层,好的。
这个时候断下之后呢,我们看一下e4 x来说,我们要找到数值,那么我们再返回到上一层,那么呢这个这个地方呢也是我们函数的一个头部,那么说明的话我们还需要返回到上一层,那么呢最终要返回到这个地方。
这个时候呢我们可以看到ex的数值来来源于e d i加2c4 啊,我们在这个地方再下一个段,再按一下f8 ,那么我们看一下e4 x的数值来来源于前面这个公式,那么我们看一下e d i的数值,把它复制出来。
再加上我们的234,那么我们这个时候呢需要去找di这个数字的一个来源,那么这个过来看起来好像是比较大,我们先让呃游戏来跑起来,首先呢我们在,在c里边我们先搜索一下这个数字。
那么这个时候呢我们能够找到两个地方啊,那么后面这个698的话我们比较熟悉啊,嗯这个f998 c0 这个的可能性要大一些,我们先在ot里面搜索一下,从,那么这个时候呢我们可以找出来大量的这个机子。
这些地方我们都可以找出来,那么证明他最终的,应该机子就应该是这个f59830 ,这个,好像这个数值的话,我们也之前好像也有啊。
分析过,那么我们先把它做一下记录,31开始,那么这就是我们的ex的一个数值,那,么这个呢是我们打开仓库的这个库,啊,好那我先保存一下,那么保存一下,我们可以打开之前62课的代码。
那么进入到我们的基础头文件,可以看一下,那么这个数字呢也是我们的f一和f 10的这个e4 x的这个参数,那么实际上这个机子的话,我们之前呢就已经啊就已经分析出来了啊,只是说我们这个相应的偏移它不一样。
那么我们这里呢也可以用另外一种方式来代替,二,好的,那么这节课呢我们就分析到这里嗯,我们打开仓库的这个过来就分析到这里,那么下一节课呢我们在对我们最近分析的这些数据来进行一个整合啊。
那么我们把前面的一个,当然这个呢也有做一个作业啊,大家下去自己做一下,那么首先呢也就是我们第一步是打开,n p c对话,那么第二步呢就是我们的打开仓库好,那么第三步呢就是我们的存取物品。
当然我们之前呢呃也用这个移动我们物品的这个函数来,来实现了我们物品的程序啊,那么下一节课呢我们就把这个呢,嗯把这几个功能呢把它写到一个函数里面来执行。
也就是我们啊就写成一个存放某个物品到仓库的这样一个括号,那么我们可以,呃写一个行列式serve的一个库,然后呢就是我们物品的一个名字,那么应该还有一个呃成分的一个数量,应该还有应该是有这样的一个参数。
那么有一些物品呢它是有比如说药品啊啊,或者是我们的补hp mp的这些药品,还有回城符啊,这些它都是有数量的,那么我们一次乘多少沉到这个仓库里面啊,那么这些的话应该都可以把它分析出来啊。
并且呢写成一个函数,那么但是呢我们暂时不要求数量的这个函数啊,那么暂时这个数量呢我们一就可以了,那么后边呢我们再添加这个有关数量的呃一些分析好的,那么今天呢我们就嗯就讲到这里。
P56:067-封装测试NPC对话CALL与仓库CALL - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么前面65克和66课的时候。
我们分别分析了打开npc对话以及npc啊菜单选择的这个括号,具体功能呢是打开我们的仓库功能,那么这节课呢我们把第64课的代码打开,在它的基础上呢,我们把新分析的这个功能呢添加进去。
那么首先呢我们添加我们相关扩的这个机子,那么然后呢我们添加两个呃相应的函数,一个是打开mp 3,一个是打开我们的仓库,啊,嗯,那么打开这个npc对话的时候呢,因为不同的npc呢我们有一个参数来区分。
所以说在这里呢我们通过npc的一个id来打开它,那么另外还有一个函数是打开仓库的,那么关于这个函数的话,呃我们呢没有相关的参数啊,直接定义就可以,然后在我们的源代码单元啊添加相关的代码。
那么把握我们第65课的哈,我们先把它相应的汇编代码我们复制一下,那么他的1c x的这个参数呢就是f一到f 10的啊,之前用的这个参数也就是这个f98 c0 这一个更新的,那么是一样的。
这里做了一个相应的替换啊,获得这个地址呢,我们也进行了相应的红的一个替换啊,这样方便我们更新好的,我们把它复制一下,嗯,把上面这段代码复制一下,粘贴到下边的,那么其中我们只需要替换相应的汇编代码就行。
打开仓库,啊这个时候保存一下,那么上面这个地方呢,它是它的这个n p c的呃,i d相当于是一个分类的一个编号,那么在这里呢我们把它传进来,好的,那么接下来让我们到主线层这里来进行相应的测试。
那么这里一呢代表的是我们的平时指的这个i d,那么我们在另外啊建一个txt 2的这个这样一个分支,开始分支用来测试我们的,打开仓库,那么再定义一个相应的红,在前面的基础上加一。
然后我们做一些相应的改动哈,在cp区单元,那么这里的自然也要需要给它变动一下,然后把它复制一下,那么这里我们把它替换成一,三这前面的函数名也进行一个相应的替换,这样呢我们方便啊分开测试。
然后再移到我们前面的测试单元前边,这里改变了一二,三,好的,那么在切换到我们的资源视图上啊,添加两个测试按钮,测试二测试三,那么这里的头文件的一个说明呢,我们也要添加呃,123这样三个啊。
测试函数的一个说明,二三好的,那么我们编译生成一下,再看一下我们的测试单元一,三啊再重新编译一下,好编译成功之后呢,我们启动了测试,那么首先呢我们挂接到主线层啊,打开我们的这个时候。
我们发现我们执行我们的这个打开仓库的时候啊,那么好像是出现了一些问题,那么这个时候呢这个仓库呢它不能够打开,那么再点第二次的时候呢,这个菜单呢它打开了,然后呢我们点击这个打开仓库的话。
他开不了这个仓库啊,那么也就是说这两个括当中呢某一个扩它可能出现了问题,那么我们先手动的选一下,看是哪一个问题,那先打开我们的npc的对话,打开仓库,那么我们发现了这个打开仓库的这个库应该是正确的。
而第一个我们的打开npc对话的这个这个的话可能是错的,那么我们手动的这个时候打开仓库,那么这个时候,也是不行的,那么说明我们第一个括在分析的时候呢,它只是徒有其表,只是有一个显示这个菜单的功能啊。
但是呢它是一个错误的这个空,那么在这里的话,我们这节课呢我们先把第65课的这个打开npc对话的这个扩呢,重新把它更新过啊,那么下一节课呢我们再来进行相应的测试,那么这样出现这种情况的话,我们呢可以呢。
嗯回过头来把所有的呃65克的分析资料来再重新的分析一遍,但是这样分析的话呃工作量呢比较大,那么我们可以有一个取巧的方法,那么因为我们在打开菜单的时候,可能也会向我们的服务器发送一个断点,发送一些数据。
那么我们可以呢嗯在这些之前的啊这些访问的地方呢,先下一个断点下来之后,我们看是在哪一个断点的后边,他发送了这个数据,那么这个扩呢可能就是我们真正的这个打开mp 3的这个库,当然实际上我们也。
可以用选中n p c c之后呢,我们可以用这个技能的一个攻击呢,它也可以打开这个n p c的一个对话,那么也是一种方法啊,但是这节课我们还是本着研究的精神呢,我们还是来分析一下。
那么我们先用用我们的id哈。
附加到游戏进程里面。
那么我们把之前的这些断点呢,呃对我们npc的对象进行了访问的地方呢,我们进行一个下段。
或者桌上相应的一个标记啊,当时我们注册了123的这个标记,先下一个断点,二这个地方是,可能这里呢我们都跟他做了相应的这个断点的一个注释啊,那么然后呢我们下一个啊发包的一个断点。
因为我们在打开的npc的时候呢,也可能会向我们的服务器发送数据啊,因为它不光是一个菜单,如果光是菜单的话,我们上一节课的分析的话,可能就是正确的吧,好的,那么这个时候呢我们再打开npc。
打开这个npc之后呢,我们再用这个p p4 的下段按下回车,按下回车之后呢,我们再让它跑起来,跑起来之后呢,去掉断点啊,执行到返回啊,执行到返回ctrl f9 。
然后我们看一下它的前后有没有我们的一些注释,那么我们发现的话在山的这个地方啊,这个地方呢也就是呃np的对象,我们之前的一个注释,那么在这里访问了对象之后呢,他对这个对象的test进行了一个判断。
如果这个对象为空的话,那么来跳过这个空,如果不为空的话,在这里来呢,嗯向服务器发送了一个数据,那么这个数据的话也可能就是一条打开我们pc对话的一个指令,但是一般来说呢我们的,这个打开mp的对话的话。
他可能不会像服务器啊,按按照我们正常的思维来分析的话,它可能不会像服务器啊发送这个数据的,因为只是一个菜单,那么理论上呢在打开仓库的时候才应该发送这个数据,但是也有特殊的情况。
那么我们先来测试一下它发送的这个数据,是不是就是我们的打开npc对话,那么我们看一下它是首先取出了从这个地方来分析的,取出np的对象,然后呢呃判断如果不为空的话,那么就取出这个np的对象。
里面的应该是它的一个呃成员函数列表的一个指针,然后成成员函数里面加四这个位置啊,函数指针取出来,然后呢进行一个调用,那么所以说我们还要需要来在这个地方的话,需要先获取我们的npc的对象。
才能够调用这个库啊,当然也可以直接把这个扩来提取出来哈,但是这样的话呃不是很好,我建议的话还是我们先找到这个npc的对象啊,然后呢在这里呢,来调用相应的库,当然在这里的话。
我们也可以把这个n p c的id啊写进去,然后用数组的方式呢嗯来取出我们的npc的对象,好的,我们在这个地方下个段,那么重新让它断下来,我们先取得五大宝这个npc对象的,先取得他的一个ecx。
那我们看一下,这是我的大宝嗯的这个npc的对象,那么它是在这个位置,那么取出了这个对象之后呢,它加了4号这个地方,一层括号,按下回车键嗯,应该是这个四比2820这个函数。
那我们往下次先看一下现在的ea x啊,也就是这个四比二八人这样计算出来的,好的,当然我们也可以直接的这样调用啊,先做一下测试,用代码输入器啊不行,音呼吸音,复习0x450 。
当然这里还有一个e4 x这个参数要给他放了进来,这个是扩的一个参数,那么我们的e c x我们看一下,13x59839 ,四比2821,好的,那么我们注意一下我们的代码,那么这个地方好像还是没有。
我们没有一个反应,我们再来看一下这个库,那么理论上来说的话,这个扩的可能性应该是很大的,那么我们再回到这个扩的上一层去看一下,或者说它的一个附近,再测试一下后边的这个扩来试一下。
那么这个过程我们测试的话,它可能只是向服务器发送了一个什么数据请求啊,那么我们继续来看一下啊,这个三后边的这些数据,然后试一试这个地方,看一下它附近有没有这个相应的这个扩,那么这里也有一个空。
做了一个相应的判断之后呢,这里也是加四这个位置,那么可能也是刚才这个扩的一个地址,我们在这个地方下个段来看一下,那么这个时候呢也会断一下,那么1x的数值呢,同样是这个四比2820,只是参数变化了。
变成了四零,那么我们接下来再测试一下四二点,这个参数,那么同样的没有打开我们的这个npc的相关的这个菜单,那么我们接着往后边啊,再继续继续我们的一个测试,在这个位置,那么这前后的话没有这个相应的扣啊。
所以说我们不管它,再看一下后边这个访问的位置,那么六这个位置呢前后来也没有看到啊,相应的空,那么我们再往后边再看一下,那么在七这个位置呢,这里有一个过啊,三ea,那么我们在这个地方下个段来看一下。
那么这个时候我们发现了同样的同一个括号,但是这里呢它参数变了,那么我们把相应的参数来做一个改改动啊,但是我们注入进去之后呢,也是没有没有反应,那么我们再接着往后面看一下,那么这个地方呢有一个括。
他把我们的也是对象啊取出来,然后进到了这个括里面,那么我们这个我们看有没有测试过,没有测试过的话,我们也可以测试一下,那么我们先取一下它相关的一个参数,首先ex是我们的外部对象啊,e si。
我们来看一下,这个是一个未知的一个数值,那么一di,好像是这个我们也不知道是什么啊,好的,我们测试一下啊,这个相关的库,那么我们关掉npc对话,然后呢再测试一下,然后我们注入之后呢。
发现这个地方呢它同样的是没有反应,也不是的啊,那么我们再继续下一个获得一个测试,编号九这个位置我们看一下,那么这里呢也是取出了我们相应的这个npc的对象,我们这个地方呢,但是它断不下来的这个地方。
那么我们接着再看下一个地方,看一下四dd 023这个位置,那么我们在这个地方进行下段再看一下,ec x啊,外部对象ex这里是一零,然后我们的ec x,还有一个ebx,我们来看一下啊。
但是这种形式的话看起来也不是很像啊,那时候我们来进行一下相关的测试,第一个数字1014x等于我们的,df 2598,然后我们的e4 x等于648扩的地址呢等于4c4740 ,好的我们再一次啊注意一下。
那么注入之后呢同样没有反应,那么在下一个,那么我们再进行下一个数据的一个测试,那么下一个呢是在这个地方,然后31a哈,但是这个调用的话,我们应该之前已经做过相应的一个测试了啊。
那么这里有个4626tx g,这里就462,但是这个地方不知道有没有执行到我们下一个断点,那么也会断到这个地方,但是这个地方我们看一下dx的数值,同样的是我们之前测试的这个相关的代码。
那么它传进来的参数呢是00462,那么我们进行一个相应的测试,462先让他跑起来,那么同样呢没有反应,那么我们接着再往后看,是滴滴,我们生产是接近069,好像是测试到这个地方了。
那么这里来取出我们的e4 x之后呢,嗯这个呢也应该是我们的这个mp 4对象,然后来做了一个判断之后呢,这里有一个420的一个判断,那么可能也是我们这个n p c c的相关的这个库四零。
我们看一dx也是我们这个空,那么我们再测把参数改成4204项,那么同样没有反应,那么我们再看一下后边的代码,啊这个也是420420,我们已经做过相关的这个测试了,那么我们在这个地方下个段看一下。
看一下他数据的一个走向,420这个地方没有被执行到,但是这个时候呢ex呢也是我们相关的一个数据,这里有个401啊,同一个库,那么我们看一下这里传401相关的数据信息。
那么这个时候呢这个过来他也能够打开我们的m p c对话,那么我们点一下打开仓库啊,那么这个时候的话算是测试通过了,还可以来打开我们的这个仓库,那么说明的话我们这个扩的话才是我们真正的npc打开的这个库。
而在这里呢是我们的npc对象,那么所以说所以说我们在下一节课写这个代码的时候呢,我们还需要呢呃取得另外写一个函数,来取得我们n p c对象的一个这样的一个函数,那么我们可以通过一个npc的名字嗯。
来先骗你获取我们npc的对象,然后再来调用这个库,那么这里呢我们为了呃更新的时候少更新这个扩的代码的话,那么呢我们可以把这个扩的地址去取消掉,我们可以这样啊来访问它,ex。
那么我们可以仿照他的代码来写e4 x,ex等于e x加四啊,最后呢这样调用就可以了,那么也就是仿照的和这两句代码来进行一个书写。
好的,那么我们再次进行一下测试啊,这个时候也可以了啊,那么我们只需要一个参数,就是npc的对象啊,这里传1x镜头,好的,那么我们由于时间的关系了。
那么我们下一节课呢在正式啊重新来进行我们的代码的整理测试,那么刚才我们找到的四dd 7比三这个位置,没,那么这个加湿这个位置的话,它通过这个参数的一个不同的控制啊,它应该能够实现很多功能打开npc。
那么也可能是n p c菜单的一个选择的话,也可能再给你都有可能,因为我们在测试的时候发现这里从401420316,那么很多的这个参数呢都是从第三个参数啊,这里面传进去的好的。
那么下一节课呢我们再进行相关的数据的一个封装,那么这节课呢我们就测试到这里,好的,那么这里呢我们大家也可以把这个当成一个坐力啊,自己下去啊,先封装一下相应的这个功能的一个代码。
P57:068-获取指定NPC对象GetNpcObjForName - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么上一节课呢我们分析了一个打开npc对话的一个库,那么其中呢有一个参数,它要求是指定npc的一个对象,那么我们呢像这种的话。
我们需要呢呃先编写一个函数来获取我们的n p c对象,那么我们这个函数的名字呢就是呃npc的这个名字,那么我们把第67课的代码打开,二,打开之后呢,我们先到基础单元删掉。
我们打开pc对话的这个货的一个定义,因为这个扣了啊,用不到嗯,那么另外我们转到结构单元嗯,n p c的话,它在我们的怪物列表里边啊,也就是附近的这个相应的这些对象,那么我们在这里添加它相应的成员函数。
然后呢为我们的这个成员函数来听你讲我们相应的代码,在get it代替后边,那么首先呢我们需要进行一个偏离,就这里我们返回值应该是d的,那么首先呢我们要需要进行一个偏离,偏离之后呢。
我们找到指定的这个对象之后呢,然后然后把它的相应地址来返回,那么我们先随意的给它一个返回值,我们再到前面初始化部分,来看一下他有没有取得我们相应的对象的一个地址。
那么它的成员里面的话是明智hp等级坐标这一类的,但是呢我们呃为了让我们在下面的这个函数,可以通过我们的n p c名字来返回对象的话,我们需要在它相应的这个结构啊,呃成员里边呢添加我们的一个对象地址,这。
那么添加了这个地址之后呢,我们需要来嗯对它来进行一个相应的初始化,还需要,那么对象地址的话啊,就是这个nd不解啊,这个题,那么这样的话我们就能够把对象的地址了返回,那么我们在偏离的时候呢。
我们就对它的一个呃周围的一个对象的一个名字呢进行一个判断,那么如果这个怪物的名字等于我们要找的这个名字的话,那么我们就取得它的相应的地址就可以了,好的,那么我们在这里呢用一个循环,哈哈哈。
那么在这个循环的时候呢,我们的这个列表的大小的话应该是不确定的啊,我们来看一下当时我们有没有指定它的一个大小,那么当时它的大小呢是100啊,那么这里呢我们也骗你100就行。
但是这种算法的话实际上不是很科学啊,这种就是也可以,我们可以用维克特这一类的动态数组来确定它,可能算法呢会优化一些嗯,那么我们先照着写一下啊,100的话应该也是够用的啊,然后呢我们再在调用它之前的话。
我们需要来进行一个初始化啊,但是我们在这里呢可以不写,嗯,那么我们每次调用的时候呢,我们都用用这个get代替呢,呃来初始化一下啊,然后再调用在后边的这个函数,那么首先呢我们做一个条件判断字串的啊。
然后传进来的这个名字呢,比如我们的列表里面的这个,怪物列表里面的这个对象呢的名字啊进行一下对比,那么如果等于零,也就是两个相等相等的话,这个时候呢我们就返回它的一个地址,好那么这样就可以了。
那么如果是这里返回了地址之后的话啊,在后面的就不会被执行,那么如果整个循环我们偏离完成之后都没有发现的话,那么这里呢这里呢我们给它返回一个空子,好的,那么我们重新生成一下,接下来我们进行一下测试。
那么同时呢我们把上一节课的这个打开,嗯打开n p c的这个库来把它删掉,好再重新编译一下,那么同时我们也把它这个头文件里面的相关说明呢也要跟它删掉,还有主线层里边的,好再重新编译一下。
那么我们接下来进行一个相关的测试,这个时候我们需要把呃相应的数字来给它打印出来,返回的这个数值,那么这里呢我们也需要进行一下测试,再出现成单元开始体积,这里,get data。
然后呢我们取得我们的npc对象,然后我们把这个相应的数字呢打印出来,我当时把这个事当转转啊啊,好的,那么我们把它编译一下,那么还需要一个括号吧,打开了我们的信息啊,查看器啊。
调试信息查看器,然后呢,我们注入到游戏里面。
然后我们先挂接到主线程,然后测试看一下它打印出来的数值,嗯那么这个时候呢我们发现我们的测试的话呃,它没有打印出我们相应的这个信息啊。
那么我们再来看一下,没,那么说明他没有执行到这个地方,可能是,那么我们在之前呢再打印一段调试信息进行尝试,那么同时呢在,我们这个测试一这个按钮,这里呢我们也给它加一段调试信息,看他执行到这个地方没有好。
那么我们再重新的编译一下,再重新输入。
然后我们再一次哈挂接到主线程,然后再测试,再来看一下我们的调试信息,那么我们发现了它执行到了我们的max test这个位置呃,但是后边的这个代码呢他没有执行到,那么没有执行到的话。
可能是我们编写的代码的话出现了问题,这个空也就是我们的gtnpc或类,那么这个过来可能是里面出现了相应的一些问题,那么在他他之前呢,我们是先执行了一个格代替,那么也可能是这个格代代替呢。
这里出现了一些问题,那么我们再来看一下这一段啊,对象的地址,那么我们在这一段呢,我们也给它加上一些调试信息,然后我们再这偏离这个地方呢,我们也给它加上一些调试信息,好那么我们再重新编译一下。
那么我们重新再附加到游戏里面进行调试,先挂接到主线程,然后来测试,那么这个时候我们发现的话,我大宝呢他有呃有被偏离到,但是呢可能是我们没有返回正确的数字,或者是后边啊的某一个位置哦,这里有一个空字串啊。
那么空字串的话我们应该是呃可能是我们的这个函数啊,比较函数的话,它不能够比较这种空的这个字串,那么所以说问题可能是出现在这里,那么我们在这里面加上一个区的判断嗯,如果这个指针为空的话。
那么在这里呢我们直接呃就进行下一次的一个循环,要加上一个空的一个判断,好的,那么我们先把前面的这些调试信息可以注释掉了,那么接着我们再进行测试,那么我们清掉调试信息,然后呢再次挂机到主线程测试。
那么这个时候最后呢平时指啊,平时值啊,我们应该是伟大方啊,那么所以说他没有找到平时指这个对象啊,那么我们还需要改一下这个地方,那么这个时候我们前边的这些调试信息呢,可以把它啊删掉,重新生成。
然后再次测试,然后挂机到主线程测试啊,最终呢我们出来的这段数字的2d f,那么我们来看一下这个找出来的数值是不是我们的n p c对象,2d f25598 加上320,那么这个时候的话我们可以看到了。
这里是我们这个npc的一个名字,360这个地方,那么我们再回到它的机子这个地方进行查看,那么也能够看到啊,这里是它的一个数组的下标,然后加四这个位置呢是我们的四比2820的这这个入口地址啊。
函数的一个入口地址,那么说明的话我们的这个函数的话是正确的啊,现在好的,那么我们下一节课呢,嗯再见啊。
P58:069-打开指定NPC对话 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么上一节课的时候,我们一起来写了一个函数,可以通过npc的名字来来获取npc的对象,那么这节课呢我们封装一个打开npc对话的函数啊,通过npc的名字来打开一个相应的对这个对话。
打开我们第68课的代码,然后我们移到结构单元添加一个打开pc,的一个函数八,那么这个函数的话,我们也可以把它封装在我们的呃这个怪物列表里面,因为他要与我们的这个周围的怪物对象的话也是有一些关联的啊。
嗯然后呢我们添加相应的代码,三个位置,92112,啊然后我们这里呢添加这个相应的一些代码,那么首先呢我们就要取得一个呃这个n p c对象的一个地址,那么在这里呢我们建一个临时变量。
然后把npc的名字传进去,那么传进去之后呢,我们再调用这个npc,打开npc的这个空就可以了,啊,然,后添加异常的处理,啊,那么这里如果是产生的异常,然后呢我们就打个de,那么如果是执行完。
我们就返回针啊,然后这里呢我们用布尔,因为稍微做一下修改,千万,然后这里呢我们添加我们的汇编代码块,那么其中这一项呢就是我们前边这里获取的npc的对象,那么如果他获取的n p c对象的话啊,为空的话。
那么在这里呢我们加上一个判断,那么如果这个数字为空的话,那么我们就直接就返回啊,fast调用失败加上这样一个判断,那么这里呢把我们mp 4的对象呢传给ec x,然后呢取出相应的获得这个地址。
那么同时呢也是跟ec x这个寄存器呢传一个参数进去啊,因为它也是呃作为我们的this指针啊,传进去,好那么我们接下来呢就可以来进行我们相应的测试,移到我们的主线程单元,测试一这个地方啊。
那么注意这个n p c的名字一定要传正确啊,传错了的话肯定是不能够打开的,哈,好那么我们编译一下,编译生成我们的代码,然后进行我们的测试,那么首先呢我们挂接到我们的主线程,然后让我们切换到游戏看一下。
然后选测试呃,这个时候呢我们出错了啊,那么我们看一下出错在什么什么地方,有没有相应的一些调试信息出现,那么伟大宝呃,这个对象应该是船队了,那么我们来看一下我是不是我们的相应的汇编代码有出错吗。
但是这里呢我们并没有出现相应的这个异常的呃这个信息啊,嗯那么我们重新的启动一下游戏,再来进行一下测试,把他游戏打开之后呢。
我们再次哈注入,然后呢挂接到主线程,再进行一下测试,那么这个时候呢我们发现呢它仍然会出现这个问题,那么这种可能的话,那么可能是我没有选中这个npc的对象,我们之前的测试呢都选中了这个npc的对象来。
然后在机型的测试。
那么这次进入游戏之后呢,我们先选中选中一个对象,或者是选中自己,然后再或者是选中一个npc,然后呢我们再注入再测试一下,挂机出现的差异,然后把游戏打开点测试。
那么这个时候呢我们测试我们发现了它可以正常的打开n p c,那么很有可能就是那么这种情况的话,很有可能就是我们的呃这个打开n p c,在这个扩它调用之后呢。
可能还会访问到我们的这个选中的当前选中的这个对象,那么如果我们没有选中对象的话,他这个时候去访问到这个空子战场呢,或者是一个不正确的这个指针的话,可能会出现这样的一个错误,那么像这种情况的话。
我们呢可以先把相应的这个位置来给它做一个初始化,那么我们看一下我们的选中啊,选中对象,这里,我们的人物角色里边好像有一个选中对象的函数,我们找一下,那么这个人物角色这里边还有一个选中对象的。
那么我们下次我们执行的时候呢,我们可以先选中这个npc,然后再打开它嗯,这样就可以了,那么我们也可以把它写在这个位置也是可以的,那么这个时候呢我们把它的下标传进去。
那么下标的话我们上边呢是读取的是它的对象啊,那么这个价格的话我们需要加八这个地方呢我们才可以获得,噗噗,那么这样呢我们就能够呃这个获得相应的这个i d,然后呢我们选中这个对象。
然后呢我们再执行下面的这个打开npc的这个动作呢,嗯嗯应该来说就可以了,那么我们再次来进行测试,不能,那么在测试之前呢,我们先把这个选中的对象来取消掉,为什么先移到我们的基础单元。
找到我们的人物角色的机制,那么这个地方加上我们的一四比八啊,就是我们选中对象的这个数组下标i d,那么我们要取消选中的话,这个地方呢我们就把它作为f f。
这个时候呢我们就嗯理论上来说就没有选中任何的这个对象里,那么只是说这上面呢它还会显示一个标志,显示一个标志而已,好的,那么我们接下来再进行一下相应的测试,还需要重新编译一下。
挂接到主线程,然后呢选测试,那么可能是我们刚才读取的啊,这个i d这个地方可能是读错了,那么我们看一下这,个地方呢它没有写入我们的npc的这个,好的,那么我们再来看一下我们的代码。
加八啊这个位置嗯,然后呢是我们的id取出来,我们进入到这个库里面进行看一下,这个也是调用我们的gx加四这个地方,然后他也是取出取出这个对象,与我们刚才的这个打开n p c的这个情况哈是差不多。
也是一样的,那么可能是这个机子它已经更新了啊,3116640这个,那么我们再次启启动一下游戏哈,然后进去看一下这个所有对象的机制是否更新,那么重新启动游戏之后呢,我们先用呃。
先尝试用d来附加到游戏里边,看一下是否是我们的机子已经更新。
那么所有对象的啊,这个我们可以看一下,看能否搜到这个地址。
哈哈哈哈,那么这个时候的话我们收的话没有收到我们的这个相应的地址,那我们再来搜一下啊,再尝试一下,那么刚才刚才处于模块的这个位置来看啊,不对啊。
那么现在呢我们收到的这个地址是正确的,那么如果是出错的话,可能就是出错在我们的这个选怪的这个啊,选中对象的这个地方,那我们再来看一下刚才的调试信息,调试信息的话。
在这里他就应该要打印出我们的一个这个i d的一段信息,我们看有没有打印出来,那么这里有一个i d等于2e,哦对了,我们应该是加c这个位置啊,2e的话是加八这个偏移,那么我们偏移的位置的嗯,刚才传错了。
因为这里打印出来是2e,那么e的话是加八的,y位置呢是我们这个对象的分类好的,那么我们一到后边进行相应的修改,转到我们的定义啊,那么这个地方呢应该是加加0c啊,应该是我们的这个相应的一个分类编号啊。
那我们看一下这个零售这个偏移的话,它有没有相应的一个定义,那么这个偏移的话,我们应该是在初始化里面呢啊直接有这个相应的这个定义,那么在这里的话,我们实际上呢呃返回一个结构的话。
可能呢嗯用的时候更好用一些,那么暂时呢我们先做一个测试,好的,那么现在呢我们没有选中任何的对象,然后呢我们注入我们的代码,然后我们挂接到主线程,然后呢把游戏打开测试。
那么这个时候呢我们发现呢能够呃能够这个打开我们的npc对话,并且能够打开我们的这个相应的这个仓库啊,好的那么这节课的测试呢,我们暂时就到这里,那么大家下去之后呢,可以把这段代码来进行一个相应的优化。
那么在选中对象的时候,可以另外存在一下这个co不行啊,那么我们可以通过一个对象的名字来选中它啊,npc或者是另外从这个函数啊,选中npc对象啊,就这样啊,嗯我们来看一下,现在可以存在一下。
我们直接来存在一下这个函数,转到声明这里啊,那么在这里呢我们再写一个函数,cl n p c,ok那么我们选中我们的npc,也根据它的名字来选中,好复制一下,然后我们转到它的后边,哈哈。
那么首先呢我们要根据这个npc的名字来要去骗你,找出它的一个相关的这个id,差,那么首先呢我们是对它的一个名字和取出来来进行一个比较,用我们传进来的这个n p c的名字来进行比较,那么如果比较的结果。
等于零,那么呢我们就开始嗯调用我们的选中啊,选中函数,然后我们取得它的相应的这个id,啊那么理论上呢这样呢我们就可以选中指定的这个npc了,但是呢在这之前呢,我们也要做一个判断,啊。
那么如果这个npc的名字嗯是空的啊,是一个空字串人,那么我们继续来下一次循环,那么如果整个循环完了之后,我们都没有找到的话,那么在这里呢我们把bass,那么如果在这里呢,我们找到了那个返回去返回数字一。
好的,那么我们在这里啊复制一下这个函数名,然后我们转到后边的,我们新添加的这个选中啊,打开npc的这个函数这里,然后来进行代码的修改,转到定义啊,然后在这个位置我们可以做一些修改。
然后我们在这里呢也把npc的名字啊传进来啊,那么这样的话我们的代码呢呃看起来呢就会简单一些呃,可读性呢可能会高一些,那么我们再重新编译进行一下测试,然后呢我们先关掉用p的窗口,然后呢挂机主线程测试。
那么这个时候呢我们就呃也是同样的一个功能啊,那么只是我们编写的代码的话,这样呢嗯以后呢更便于维护一些啊,就是我们可以呢呃如果以后偏偏移改动了之后呢。
我们只需要在这个媒体标题里面呢来修改我们的这个偏移就可以了啊,在这个地方我们修改偏移就可以了,好的,那么我们下一节课再见啊。
P59:070-存放N个物品到仓库 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们主要来分析一下,那么一次存放多个物品,在我们存放物品到仓库的时候呢,我们有一个物品的数量啊,像药品啊或者是回城符这一类的,他需要输入一个呃相应的数量。
那么一次它可以成啊很多各相同的这个物品来到我们的仓库里面,那么这就是我们这一节这一节课所要分析的一个目标,那么如果还是按照我们之前的呃,通过移动物品来实现的话,那么中间的话它需要很多个步骤啊。
那么我们这节课主要来分析一下,看能不能够用一个空来实现哈,就一次性的把某个物品啊存放指定数量到我们的仓库里面,哈哈哈哈哈,那么我们分析的话,我们可以从两个方面来入手,一个是呃我们的这个物品的话。
肯定他要向我们的服务器发送这个数据啊,就是告诉服务器我们存放了多少数量的五个物品到我们仓库里面,那么还有另外一个呢就是我们的这里有一个数量啊,可以从数量这个关键的数据来进行逆向分析。
分析这个数量的一个走向,那么最终他在发包的时候,肯定也有一个关于我们物品数量的一个数据啊,这个是一个相当关键的数据,我们可以通过这个数据的话,肯定就能够找到这个存放的,存放这个物品的这个扩啊。
那么我们先打开我们的mod。
附加到我们的游戏里面,那么我们先尝试在呃数据发包的这个函数上面下断点,那么我们先不让它断下。
先我们在这里输入了一定的数量之后,然后我们在让它断下,断下之后,我们再按确定啊,这个时候呢他肯定就会向我们的服务器啊发送这个相应的数据,就是说我们的每一个物品啊存放了33个啊,到我们的仓库里面。
那么这个时候呢我们可以把这个断点呢取消掉,然后呢我们用ctrl f9 啊,执行到返回,然后这个地方我们可以看到它调用了这个函数来发包,那么一般来说的话可能就在上一层啊,就是我们的这个库啊,嗯发包的。
那么这个地方的话他也在就是说这个库里边它进行了发包的一些数据,那么在这里的话他可能就建了一个缓冲区,来把我们的物品数量,物品的一个种类啊,那么来向我们的服务器发送好的,那么我们在这个地方下段啊。
下一个断点,这里我们是纯仓库,物品的存仓库,然后我们再再一次按下我们的ctrl f,那么执行到这个地方,我们,仓库,那么我们也跟他下一个断点,那么然后我们再一次啊,那么我们发现呢,就这个时候呢。
就执行到了这个打开仓库或关闭仓库的这个注释的这个地方,那么我们先让它跑起来,在这个地方呢我们眼下一个断点,但是这个扩的话,理论上来说的话,因为我们之前的打开仓库或关闭仓库都会调用这个地方。
那么在这个地方的话,它可能呢呃是我们存放存放这个物品的可能性就比较小,只是说我们这个存放物品关闭仓库哈,或者是打开仓库,它可能都会像我们的服务器呢发出一段数据,好的,那么我们再一次存放一个相应的物品。
那么这个我们发现呢它在创建这个窗口的时候啊,或者是关闭这个窗口的时候呢,它都会来调用啊,这个地方调用这个库,那么我们先把这个断点来取消掉啊,它可能也就是我们的一个窗口对象这一类的啊。
窗口的关闭或者是嗯打开这类的操作啊,窗口的一个关闭或者是创建,它可能会通过这个库来实现好的继续跑起来,然后呢这个时候我们看一下这个地方呢,它也会断线,我们也让它跑起来。
但是呢这个时候的话我们并没有存放我们的物品,那么只是说把我们的某个对象移动到了这个仓库里面,那么这个过来它就会被调用,所以说这个地方的话他应该来,也不是我们的这个相应的存放我们这个物品的这个空。
那么最后一个的话应该就是我们离这个发包函数比较近的那一个是,那么在这里呢我们输入数量啊,输入九,然后我们按确定,那么这个时候呢会断在这里,那么这个库里边的话,它就会像我们的服务器呢发送相应的这个数据。
那么说明那么这个数据里面肯定包含了我们物品的数量,还有一个就是我们这个物品的一个标志啊,或者叫d它用来表明一个身份,表明我们是成的某一项物品,那么它肯定有一个相应的服务器的这个物品的一个分类编号啊。
这一类的,当然这个分类编号我们并不知道它是多少,但是我们知道的这个关键数据呢就是这个物品的数量,那么我们看一下这个谱写的话,它是一个常量,那么我们就不管它,那么我们就来看一下。
这个时候这里呢有一个数值啊,18a488 ,那么这个数字呢就是我们的一bp减2818,他是先取取了存放到ec x一点,但是呢在这里呢这个机制改变了我们的ec x的这个数值,那么所,他说要查看的话。
我们可以堆栈把这个18a488 把它复制出来,用db的方式来查看,那么我们能够在这个地方来找到我们的数量级啊,那么我们把这个地方记一下,大概是在要e e d啊左右啊,d e f大概在161718。
大概是在这个位置,我们先记一下,然后呢先让它跑起来,那么再一次我们存放到仓库的时候呢,我们把它的数量改一下,改为七啊,然后呢我们再按确定,那么这个时候呢我们看到有两个地方改变了,一个是七。
那么另外一个呢是八七啊,这个地方改变了,那么我们再次让它跑起来,那么数量的话,我们基本上确定的是在这个位置,好把这个相应的数据呢我们复制一下,那么这个地方我们可以数一下啊。
这里是1011121314116171819,这里是ea啊,那么就是说是这个缓冲区的数加1a这个地方呢是我们的物品数量,那么这是它的低位啊,那么高位的话可能后面的话这里呢他可能是占了四肢解。
但是现在我们还不能够确认他好的,那么我们继续来看一下,那么另外还有一个地方它改变了,那就是在我们的这个地方,b7 这个地方,那么这个地方改变了,我们是2a啊,这个地方,那么这个地方它究竟是什么意思呢。
我们也不知道,那么我们直接呃接下来呢再说一下啥事,那么分别呢我们用金创药打过这个血原声这两个物品来做测试,因为这两个物品的话,它肯定有一样是不相同的,也就是说它在服务器的一个分类编号肯定是不一样的。
它只有不相同才能够区分这两种物品,那么我们先存放这个雪雪原生存放数量三,然后我们看到这里是三,那么这里是八零啊,改变的数字呢是八零,那么这个80的话,它很可能就是我们的物品的一个分类编号。
那么我们再一次啊存放三个进来看一下,那么这个时候呢由八零变成了我们的7d,那么这个我们是那么我们发现的话是同一个物品,它这个数量呢也在变,那么说明这个位置的话啊,零三刚才我们是说的是2a啊。
这里呢是3a这个地方,那么3a这个地方的一个变化的话,它可能是其他的一个发包的一个技术啊,在不断的减少变化,那么我们也给他备注一下啊,3a这个地方,当然这个地方呢它在不停的变化。
那么二类这个地方呢b7 呢我们发现了它没有变化啊,那么我们再一次用金创药大啊,存放三个数量进去,那么这个时候呢我们发现的话它变化的地方有哪几个呢,你把它记录一下,当然数量这里哈嗯一个是被ea。
还有这个地方也变化了,六三再长一串啊,那么这一串的话极有可能就是我们服务器的一个编号,因为我们的这个物品的种类它比较多的时候呢,他可能就会这个编号呢可能就呃就会比较长,一就像我们的身份证一样。
它的位数比较多,那么这里还有一个六七,那么这里也是一个六七,那么我们发现了这个六七ca 9 a3 b啊,这一长串,那么这两个数字呢是一样的,那么这里呢还有一个1b啊,但是我们不知道它是什么作用。
那么我们先把这一串人复制下来,那么后面全部数字来证明,我们就不用复制,好的,那么我们再一次来测试一下啊,雪原声数字啊,三那么我们发现呢7a这个地方在变化,其他的地方都没有变化。
那么理论上我们把这一段数据把它复制进去,嗯,进去之后呢,然后把这个数量三把它改动之后呢,就能够嗯存放这个三个雪原声来到我们的仓库,那么关于其他的数据呢,我们下一节课来再详细的来分析。
那么我们先来测试一下,这个货是不是可以达到一个存放多个物品,到我们的仓库里面的这个作用,那么我们发现的话啊,这里是67c9 ,a3 b c9 ,第三批,那么这两个的话都是我们情况呢都是原声。
那么这上面这里呢我们应该是存放的是金创药,那么这个数据量的话比较大啊,那么比较大的话,我们直以来用我们的这个时候用代码输入器来测试的话,就不是很方便,那么我们呢现在呢只有用我们的打开第69课的代码。
用它来进行一下相应的测试,那么在测试之前呢,我们把这个相应的数据来进行一下处理,那么我们再进来看一下,这里有个八六啊,而我们在断下的时候呢,它后边的这个数据块的话差不多也是八六至九啊,我看看一下。
在这里的话,从8808182838485 86,那么还要多1。86878889,那么我们在这里呢就跟他分配90个字节的这个空间啊,然后呢来存放我们这个数据块的这个代码作为一个测试。
然后这里呢我们说的1a这个地方呢是它的一个数量好的,那么我们把这一块的数据来进行一下相应的处理,然后我们把这个数据块啊,呃字节起来啊,复制剪切一下,然后我们需要把它处理之后呢。
能够让我们的这个c语言里面的这个数据能够认识他,那么首先呢我们把里边的空格啊,把它替换成逗号,按下空格,然后按下我们的逗号,那么来全部替换掉,那么替换之后呢,第一个啊这个逗号呢我们用空格把它替换掉。
那么后边啊这里面全部我们也用户口来替换掉,或者在前面啊也用空格把它替换掉,那么我们还要必须要加上一个0x的一个前缀才对吧,那么我们再重新整理复制一下,那么首先呢我们要在空格前面加上一个0x那个前缀。
那么0x前面呢我们再加上一个逗号啊,这样的话方便我们处理全部替换,那么我们再把前缀的啊,前面的这个逗号栏删掉,然后在后边的多余的字符呢,我们也需要把它删掉,那你在车站的大家都。
好那么我们可以把这个来把它定义成一个数组字符类型的,或者是我们bt类型,应该开始九零,那么我们可以把它稍微变大一点,然后呢后边的这个呢就是我们所要初始化的这个数据块,那么这些多余的啊,我们都需要删掉。
那么初始化之后呢,我们还需要来调用这个相关的这个空啊,那么首先呢它是一个呼吸六零,那么我们在写汇编的时候,我们也把它写好,好push 0 x86 ,然后呢再复习一次x,然后再是move。
如我们把这句汇编指令的直接把它复制下来,那么然后再调用我们的空,那么这个扩的话我们也需要先把它放到我们的ex里边,然后呢再来call ex,那么这个ec x呢我们需要对它进行初始化。
那么这个1e x的话就是来源于我们的这个nmb被提,那么我们就是取得它的一个地址,这句,那么这样的话,我们理论上呢就能够存放我们的相应的物品到我们的仓库里面,好的,那么我们把这段代码我自己下。
然后打开我们第69课的代码,啊啊啊,那么我们直接移动到我们的主线程单元test一这里啊,然后把我们的代码粘贴进来,进行我们的测试,好的,那么我们首先编译一下,看能否通过我们的编辑。
那么这里呢我们要加上一个封号啊啊,再重新编辑一下,那么首先呢在这里边呢我们的这个局部变量的一个申请呢,我们需要跳过这个case标签嗯,申请到我们可以把它申申请我们全局的,或者是在这个扩的头部。
来进行我们的这个数据的一个定义,那么再重新编译一下,好那么这个时候呢我们编译成功了,那么接下来呢我们进行一下相关的测试,再检测一下我们的代码看起来没有错过了。
那么我们再注入到游戏里边。
那么我们先挂接到主线程,然后呢我们选测试一,那么注意这个时候呢我们的这个窗口来需要打开啊,仓库窗口需要打开,然后我们看一下现在的数量是374,那么我们测试一下,还有371,还有368。
那么每次我们存了三个这个物品才存到我们的这个仓库里面啊,那么证明这个库它肯定是我们已经分析正确了,那么关于相关的这个参数的这个分析呢,我们留到下一节课啊,再进行一个详细的一个分析,好的。
P6:017-注入代码至游戏主线程 - 教到你会 - BV1DS4y1n7qF
大家好。
我是郁金香老師,QQ155,336575,歡迎大家參加郁金香技術編程培訓,那麼今天我們就一起來看一下,怎麼把我們的代碼,掛到我們的遊戲主線程上面一起,那麼至於原因,上一節跟我們也討論了一下。
也就是多線程,他在訪問一些全局變量共享數據的時候,如果他們有一個同步處理機制的話,那麼就可能造成一個衝突,就會造成我們的軟件的不穩定,那麼所以說我們在這個為了解決這種衝突。
就把我們的代碼輸入到遊戲的主線程運行,那麼首先我們把第15課的代碼打開。
那麼要把我們的數據,輸入到主線程實際上非常簡單,那麼以前我們也有講過,那麼今天我們再重複一下,我們把代碼輸入到遊戲的主線程運行,那麼現在我們就把我們的代碼輸入到遊戲的主線程運行。
那麼我們現在就把我們的代碼輸入到遊戲的主線程運行,那麼我們現在就把我們的代碼輸入到遊戲的主線程運行,那麼我們現在就把我們的代碼輸入到遊戲的主線程運行,那麼我們現在就把我們的代碼輸入到遊戲的主線程運行。
那麼我們再添加一個新增項目,這批就能見,那麼把我們的代碼掛到我們的主線程上面,一般我們常用的方式就是用Settings windows hook。
另外也可以用Settings windows log來替換我們創可的過程,兩種方法都差不多,那麼今天我們還是用Settings windows hook這個函數。
那麼在使用之前我們先打開我們的MSN scan。
先來看一下,那麼我們要掛接到遊戲主線程,我們可以選擇第一個勾子類型,也就是用來安裝一個勾子到我們的創可過程,那麼它一共有四個參數,那麼第二個參數也就是這個創可過程的標函數。
那麼第四個由於我們現在注入的是全局的這種勾子,那麼所以說我們第四個參數動態面積庫的劇品,我們就不需要進入空,那麼最後這一個也就是遊戲主線程的ID,那麼我們也可以通過它的創可劇品來獲取。
那麼所以說我們要先獲取遊戲的創可劇品,那麼遊戲的創可劇品的話,我們一個是可以通過Bundle window,但是為了我們的遊戲來便於多開,這裡我們直接找它存放機制的地方,現在遊戲創可的劇品是這個。
那麼我們直接收一打開,收一下它的機制,那麼這樣收出來的數據比較多,那麼最後我們可以過濾幾次,過濾幾次,我們先把綠色的添加進來,綠色的是機制,這裡有四個,裡頭有六個,那麼這個我們進去看一下。
它的地址是在動態鏈接庫裡面,所以說我們用不到,這個也是動態鏈接庫裡面的,那麼也用不到,那麼我們用得到的就是這個程序去模塊裡面,那麼我們選擇第一個,F010-6574,這個存放的創可劇品的機制。
那麼有關機制的,我們還是把相關的定義,放到我們機制的檔案件,開始,這個有點長,把它寫簡單一點,當然這只是它的地址,我們要把這個地址裡面的數字取出來,我們再寫,給它添加一個函數,以上五個,以上五個函數。
那麼這裡我們用紙,把它讀取出來,把這個地址,當然這裡我們直接用相應的紅來表示,那麼這是異常處理的,如果執行在這裡的話,我們就返回空,那麼執行到這裡,我們執行,返回它的一個劇本,好了。
那麼這裡我們遊戲劇品取到了之後,把它前置一下,放到我們的同文件裏,那麼有了這個遊戲劇本的話,我們就可以得到我們的相應的進場ID了,在這裡我們同文件裏面先訂閱,兩個函數,這個是hook,另外一個是。
那麼我們退出的時候,我們用一個unhook,卸載掉我們的主性成一個勾紙,那麼首先我們是得到窗口的一個遊戲窗口的劇本,那麼得到之後,我們根據它來獲取我們的進場ID,現場ID,那麼後面的進場ID我們用不到。
這裡直接指空就可以了,那麼有了,它我們就可以安裝我們的相應的一個勾紙了,那麼第一個就是我們勾紙的類型,那麼第二個也就是我們的回調函數,那麼這裡我們還需要給它寫一個回調函數,那麼這個回調函數的話。
它的代碼實際上就是運行在我們的這個遊戲的主線程序裏面,那麼在用它之前,我們還需要進行一個全機變量,這個後台,用來呈放它的一個迴值,那麼這個回調函數的名字我們把它改一下,作為它的第二個參數,第三個參數。
動態內景庫的這個魔幻劇本我們不需要,第四個參數,也就是我們的現場ID放進去,那麼這個回調函數的話,我們就會把它掛接到我們的主線程裏面,但是這個函數它也有一些要求,那麼我們的MSDN裏面說。
如果它的ND庫的傳進來的數值等於我們這個常量,那麼的話這個消息就是我們進行的一個消息,那麼我們就可以對它進行一些處理,就可以,那麼如果不是的話,我們必須要用這個Core Next Hook。
把這個相應的消息的傳遞到我們其它的一個,勾制裏面,那麼第一個參數就是我們的全球變量,勾制的序,第二個我們照抄,照抄這前面的,那麼這裏我們要做一個判斷,是不是我們自己的信息進來,需要做一個判斷。
當然還要做一些其它的一些判斷,那麼如果是我們的線程進來的話,我們這裏它還有一個CWP Struct這樣一個結構,這是我們進來的一個窗口的劇本,消息的類型,這兩個是附加的參數,那麼首先我們把這個結構。
就是一下需要定義一個結構變量,那麼我們轉換一下,強制的,那麼這個時候,我們取出裏面的值進行一些判斷,比如說它的窗口距離,是不是我們遊戲的窗口距離,那麼如果是的話,是我們遊戲的窗口消息的話。
那麼我們接下來進行另外的一個判斷,再跟它加上一個條件,那麼我們需要自定義一個信息,自定義一個信息,比如說,自定義一個信息,定義一個群聚變量,那麼註冊一個,我們讓系統來給我們分配一個可用的消息的ID。
這後面看到是一個字符串,那麼我們再做一個判斷,看是不是我們自己的一個消息,那麼如果是我們的消息,這裡我們先可以導入一段調試信息,消息傳到了,然後這裡我們看就可以了,如果是我們自己的信息,我們處理了之後。
直接返回就可以了,好的,那麼我們先編一下,看有沒有錯誤,那麼這個消息,我們怎麼把它傳遞進來,那麼MSDN上面它也有說,在這裡我們需要用Send message,把消息給它投遞進來。
或者是Post message都可以,那麼Send message,我們是要等待它把這個消息處理完,我們才返回,所以說我們這裡建議用Send message,那麼在這裡,我們另外寫一段函數,(音樂)。
那麼在這裡我們用Send message,把我們的消息,傳遞到我們的遊戲裡面,遊戲的主線程裡面,所以第一個參數,這裡是我們遊戲的組裝的一個句點,不然的話,投遞不到我們的,投遞不到這個函數裡面。
那麼第二個參數就是我們的MyMessageCode,這個是我們遊戲圖,給我們同隊的一個消息的ID,那麼後面兩個,我們暫時可以省略掉,暫時用不到,我們要用參數的時候,那麼現在我們可以把最後一個參數。
我們可以把這個指針傳進去,物品名字,那麼傳進去了之後,它就會轉到我們的回調函數裡面來,會轉到我們的回調函數裡面,轉到回調函數裡面來了之後,我們可以把它打印出來,最後一個是參數,這個參數我們可以。
因為我們這裡傳遞的是一個字符算,我們就先把它打印出來,然後我們就可以做一下我們的一個測試了,當然這裡我們還有一些清理的一些工作,這是我們退出的時候要進行的一些清理工作。
那麼接下來我們就可以在我們的資源窗口裡面,添加三個按鈕,這個是我們Hook,或者是叫掛接,這個我們叫卸載,然後我們掛上去了之後,我們可以做一個測試,在這裡我們就傳這個信息,就是使用我們的。
那麼添加相應的同件進行,現在主線程,掛接上主線程之後,我們就可以來傳遞信息,使用我們的青窗要塔,那麼這裡我們要用premise,當然這個函數還沒有,還沒有挖到同件裡面,先把它調整一下,好的,接下來編輯。
然後進行測試,這裡我們需要強制的轉換一下。
我們是自主創意型,先轉換成整齊的,那將,好,好,好,好,好,好,好,先掛接主線程,然後我們使用我們的,這裡它就收到這個消息了,青窗要小的這個消息,然後我們卸載之後的話,然後我們在這裡的話。
消息傳遞不進去了,那麼既然傳遞到了,那麼在這裡,我們就可以了,調用我們相應的一個信息,用一個Switch,這裡我們不是還有另外一個,參數3沒有用,就是這個WP,這個參數沒有用。
然後我們用這個參數來進行一個分類,然後我們給它定義一些紅,這裡是使用物品,或者從一開始看,從一可能要好一點,然後在這裡我們就可以了,調用我們之前的這個同意見裡面,包含相關的一個同意見,好。
然後就是我們的參數4,當然這個參數的話,它本來是一個整形的一個值,我們需要進行一個轉換,因為從這裡傳進來的時候,它也需要一個轉換,本來這裡傳進來是字符串,但是要轉換成這裡,轉換成一個整形的一個數值。
然後到這裡的時候,我們再經過一次轉換,就可以調用這個擴容,那麼這樣的話,我們就能夠使用我們的這個金創藥,使用金創藥,我們來測試一下,那麼首先我們這樣的話,它是沒有用的,我們必須要掛接到主線材。
然後再來使用金創藥,看一下我們的調試信息,關掉,相關的同意見包含進行,掛接到主線材,然後使用我們的金創藥,金創藥,使用成功,我們再來看一下,我們的代碼,對了,我們在這裡。
Send a message的時候,我們要進行一個消息的分類,在這裡我們是傳傳遞的0,那麼現在我們要傳遞的是1,這個時候,兩邊它才匹配,那麼這裡才能夠傳到這個消息分類,這個時候肯定就可以了。
這個時候它就可以使用金創藥了,325克,324,323,用完之後,我們要卸載一下主線材,那麼這樣的話,使用的話是非常方便的,當然還有一種,我們直接把窗口在這裡面,比如說這個位置。
我們可以直接讓它顯示一個窗口,那麼窗口裡面的所有代碼的話,它就是都是運行在主線材裏面,當然這種路式的情況,以前的老片子老的教程裡面有講,有說到,那麼可以參考以前的一個教程,那麼今天的一個討論。
我們就討論到這裡,那麼我們下期再見,再见。
網址:http://www。spacevidcast。com/。
P60:071-物品存放CALL 缓冲区结构解密 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么上一节课的时候呢,我们分析并且测试了存放多个物品啊,嗯这个功能扣,那么但是它的相关的参数的一个结构的话,我们没有分析出来,那么所以说这一节课我们重点来分析一下这个缓冲区的啊。
这个结构啊,也就是这一片数据,那么这片数据里面的这些数值它究竟代代表的是什么啊,那么我们需要把它分析出来,那么才能够知道呃,那么我们在存放不同的物品的时候,那么我们该传递怎样的参数,好的。
那么我们打开游戏。
然后我们打开哈这个断点相关的这个窗口,那么我们再一次啊转一下我们的这个存放物品的这个数据,那么我们以这个雪原声为例来看一下存放三个,那么这个时候的话我们最好是在这前面这里下段,那么我们直接来就可以了。
查看ec x里面的数据,那么在这个地方下段的话,它这里呢是18a488 啊,也就是我们也可以这样啊,d d d d p减2818,那么这样也可以显示我们这个缓冲区的所有数据,那么我们把里边的数据呢。
嗯以这个相对地址的方式来加偏移的方式呢来显示,然后把前面的90个字节把它复制出来,那,么这个时候我们备注一下,去延伸数量,三陈道长裤,那么然后呢我们再乘不同的数量进去啊,乘个。
那么这个时候呢我们同样的复制这一块缓冲区的数据,复制到我们的剪贴板,然后再把它粘贴出来,那么我们可以看到前边这一段的话都是没有变化的,那么这个地方才是我们的数量,嗯之前呢我们也有分析。
因为这个地方是数量,那么我们就确定了一个数据啊,好再让它跑起来,然后我们可以再乘一个哈,这个罗汉附身,但是我们可以看到存放这个物品的时候呢,因为它没有输入这个数量,所以说调用的嗯。
这个后来可能是不一样啊,那么我们在盛放金疮药大啊,盛放我们六个或者是七个,那么这个时候也会断一下断一下,我们把缓冲期里边的数据来复制出来,然后让让它跑起来哈,这里呢我们再注释一下,金汤药到七个啊。
存放到我们的仓库里面,那么现在我们把我们所收集的这些数据来进行一些比较,那么首先呢我们看一下它什么地方不相同,那么在前面这一段的话,我们可以看到在前面这一段都是相同的啊,在前面这一段啊都是相同的。
那么我们发现这前面这一段的话基本上都是相同的啊,呃数据,那么只有这个位置,这里是六七,前面这两个地方呢是6a啊,那么首先呢我们确定一下这个六七与前面的6a这个数据的来源。
那么看一下这两个数据它究竟代表的是一个什么意义啊,我们来分析一下第一个不同的地方是,那么可能是从这个幺零这个地方开始,可能是两次结呃,也可能是这几个字节都是连起来的,那么我们先找一下。
那么这个数据的一个来源,那么我们先回到我们的o d里面来查看一下,那么前边对e p嗯有写入的地方哈,对e b p相关的偏移了,有写入的地方,那么有写入的地方呢,我们把它标,标记一下啊,标记一。
那么这两个地方呢都是有写入的啊,还有这个地方以及这个地方,那么这里呢是读取,那么以后呢从这前面这一段代码来看的话,一共就是这四个地方有写入啊,有写入,那我们从第一个地方开始看呢,减一bp减2812。
那么我们看是什么,是哪一个位置,2812,那么2812的话,这个地方的偏移呢,我们给它标注一下,这个地方是加a6 啊,这个偏移对于相对于我们的这个缓冲区来说啊,对家a6 这个这个地方呢在写入。
那么在这个地方的话,我们再来看一下2816,那么2816的话,这个地方呢我们是对加a2 ,这个地方呢写入了我们的四肢解,那么也就是我们后边的这个840094,那么这个840094的话。
它可能就是就是一个固定值,从这里来看的话,那么这个呢可能就是表示我们在存放到仓库啊,对这这样一个指令,那么所以说这个加a2 呢,这里是一个固定值,那么再到后来这里也有一个写入,那么这里一共写入了多少呢。
呃一共1c x加二零,大概写出了80个字节,它的来源的话是来源于e s i来源于这个位置,e bx呢加178c啊,一共往e d i这个位置,也就是我们家2801这个地方,那么也就是往加aa这个地方。
那么这个地方写出了多少个自己来,前面的是e4 x来,是二零的话,也就是循环执行32次,32x4,有空写出了这么多个知己,32啊1c x,那么这里呢他也是我们看一下加aa这个位置啊。
然后我们再看一下27f6 ,那么27f6 的话,这个地方呢它是9亿的,加9g,那这样算的话是不对的啊,因为我们现在的e bp的话应当是变化的啊,那么我们需要呢在这个地方断下来之后呢。
再来计算它的这个数字才是正确的啊,好的,那么我们再次存放我们的数据,那么存放一个好,那么这个时候呢我们断下来了,那么它的这个缓冲区的首地址的话就是一bp减掉2818,那么我们再来重新计算一下哈。
因为刚才计算有误,我们一bp减2812,那么这个地方呢是加六偏,那么加六偏移呢,这里写入的是什么呢,dw warrior 4肢解的零,那么我们可以可以看到啊,z x写入的是零。
那么我们再来看一下这下边啊,然后是1p p减2801,那么这个地方呢是加a这个地方,那么这个地方呢一共写入了我们的嗯,0x20 零14啊,这么多个字节,也就是16进制的啊,0x80 这么多个字节。
那么这么多个字体,它的数据来源是来源于1p x加幺七,哇塞这个地方好,那么我们再往后边看2816,2816的话是加二这个位置,2816,我们看一下2816呢,这里写的是就是后边的这一个常量。
那么这里呢写的也是gw定类型的d word的。
那么写了这样一个常量,那么我们再重新计算一下啊,缓冲区开始是2818,这里是2816,好那么接着往下看,这里呢是27f6 ,那么这个地方呢是加r2 这个位置,那么显示的也是一dx的数数值。
那么dx呢它来源于哪里呢,来源于我们这个机制里边,那么所以说我们在这里的话,直接把这个机子的数字呢写入到里面就可以了,那么我们再看一下这里呢是2。7f2 ,ex也是零。
那么27f2 也就是加二六这个地方,那么写入四字解析w类型的写入的是零好,然后后边就没有我们相应的写入,大概这个数据的结构啊,就是这些好,那么我们先让它跑起来,那么这里呢有最长的一段数据呢。
就是来源于我们ebx加上我们的178c啊,那么这个数据呢是最关键的,也是最多的,那么我们要想办法找到这个eb x,看它是什么,那么而且在这里的话还有呢对我们这个eb x呢也有一些改动的。
这里写出来叫一dx或一个e4 x向向你表示写入哈,那么写入之后的话,它也会影响到我们这个178岁后边的一个数据,但是这里我们不知道他有没有执行到我们下一个断点。
或者它可能是直接就从上边跳到了这一行来执行一课,好的,我们再一次盛放三个哈数据到仓库,那么我们发现了这前面的这一段呢并没有被执行,然后我们按f8 继续往下执行,那么我们可以看到这里呢他已经控了14x呢。
它会执行20次啊,因为要ec x等于零的时候,这里的循环呢它才才退出哈,它会循环的执行这个啊move指令,那么我们可以按f7 ,那么就可以呢在这里来不断的啊跟踪它的数值的一个变化。
因为现在我们看一下缓冲区的一个数值是2818,那么这个时候里边的数据的话,只有前面这几个数字呢是被初始化的,然后呢从加二这个位置呢,他他会来重新的啊,我们这个e si我再来看一下吧,应该是从加a。
这个位置它会呢呃每每次写入四次解,那么我们按f7 来看一下,那么首先呢它是写入的三,然后写的写入的2b0 c1724 好,然后写入的6a c a9 a3 b好,这边后面呢写入的是零。
每写入一次呢e c x的数值来减一,现在变成,那么我们只要把这个数据的来源找到的话,呃,我们整个结构的数据的话就填充完成了啊,那么我们再一次啊让他断一下,找一下eb x的一个来源。
把一bx的数值啊投制出来,好先让他跑起来,然后我们看一下这个刚才复制出来的数据ebx,那么ebx的话它是从,从这个1784这里开始复制的,我们再来看一下17842。
那么这里呢我们能够看到好几个熟悉的数据啊,这个d a c a9 a3 b啊,这里面也有这样一串数据,那么这里的一共40个字节啊,应该是80个自己哈,在前面的这80个字节呢都是来源于这里。
那么我们来看一下这个对象是一个什么对象,用dd先来看一下它的类型,那么这个类型的话是ef,那么ef的话好像,嗯有一些我们在修炼红的时候呢,好像接触到这个类型的对象。
那么我们看里面有没有什么字串这一类的能够给我们提供帮助,但是呢这些字串的话我们也看不出任何问题,这个时候我们先找一下哈,这个ebx的一个机子,用c一打开,找一下。
那么这里呢一共有两个啊,那么其中一个的话应该是一个机制,那么我们把这两个相关的数据复制出来,那么一个是31c,9a24 ,那么我们找一下,看这个是不是我们所料的机子,仓库背包机制啊,这个是。
那么之前的话我们有备注,这个啊应该是一个仓库的一个背包机制,那么第二个的话可能就是其他的这个对象了啊,我们可能这个应该是找不到,再找一下三,所有常量,那么这个是找不到的,说明的话机子呢就是这一个机制。
它就是一个仓库的一个背包机制。
好的。
那么我们把它复制出来,那么也就是说我们现在的这一块数据的话,有一段数据呢是来源于这个仓库的呃,数据机制里面的加上一个幺七多少,我们看一下,加上我们的1784啊,正好,因为这里是取得地址哈。
所以说呢就是这个,也就是这个19f53248 好,我们再来看一下,看一下这里的地址,但是我们这样搜索出来,我们发现不对哈,呃刚才这个是ebx的一个数字,应该是这一个,28啊,对的呃。
这是我们仓库背包对象,那么再加上我们的178c啊,就是这个数值,好的,那么我们再次来看一下,那么我们主要看一下这个里边的数据,它会不会变动啊,如果不变动的话,我们直接就把里面的40个字节的把它复制出来。
那么我们在这里呢给他下一个呃,如果它是变动的话,肯定就有一个呃内存写入的一个断点,那么我们在前面的这80个字节呢,给它下一个路程写入的断点,再一次我们存放相应的数据。
但是这个时候我们发现物品拖到这个仓库背包里边的时候呢,这个时候就断下了呃,它就会向里边会像这个腰1794这个地方来写入这个数据,而数据的来源是来源于我们的1d x d x呢来源于c44 这个地方。
那我们看这个ex是什么,ex加c,那么c44 的话,这个我们有一些认识啊,就是物品的数量应该是我们,那么这个ex的话很有可能就是我们呃背包里边的呃,我们这个药品的一个数量,那么如果是的话。
它也有一个名字,那么我们用dc来查看一下这个对象。
那么我们发现的话这个对象呢就是我们的金疮药啊,金创药大,那么在这里的话它是什么呢,首先呢呃写入我们的物品数量,那么ex我们也给他标注一下,对了,这里有个28,我们也应该很清楚这个。
那么这个f9 f598 ,ac加28,这个是我们选中的对象,选中对象,那么然后呢他从这个选中对象里面它取出来,那么这个选中的对象的话,就是我们的要存放的物品,要存放到仓库的物品,那么在这里的话。
我们的选中对象呢就是我们要存放到仓库的物品,那么这是我们物品的数量,好的我们先把断点取消掉,让它跑起来,那么我们再来分析一下后边的一个数字,那么把ex的数字呢,先把这个对象的数字呢我们先复制出来。
2d a901 a0 ,好的我们接着往下看啊,这里呢我们是物品的数量写到我们的背包的这个1794这个地方,哈哈,那么然后一整块数据的话,可能都是从我们的这个选中对象里边来提取的,那么如果真的是这样的话。
那么我们在存放物品的时候呢,我们就可以以背包里边的这个对象的数据来做一个参数,那么就可以直接来存放我们的呃这个物品,那么这种呃设计的一个逻辑思路啊,它也是正确的啊,那我们接着再往下面看一下。
除了这个c44 之后呢,这里是c48 嗯,然后呢我们看一下ex相关的,然后这里有一个四岁五零啊这些地方,那么我们再一次让它断一下,来看一下,那么金川要大哈,我们突放在这个时候。
好像我们需要在这里下一个断点,这里是数量,那么我们看一下c s8 ,这里是不是,好那么这个时候在拖动的这一瞬间呢,它就会像我们的仓库列表呃,里边的相关偏移来写入这个数据啊,首先写的是数量。
然后我们按f8 往下执行,这个时候呢ex呢是零啊,这里写一个是零,那么是您的这种呢,我们暂时忽略他们啊,不管,然后我们再往下边一cx,取了一个e4 x出来,然后再次把我们的这个对象ex取出来了。
这个1a0 ,这一个,那我取出来之后呢,这个时候呢他先取出了ex加4c这个地方,我们来看一下加4c这个地方是什么d b等显示,那么我们发现恰好也就是我们的67c a99 a3 b,那么这个数据的话,在。
大概是在这个地方啊,还有是这个地方,也就是我们的1012哈,在101112的这四个字,四个字节,那么也就是说我们可以这样来备注,那么ya呢是物品数量,那么之前的幺二。
这里呢有四个数据是来源于我们物品对象加4c,一共有四次解,我们可以用d w来表示,或者是直接标注自制解啊,来源于我们物品对象加4c那么这个幺二的话,我们可以看到幺二的这四字节和三二的这四字四字解哈。
都是来源于这个地方,那么我们可以把它复制一下l2 ,然后三二这个地方四字节也是来源于我们物品对象是c啊,这个偏移好,那么我们继续往后来执行,啊f8 ,那么是把这四个字节写入到他相关的四个字节。
然后是ex加五零,也取了四个字节出来,我们看一下这个时候圣灵啊圣灵,那么零的话肯定也就是它的这个数据零,也就是我们的请安卓的,这里的话应该是取了八字节出来的,八字节来源于4c这个地方。
因为4c与五零呢是i做的,然后我们接着往后边看,然后这里呢也取了一个ecx出来网1b x里边写,那么这个呢是来源于一个机子啊,这个它把它弄得比较复杂,那么这个时候忘的是17a4 里边来写的这个数据。
那么实际上也就是这这一串啊,这一串也就是一个数据的一个对了,80个自己的一个填充,填充的比较复杂,那么我们先呢就给他把与我们ex相关的啊,与对象相关的,我们先把它取出来,那么与对象相关的。
这里有一个4c,这里有个五零,然后再一次取对象之后呢,变成了ec x,e d x d l e f4 这个地方啊,有一个还有一个是ef 2这个地方,还有一个是a2 a4 这个地方,那么这三个地方的话。
他也进行了一个相关数据的一个填充,那么我们看一下ef 4这个地方是什么呃,e f4 ,e f2 以及a4 ,还有一个ac,那,么这里呢是取得一致解,这里相当于也是取得一致解的,因为下面这里呢是一个b。
然后加a4 这个地方的话,那么下面呢它也是第二只写了一字节进去,那么这里呢也是一致结论,那,么再往下边看吧,那么再次取出来这个我们的对象啊,加28这个地方,然后呢把ac这个地方呢也是取了一次解。
写到我们的17c8 这个位置,然后在这里呢再次我们的对象变成了ec x e x,然后取了一个五四,取了一个五八出来,那么这个时候来补四个五四和五八的话,也就是取了八至九。
这个时候相当于从四这个地方来取了八次几,那么后边这个地方我们就用不着注释啊,取出来取出来之后呢,分别写到了我们的17b0 和ac这两个地方也是ac过来是b0 ,这两个地方也是挨着的。
好那么最后这里的话嗯,他把一bx加幺七cc,那么传到了这个框里面,可能这里边还有一些数据的填充,好看的,他这个的话这样写的话显得非常的复杂,那么我们也可以来来调用这个库。
来对这个幺七cc这个地方来进行初始化,那么这这也是一种初始化数据的一个方法,或者是呃我们把这整段代码啊把它复制下来,然后呢以我们的对象作为一个参数来初始化我们的一个缓冲区域。
那么另外一种方法呢就是我们自己把所有的这在缓冲区里面的啊,80 90个自己的这个结构弄清楚,我们自己来填充数据啊,好的,那么我们现在能够分析多少是多少,再来看一下前面的啊,这里e x相关的4c50 啊。
这里呢我们4c和五零的话,这里是八字结,那么我们来看一下里边的相应的这些数据,那么我们先把我们的备注哈,先把它取出来,先复制一下之前的ec x,那么这里还有一个cc 40,也写了一字截进去,c40 。
这里还有一个c484 字节,这里是一个字解,这里是一个c40 ,这里是c44 啊,那么相当于这个地方的话是写了各自接进去,从440这个地方,那么我们还是把它分开一下,340,44。
那么我们看一下最最小的偏移是多少,五四,04c,四四啊,这个偏移应该是最小的,或者我们还有一种简单的做法呢,我们是找一下这个扩,然后调用这个库也可以。
在上面的话可能呢它会把我们的应该是一个相相关的一个库,然后呢来调用的时候呢,它也会自动的初始化这一块数据,但是我们看了一下这个扩的呃,比较复杂,比较大啊,按减号我们再退回来一下。
但是呢我们这个时候把金疮药啊啊放进来,那我们再看一下,看一下这个ex这个对象加四四这个地方啊,开始的它最小的一个偏移,我们背出的话应该是四四,c40 ,是谁,那么我们先把它从四四开始的这一段数据呢。
我们把它复制出来,也是80个字节左右,然后我们进行一下比较,但是后边的这一段呢都是零啊,加四四它最大的我们是ac,我们看它最大的数值的话,ef那么后边还有数据。
P61:072-物品存放CALL 缓冲区结构解密2 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们继续呃,分析这个缓冲区的结构,那么这个结构的话,实际上呢,那么我们继续看上一节课的分析。
那么首先呢我们进入到游戏里边啊,对相应的这个地方来进行下段,那么首先我们,把这个人生啊存放一定的数量,到我们的仓库里面,那么这个时候呢我们d c d b d c x,把相关的数据呢我们抓取出来,前面的。
90个字节左右啊,16进制的,那么这是人生数量三,存放到仓库,再让它跑起来,然后我们再重放一下雪原声啊,也是存放了35个到仓库,d b e4 x,好的,那么我们也把相关的数据来也复制出来,让他跑起来。
那么我们再存放一个金窗,要小到我们的仓库里边11个,好的,那么我们来再来再次来比较分析一下,看它哪些地方是改动了的,数据是关键关键的这个地方,那么我们第一行看过去,那么第一行的话都是相同的啊。
那么呃不相同的呢,它是从第二行开始,那么我们再来看一下第二行,那么为了方便比较的话,我们可以来把这一段数据啊,放到我们的写字板里边,因为写字板里面呢它可以上颜色啊,我们可以把它区分出来。
那么我们把这个页面设置啊,设置大一点边距。
或者是设为横向,这样我们好好比较一些。
那么我们来看一下从第二行开始嗯,179a1724 啊,这里前面这里是六八啊,那么我们这里来找一下颜色相关的,嗯,那么这个地方呢它是不同的,后面都是c99 位啊,3b那么我们再接着看,这里是二三嗯。
然后呢这里是零币,那么这个呢是数量2350地,这里这里呢表示11个,这个23呢这里呢表示的是35个,这里呢是数量三,好那么我们接着再往后后边比较,54a099 ,然后从这个地方开始的话不一样。
那么这上面呢我们从这个地方开始呢,它也不一样,以及下边这一串,ca 6这几个应该是不一样的,c,那么我们从颜色这个标记来看的话,应该就是这一段大概有这里六个字节,加上这里的三个字节。
可能是十个字节左右的这一段数据,当然也可能是这一段也加上,因为它的编号的话,可能呢这是它的低位,那么高未来可能没有变啊,那么一般来说是四字节的这段数据,那我们再看一下d501 后边的。
这个地方它也不一样,473位a b,那么在后边这一段的话基本上都是一样的,那么最明显的就是,这一长串的这个数据不一样,那么我们先找一下这串数据的来源,它来源于什么地方,那么在这里的话。
我们数一下这里的话,ea这里是2a开始的,瑞瑞开始的大概有,12个字节啊,那么这12个字节呢,可能是我们的这个关键的数据,可能是指令动作,或者是我们的好物品分类id,好的。
那么我们对这段数据的来源进行一下啊,分析2a这个地方,那么我们再来这里看一下啊,e d i,那么这里呢他取的是啊,e d i是从a这个地方开始取,那么我们这里是2a的话,要减掉这个a的这个偏移。
就相当于是来源于我们的,在前面啊,这里是edi,数值还行,那么我们的e si的话,也就是相当于是从178c啊,也就是我们的它的来源的话,也就是1b x加上178c,然后呢我们还要加上一段数字嗯。
还要加上一个2a减掉a,那么这才是它相关的偏移的一个,数据的来源,那么我们再次下段啊来分析一下,看是不是这样,以人生为例嗯,这个时候会断在这个地方,那么我们看一下啊,前面我们计算的这个偏移,试一下dp。
那么这里是1d4 b开始的,我们来看一下金疮药啊。
2d1 a6 a4 a9 a3 b,那么这一长串后面的后面的都是零啊,后边的都是零,那么我们把这一串数据好复制一下,让他跑起来,那么我们用c一来搜一下这串数据,还有没有其他地方存在。
这个时候呢我们选人bt数组,那么我们搜索一下,那么这个时候呢我们搜索到的话,只有这一个地方存在啊,也就是我们刚才说的,1b x加上179c啊,那么我们先把这个地方来添加进来嗯,那么说明的话这一串数据来。
它可能是组合的哈,来自多个地方,不是来源于某一个地方,那么这个我们可以来先找一下ebx,它的一个机制,那么再一次我们让他断一下,嗯下一个相关的断点,好让他断一下断一下,我们看一下ebx现在的数值,嗯。
让他跑起来,那么重新搜索,那么在这里呢我们选新搜索四字节,那么这里呢我们会搜索到两个地方嗯,我们把它添加进来看一下,这个地方是绿色的,它可能是机子,那么是机子的话,我们可以在ot里面可以搜索到。
那么注意这里这里这个机子很多啊,那么这里呢有一个备注,那么备注的话,那么也就是说,刚才我们那一段数据的来源的话,也就是说这个ebx,减掉这个位置,这样来的啊,这一段数据12个字节,好我们把它记录一下。
然后把这段数据来复制出来,嗯那么这12个字节的话,也就是我们要找的这个关键数据,那么我们得先找一下它的来源,因为这段数据的话,我们不同的不同的物品呢它是会变化的啊,从二类这个地方开始。
那么比如说血延伸的话,那么这一段数据呢它就会变动啊,那么我们再来测试一下,如果是选原声点确定,那么这个时候的话,我们这一段数据呢它就变动了啊,就变动了,就从这个eb 4,b4 b变成了b7 什么什么的。
那么这段数据既然在变动的话,就有就有另外一个地方来,像有一段代码,像这个地方来写入这个数据,那么所以说我们要找到它的来源的话,我们可以来在,然后呢我们再另外出售这个啊,存放金疮要大,但是我们发现了。
还没有开始开始输入这个数量的时候呢,它就会断下来,那么在这个位置呢,nbx加17s,这个地方呢会写出我们的数据,我们来看一下1c x的数数值,那么ec x的话就是这个啊,634c a a b b。
那么我们看一下金川要到,那么也就是写的这一段就从二代开始的,写的是这这一段哈,数据就是我们的634c aa bb,那么从这里开始,那么我们找一下这个ec x数据的来源,往前边走。
它是来源于1a x加五四,那么这一段数据我们按一下新号,转到我们在1p这个地方,那么在这里面找,大于2e4 x的话,它来源于多少呢,来源于我们的ex加五四,那么这个ex它又是一个什么对象呢。
那么我们可以来看一下,那么在这里呢我们也发现它加c,这个位置呢是下标,这里呢是ea的这个类型,那么我们用dc来核实一下,那么这个时候呢我们能够查到查到哈,回复生命300金仓要大啊,那么也就是说。
它实际上这段数据的来源的话,来源于我们的1a x加上五四啊,这个地方也就是我们的这个来源,那么后边的话那这里就是金创药理啊,大概是前面八个字节啊,那么加再加上八个字节的话,大概就是我们的嗯。
这个金创要大的这个字母了,也就是说前面它只有八个字节的位置呢,它是表示我们可能是物品的id,那么我们再核对一下,那么这里有个09441d19 ,那么这里有一个09441d19 ,那么这是我们经常要到啊。
那么如果是回程符呢,那么可能的话也是也是这个地方,这四个字节,再加上我们后边的这四个字节,那么我们再来看一下,这个时候,先把这个断点哈取消掉,那么这个地方呢是人生啊,人生的话是在第一个。
那么它前面呢也有,这八个字节啊,后面的是人生,那么我们来看一下这里有没有相关的,那么人生的话,这里呢也是我们说的97642底,因为啊那么也就是我们的这八个字节,那么后面的这里还有14个字节啊。
可能是这一个字节,它又来源于什么地方呢,那么我们再看一下,这附近有没有相关的数据,那么我们在这个位置啊,能够发现和相关的这个数据,684a9 a3 b啊,那么这里呢,那么这也是一个好像。
也是一个数据的一个来源,那么我们再次来看一下,那么这里呢这段数据在后边,也有这一段数据啊,那么这个数据呢它出现了两个地方,那么也就是说这串数据呢可能是i d,那么这个可能是物品的类型啊。
这一类的反正也都是相关的一些数据,实际上呢从我们的这个分析的话,它都是来源于我们物品的一个对象,那么我们再做一个测试,嗯今天要回城符吧,啊这个金窗啊,我们是人声啊小,然后我们来看一下它的一个这个缓冲区。
那么缓冲区的话也就是我们说的啊,从二类这个地方,那么这段八字节的话,它实际上呢是来源于我们的,加上这个地方加上5c,嗯应该是看一下之前的,我们退回来,按减号,应该是加上五四这个地方啊。
那么这里呢有八个字节,1d cb加上我,我们再来看一下9764,271a,再来看一下e4 x那么ecx的这一段数据,这八个字节,恰好也就是来源于我们五四的啊,这里呢有八八个字节。
那么这里八个字节反正是关键的一个数据,数据的一个来源,那么另外呢还有一个,也就是我们从幺二这个地方开始的,还有这里从三二这里开始的一个四字节,那么这四字节的一个数据呢,9a3 b哈,68c a。
9a3 b,这个呢,它来源于我们的,加上好像是四八这个位置,db啊,18还要加上四字节,应该是4c这个位置,那么这里呢它也有四字节的一个数据啊,一个数据,然后用来填充我们,这个缓冲区的幺二开始的四肢。
那么另外呢还有一个呢,我们这里是它的一个数量数量下来,这里好像这个位置,那么我们再一次来确定,我们就知道了,嗯比如说我们的这个物品,它是幺幺,所在的下边幺幺是b,那114b的话应该是在在这里哈。
是四这个位置,4343,这里一字节呢,那么我们把它备注一下,13这里一次警,那么数量呢是在ea这个地方啊,记得看,大概这里是两字写的样子,啊,那么幺二这个地方,幺二,那么这里呢幺二的这四字节只有四字节。
来源于我们物品对象的4c啊,这个地方保存一下,然后再是我们的数过来,这里是三二类,这个地方有八字节啊,到这里八字节的来源于我们的五四,这个地方我们再退回来,源于五四,这里不是12自己是八自己。
加五次一共是八字形,那么五四过了之后呢,我们这里有一个三二,幺二和三二呢都是来源于同一个地方,加32号,加幺二的四次解,都是来源于物品对象的4c,那我们再次来看一下,就差一个图四啊,三。
那么我们可以看到这个哈ef 4这里啊,它实际上呢就是表示了它一个下标啊,从这里写入的呃,1b x加上1v94 ,1v9 c啊,这个属性,ef 4这个地方呢,一个属性的对象,那么所以说我们也可以说。
那这个一字节呢,加上1f4 这个地方,但是呢它就只有一次机,那么这一次节呢表示的嗯,应该就是我们汇报的一个下标,好的,那么我们再整理一下,那么大致的话3a这个地方啊,物品上涨数量上限两次减。
那么我们再来核对一下啊,这个我们合作也清楚的,我们写一个ok,那么这个地方呢我们也是啊强化好,这里也是我们三二,这个地方只有四次酒,那么3a这个地方是不是物品上限,我们再来看一下,那么物品的数量的属性。
我们先要确定在哪里,那么我们看一下七八啊,第一个是100,那么我们再来看一下它的物品数量,之前我们分析的物品数量是444,这个位置641 百啊,那么我们看一下这里有没有cs 4相关的。
那么这里有一个34啊,物品数量,那么物品的数量呢它也是写到了这个地方,那么也就是,相当于是从他所拥有的一个数量,那么我们再来看一下,比如说这个精通要小,我们存放三个到仓库里边,那么我们来看一下缓冲区啊。
d b e4 x,那么我们来看一下啊,这里是三,那么另外呢它物品上限是六四,我们在这里看到的物品数量上限,3a这个位置我们看一下啊,这里呢有一个六四,就是物品的数量的上限啊。
那么这里呢应该是可能是两个字节啊,后面这个零命这里,那么现在我们分析的可能是一个事情,当然都可以用化在后面是零零的,因为这个物品的数量的话,它可以比较大还是好,那么我们再来看一下呃。
用这个金疮药到它一共是360个,我们断下来再看一下,那么这个时候呢它这里的数量呢是六八,我们计算一下16进制的六八等于多少,那么这个时候呢等于104,但是我们看到后面这里还有一个幺啊。
还有一个还有一个腰,那么如果是用一个字节来表示的话,就不对啊,那么这里我们加上高位的这个数字,1680168相当于是16进制的,注意168,那么我们转换成十进制的,刚好就是360。
那么说明这个数量的上限的话,至少应该是两个字节好的,那么这节课的话,我们基本上啊,可能是应该是分析的差不多了。
数量两次减,那么这个物品数量的上限呢,来自于我们物品注意象,加上我们的1f4 这个地方,那么我们再来看一下对一下,那么它所在的下标我们再来看一下是多少,那么他这个所在的下标的话。
大概是6424242526 27,大概是27,这个地方27的话应该是1b,b41111 加162 17,那么我们来看一下呃,首先来看一下,它的名字c,金装要到加上1f4 。
dw来看一下ef 4还是ef 8,ef 4,二七,那么这是ef 4呢,是它的这个下标,那么数量的话好像是c44 ,这是下标,c4416 ,这是357,刚才是360乘了三个这个数量在里面。
那么至少呢它是两字起的,那么也可能是嗯,它同样的可以表示这个数量啊,那么我们暂时把它写成两字结论,那么后边如果是分析有其他的这个改动呢,我们可以再变,加上我们的零,c40 这个点,好的。
那么这节课呢我们的分析呢就到这里,那么应该说的话基本上可能已经完成了,其他的还有一些数据了,那么我们直接来可以呢,从我们的,可以直接用我们前面的啊,这里面的这个数据,因为这一部分数据的话。
除了我们改动的这些数据呢,我们基本上都已经分析出来了,就是这些偏移,那么其他的呢数据呢都是啊,这个不经常改动的,那么我们直接用这个缓冲区,初始化的这一串数据应该就可以了,那么我们下一节课呢。
再对它进行相应的测试。
P62:073-物品存放CALL测试 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么前面一个呢,我们对这个物品存放货的这个缓冲区参数来做了一些分析,那么这节课呢我们对这个物品存放的啊,存放物品的过来进行一个测试啊,那么首先我们打开前边第70课的代码。
这这这这这,那么我们切换到我们的主线程单元,那么当时呢我们之前在第70课的时候也进行了一个测试啊,出售一个相应的物品,那么这节课呢主要我们是嗯对这个所谓的结构来进行修改啊,方便我们出存放其他的这个物品。
那么我们打开我们的游戏,比如说我们要存放这个人声,那么它的参参数我们该怎么传,那么如果是呃存放的是这个金窗要小,那么我们这个参数又该怎么修改啊,那么我们已经分析了一些偏移出来。
那么首先呢我们要取得的是呃一二这个地方物品对象,腰围这个地方的四字节要取出来进行替换,另外呢我们ea这个地方的啊两个字节呢是物品的数量啊,那么我们要把它写进去。
那么还有另类这个地方把自己来源于背包里面的呃,八个自己,我们也也要给他替换进去,那么先让我们手工的哈进行测试,那么测试成功了之后呢,我们下一节课呢再具体来对它进行啊函数的一个封装。
那么首先为了方便提取我们的物品呢,我们先用o d附加到我们的游戏里边,那么我们先提取我们相应的参数和手动的提取。
那么首先我们要提取的提取的是这个物品对象,一个是加四色这里的四字解,那么一个是加我是这个地方的八字形,那么我们来看一下啊,呃除了五四这个地方,这里三二哈,这里呢也是啊,主要是提取的是544c啊。
这两个地方还有一个是物品数量的上限啊,3a这个地方,那么这里我们提取的是c a44 啊,物品数量两个字节,那么还有一个呢是我们背包的下标,在ef 4这个地方,当然我们也可以直接观察这个背包的下标。
也也可以观察出来,那么在这里呢是它的一个下标啊,一个字节,那么我们先把这相关的几个偏移取出来取出来,那么我们首先从第一个呃精创要小做一个测试。
金创要小的话,它的下标呢肯定就是零,那么我们看一下,首先我们取四岁这个地方的四字减。
那么我们把这四个字节取出来。
那么注意如果我们是字节类型的话,就应该是6c9 a3 b啊,是这样,那么如果我们是低位的类型呢,的16进制呢就是这样的显示。
那么接着说我们五四,五四的这八个字体啊。
那么我们直接用低位的的类型呢来提取。
对。
好的,那么这里的八字形我们也提取出来。
还有cs 4,这里两个字节,就是当前物品的一个数量。
注意这里是dw微星的,赢钱最好,那么这里是97个哈,我们也就是061,00661,然后是ef 4这种,那么e f4 ,这里的话肯定是一字写的话是零,它的下标是零,因为好,那么这里呢我们是零。
这是我们的精创,要小的所有数据,那么我们看第二个的。
话是人生啊,那么我们看一下人生的数据,那么第一个它的下标呢肯定有变化,那么我们把这个复制一下,那么首先呢这里呢我们是它的下标是零一,然后我们再看一下c44 这个地方,这里的它是16进制的58008。
然后我们在上边五四这个地方,所以这里呢我们也用dt来显示,也是显示四个字节,那么五四这个地方的数据复制出来。
那么后面这个哈2d6497 ,1a2 d6497 ,它这两个是相连的啊,这个呢是相同的,那么我们再次啊不必更新。
那么还有一个是四岁这个地方,我们看一下。
把它的数据复制出来,那么从最后这呃第一位的这个六八呢,我们要把它改一下,以前的六改成了六八哈,这是他们的人生的和精创要小的这两个i d的一个差值,好的。
那么接下来呢我们就可以对我们上边的这个结构来进行修改,那么我们首先呢如果我们要存放金窗要小,要存放多少的数量,那么当然数量还有一个偏移啊,数量这个位置的话,我们要在什么地方改了。
我们要参照我们分析的资料来改这个代码,那么我们在这前边来改我们的参数,那么首先呢我们数量数量的话,我们看在什么地方改物品数量,这里呢是ea这个地方,那么我们在椰子这个地方呢,给他送两个字节的数量进去出。
那么首先呢我们把这个nb代替的这个机子呢先取出来,把这一句提前,那么取出来之后呢,然后我们可以相对ec x的这个机制来对它进行协助,move world,挺难的,那么这个修饰符来可以不要。
如果是局部变量的话,就是在堆栈里面可以用s来修饰,如果是全局变量的,你一般可以用js它在数据段来修饰呃,当然了也可以取消掉这个这个前缀的一个说明啊,然后呢我们这里呢是e4 x加上我们的0x12 。
这个地方j a哈,这个地方沉默的是数量,那么比如说我们要存放两个啊,这个数量进去,那么除了数量之后呢,我们是一个数量的一个上限,当前数量,那么当前数量这个偏移的话在什么地方呢,当前数量在3a这个地方。
那么我们对3a这个地方进行修改,等一会儿,啊这一句的复制一下,这里的d word啊,数量的话数量上限也是两个字节,用word来修饰它,那么现在它的数量上限的话,我们看一下轻松要小的话是0061啊。
直接传你x61 进去就可以了,然后除了这个数量之外,我们再看一下幺二这个地方来源于4c有四肢解,那么我们在前边复制一下这段,这里加上d word,这里是幺二,它的四字节的话来源于我们青创要小。
加上0x的前缀啊,幺二的这四个字节呢,我们就给它写进去了,那么这个呢可能是一个可能也是不平ip相关的嘛,我们就给他取一个物品id相关机,那么还有一个地方我们看一下,还有一个地方呢就是从五湖四这里开始。
那么从五四这个地方开始呢,我们有八个字节,那么我们呃向里边进行协助啊,这一段呢复制一下,那么这里呢我们添加五四,那么五四这里精通要小的话,首先这里开始,那么50+4个字节的话就是八啊。
那么因为我们一次信息写的是四字节,所以说需要需要写两次啊,也就是五四再加上四,实际上就是五八,那么五花的话就是后边这一段数据,好那么关于还有一个是我们的cs是这是取出的物品,1a乘放数量。
八字解二零这个地方,还有二代这个地方呢也来源于我们的这个物品对象啊,也需要写一下啊,这个地方我记一下,这个偏移呢我们改为分类,然后我们再核对一下3a这个地方啊,物品上限3a这个地方我们还没开始写。
二类商业物品上线两次节,好这里是3a,我们需要修改一下啊,这是当前数量,这里是3a,那么三位还有一个是四三,在背包里面的下标,那么把前面这一句啊复制一下,那么现在呢我们它的下边呢是零啊,是第一个数值。
那么在这里呢四三这前面的修饰符我们要改改为b,那么呢他每次来才是写入了一个字节啊,才是写入一字节,写到四三这个位置,好的,那么我们这样修改之后呢,我们测试一下,重新编译。
那么看一下能不能够把我们的精创要小存放两个啊,存放到我们的这个仓库里边,啊,嗯先挂接到主线程,然后呢我们测试一下,让我看一下现在的数量97个,那么这个时候呢我们看一下啊,没有存放进去,显示的是五品啊。
无法转移物品,嗯那么我们再来看一下我们分析的这些呃,是不是已经写进去了,嗯首先是幺二这个地方1a这个地方写写的是存放物品物品两个,然后这是二类的八字几,2a的八字形,对了,我们这里是写的五四的八字解啊。
写错了,那么我们这里呢应该写成2a的八字解,那各类的八字节来源于物品对象的五四啊,这里应该是,对a加四,这样才对,日月的八字节,还有一个我们看一下,继续看,一个是2a5 ,看1a,434哦。
还有一个是三二,这个地方应该是三个人啊,当时我们填错了,一个是幺二或三个人,都是来源于物品对象的4c这个位置,那么二类的八字写的是单独的,那么这里呢应该是二类,后面呢应该是加四。
那么这样写的话才是正确的,再重新编辑一下,那么在挂接到主线程,然后切换到游戏里边啊,再测试一下,那么这个时候我们可以看到金创药呢每按一下这个测试呢,它会存放两个啊,到我们的仓库里面。
那么说明的话我们的测试的话是正确的,那么如果要存放人声呢,那么我们就要去修改相应的一个数字,那么而且我们发现存放第一次,第二次的时候呢,它都能够存放进去,那么也就是说我们这个物品数量。
当前物品数数量的话,它不是很关键啊,也就是说它只要比我们存放的这个数字来大,可能就可以来向里面存放这个数据,那么关键的应该是这前面的这几个啊,那么这个数量的话看来他不是很关键啊,数量的当前数量。
如果是当前数量,它是一个关键数据图啊,那么我们按第二次的时候,他当前的数量呢就已经改变了啊,那么应该是不能够存放到我们的仓库里面,好的,也就是说这个数字的话可以是不关紧要的啊,但是这个是非常关键。
那么我们再来看一下,是在这个地方人生,那么我们要存放的是就应该是六八这个问题,那么再复制一下,那么呃aa这个地方呢我们看一下五四这个地方,也就是那么武士呢它只有前面的四个字节呢不相同。
后边的这里都是相同的,那么所以说我们在这里写的时候呢,只需要修改在前面这一部分就可以,那么这样的话,理论上呢我们就能够把我们的人生啊存放到我们的仓库里面去,好的我们再次测试一下,挂接到主线程。
然后看一下人生88个测试嗯,这个时候呢显示无法转移物品,那么刚才的话我们金创药能够可以,那么是不是我们少写了一个它的下标,我们忘了写,忘了修改,那么人生它所在的下标位置来应当是一啊。
所以说这个时候呢我们应当修改为一,再重新编译一下,没有注入成功,那么我们看一下是不是动态链接库已经没有卸载掉,啊再次输入,那么这次呢我们打开游戏过街道主线成88个测试,86个,24个。
那么说明这个下标的话肯定是一个关键的一个数据,那么如果我们要存放的是这个血原声呢,那么它的下标呢是11,那么我们取一下它另外的数字,再做一下相应的测试,那么首先呢它的下边呢是11,我们进行一下修改。
11的话就是b尼克斯bb,嗯然后呢这前面的应该说这个参数呢不是很关键啊,嗯都可以不修改,那么这里呢我们存放的是数量,比如说一次存放三个,那么我们来看一下,你必不,它是设的参数是多少。
那么首先呢四射这个地方我们要对它进行相应的修改。
那么除了实施这个地方呢,然后是五四。
五四这里的八字节,进行修改,好的,理论上这样修本来就可以了嗯那么这个是i d相关的啊,这几个应该都是与我们物品这个身份相关的啊,也就是他的id相关的一些数据,那么我们再进行相应的测试,嗯就是。
好的我们再次来打开游戏挂,接到主线程,然后我们看一下雪原生的数量,469,那么这个时候呢我们也可以看到提示信息存放了三颗水原声,这里的数量呢每测试一次呢,它就会减少啊,就会减少,好的。
那么下一节课呢我们再把它再把这个数据来封装成函数啊,到时候呢我们可以来直接啊要存放的,直接传一个要存放物品的名字进来,那么如果存在的话,我们就存放到仓库里边,然后呢再有一个参数呢。
应该是一个物品的数量啊,那么这个也也当做是一个坐列啊,你给大家进行实现一下,那么这个作业呢我们就要求了写一个函数,save dep,sp groups成泡物品到仓库,然后呢,我们是,物品的名字。
然后呢我们另外一个参数,是我们物品的数量,啊要存放物品的数量,那么这个参数这个函数我们写好了啊,如果是存放成功的话啊,执行完的话,我们返回一个增值,如果这个指定的这个名字呢在背包里面不存在的话。
那么我们返回一个假啊,假肢啊,也就是发灵活一啊,我们的这个数字好的,那么这个就当成是一个作业啊,大家去完成一下,那么这个呢也将是我们第74课的内容,当然这个扩的话它也有一个前提啊,然后有个什么前提呢。
那么也就是要先要打开我们的这个仓库啊,如果没有打,要打开npc啊,再打开仓库,那么在这种情况下呢才能够调用这个库啊,那么也好的,那么这节课呢我们就讨论到这里。
P63:074-物品存放CALL缓冲区结构化 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们对上一节课的代码进行一些优化,那么在为我们的这个存放物品的扩呢,嗯定义一些结构啊,并且对我们的背包对象呢添加一些呃这个属性,那么我们先打开第73课的代码。
那么我们先移移动到我们的结构单元,然后移动到背包对象这里,那么我们的背包对象呢,现现在新增加了几个属性嗯,也就是我们的4c偏移,这里有一个呃,我们可以把它取名为i d e。
那么还有2a这个地方呢有一个八字节的呢,我们可以给它取名为i d2 啊,这两个都是与我们存放这个数啊,物品相关的一些属性,嗯,那么这个是四字节的。
我们可以用这个int或者是d word这一类的类型来表示,那么还有一个呢是加五四这个地方,那么这个地方呢是八字节,八字节呢我们可以用d word的数组来表示,那么也可以有一个coword。
这个呢它可以用来表示我们的八字己,那么我们再来看一下,那么除了这两个之外啊,还有一个属性和物品对象c44 啊,这个地方的偏移给它改一下c44 ,那么这个属性已经有了哈,物品数量的另外一个呢是背包的下标。
那么它来源于呢来源于ef 4,这个地方是一字节的,那么这个呢我们可以是char或者bt啊,只要是一次性的就可以嗯,那么大致呢就是这几个属性,ef 4 c44544 c啊,那么这几个属性。
那么添加好了之后呢,我们再背包的初始化函数,这里呢还需要添加相关的代码,那么我们把前面这句代码来复制一下,那么首先呢ide这里这里呢我们需要读出数据啊,是d word类型的,我们需要读出四字解就可以。
那么在这里呢我们也需要给它定义一个相应的红,用来表示id的这个偏移,那么这个呢我们是id,下面这个我们给它表示为id 2,那么他们的偏移也不一样,这里是4c,这里是五四,好,那么后边呢我们还需要有一个。
下表豆先移加e f4 ,这里这里呢是一致结论,那么这里呢是八字节的,那么这里定义完了之后呢,接下来呢我们对它进行初始化,i d一的,那么下面一个呢是i d2 ,idea呢这里我们要注意它是八字节啊。
这里我们需要用cover啊来表示啊,一次性的读出八字形,那么读到是i d2 这个地方n q,那么还有一个也就是我们的下标,那么这个呢我们读取一致解,哈哈哈哈哈,好那么现有的这三个属性呢。
我们都给它进行了相关的这个数据的读取下标,那我们再来看一下啊,还有一个是物品的数量啊,那么这个数量呢在之前这个位置呢我们已经有读取了,那么大大致的话就是123,就是这四个属性,那么这个数据的话。
我们可以通过我们的这个代码呢把它初始化进行读取,那么接下来呢我们要定义一个结构啊,来就是存放我们的相关的这个数据的一个初始化,让我们这段代码呢更具有一个可读性啊,这这种代代码我们都是直接用汇编来写的。
这样的,话我们如果是另外的人看到的话,嗯这段代代码的话,可能他就不知道是什么意义,那么最好来我们用结构指针来进行这个相应相应的复制,那么这样呢这样的话显得更加的专业一些,那么我们可以在。
这个结构单元同文件的最后来添加我们的相关结构,那么首先呢我们把相关的这个结构呢啊啊啊不是进的这一段,那么我来解释一下它的一个大致的一个意义,那么首先呢这里呢我们要用一字节来对齐。
不然的话啊在前面的话可能这个偏移就会错位,那么首先呢我们第一个啊这个i d e啊,这里表示的是i d e,那么这个i d e的话它是四字解啊,四字解,但是它的偏移呢是从幺六这个地方开始的。
我们再移到前面来看一下啊,是从幺二这个地方开始的啊,那么所以说在前面呢我们定义了三个字景啊,那么加加上他自己一起来,那么在前面这一段数据所占的这个字写出来是幺六啊,16进制,的幺六个字节。
那么再加上这四字节呢,就是我们的1a啊,那么所以说这个数量呢它的偏移呢是从ea这个地方开始的,那么如果我们用指针指向这里的之后呢,那么我们就可以对ei这个偏移了,对缓冲区数据ea这个地方呢进行操作。
那么后边的也是一样啊,我们定义的这种nb多少多少开始的都是现在还还不知道它意义的呃,一些数据,那么对于我们有意义的,比如说这几个哈,一个是我们背包的下标,那么还有一个是当前物品的数量啊。
这个来源于物品对象c44 ,那么这个idea是coword,也就是来源于我们物品对象的啊,c这个二是这个地方,就是这上面注释的啊,还有我们物品就像五四,这里是八个字节,那么我们这样定义之后呢。
呃我们主线成单元的这段代码的话,我们就可以进行一些优化了,那么在这里呢我们就可以用指针来指向这个缓冲区,对它进行一些操作,哈哈,那么在后边这里呢我们需要进行一下运行的转换,好,那么我们再编辑一下。
那么编译之后呢,我们在接下来哈我们存放仓库数据这里,那么我们就可以把前面这一段啊数据相关的就可以了,把它,剪切掉啊,然后呢我们可以移到前面来进行一个赋值,用我们的结构来进行复制。
让它的可读性能变得更高一些,那么最后呢在这里呢从缓冲区的时候呢,我们直接就传入这个指针就行,好那么在前面的这个赋值呢,我们也可以直接用我们的c语言来进行赋值,那么首先第一个这个地方的一个负值。
就是我们的i d e这个地方,n d i d e啊,因为i d e呢它需要有两个地方进行复制,所以说把它分为了n d e a和b,好那么接下来呢就是我们ra这个地方的一个复制。
它来源于我们的数据呢是5c54 这个地方啊,那么我们在这里呢也可以对它进行一个简单的复制,嗯看来第二,那么这里的赋值呢,我们现在没有从我们的这个背包对象结构里面呢呃读取。
那么我们可以来直接先在这里进行一下组合,那么它的首先呢我们取它的高,高四八字节啊,高四字节,然后呢再取它的低低位的四字节,啊保持一下,这样呢我们就组成了一个八字节的coward的类型啊。
然后呢给它复制好,那么前面这段的复制完成了,然后呢数量1a这个地方,那么这个是我们要要就是说要存放到仓库里面的一个数量,那么这个就是我们要存放的数量,我们写为三,那么还有一个呢是我们当前的数量。
那么这个是我们当前的数量,那么当前的数量我们可以进入到游戏里面去看一下469,那么这里呢直接就是16 九,那么我们就可以不用不用进行这个16进制的一个转换,那么最后一个呢是它的下标啊。
嗯那么下边呢这里呢等于11,也就是我们的第12个这个位置好的,那么我们这样的一个写法的话,他明显的要比我们前面的这这段代码呢具有一个更高的一个可读性,但是实际上它的作用啊实际上是一样的,作用是一样的。
但是具体用哪一种方法好了,这个在于你自己的一个选择,那么我们来测试一下啊,是否可以用这段代码。
好挂接到主线程,然后呢我们进行测试,现在它的数量是469啊,存放了三个,每按一次测试按钮呢,我们可以存放上三个这个水平上来到我们的这个仓库里边,那么如果我们换成金疮要大的话,也可以。
应该也是可以进行测试的,那么我们也可以用og呢附加到游戏里面,我们进行一下相关的测试。
那么首先呢我们以这个清创药,这里的话应该是64242526 27啊,二期的话应该是,eb啊,这个地方,啊清创要到这个地方是,那么我们来看一下取他的五四的这两个字节先取出来,是在这个地方先取四字节出来。
嗯,那么这个是四色的四肢解,好四色的四字节呢,然后过来是我们的五四这个地方的八字节,那么我们先取的应该是高位,然后呢再取低位的,这四次解。
那么接下来呢我们再来看一下啊,其他的属性呃,其他的属性的话,另外一个是它的下标,下标来这里我们是1b啊。
那么这里呢我们变成16进制的1b,也就是二期啊,还有它的当前数量,我们看一下,当前数量呢是幺六,那么可能这个是四级啊,这个这里肯定是四级916,那么这里是要存放的数量啊。
比如说我们一次啊存放啊11个这个数量进去好的,那么关键是这两个i d或这个下标,这两个要对啊,就能够存放这个数据信息进去,那么我们重新编译一下。
挂接到主线层,然后我们进行相关的操作测试,那么我们每按一次来,这个时候呢就会呃把这个金窗要大哈,每次来乘放11个存放到我们的这个仓库里面,可以看到我们金创药数量在不断的减少,280269啊,258好的。
那么这节课的测试呢我们就到这里嗯,那么下一节课呢我们再对它进行一个更进一步的这个完善啊,把这个库来单独的封装成我们之前所这个所留作业的这个形式吧,那么这节课呢如果这个作业没有完成的哈。
继续完成这个作业啊,那么下一节课呢我们在,风中一个完整的函数。
P64:075-封装函数SaveGoodsToDepot - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们来完成前面的坐力啊。
一起来完成这个函数哈,so good to deo,那么呢我们这前面第一个参数呢是我们背包里面物品的名字,那么这里第二个参数呢是我们要存放到仓库的物品数量。
那么我们先打开第74课的代码。
展开我们的结构单元,那么我们先嗯一到背包的这个单元,那么在这里呢我们呃添加一个成员函数,就是我们的这个座力的这个函数,把它添加到这个地方,那么添加之后呢,然后我们再开始添加它的代码。
先给它加上这个前缀啊,这里可以不加,但是我们这里加上之后呢,方便我们复制,然后转到user故事分类后边,啊前边也可以,那么我们要存放物品到仓库呢,我们需要先取得它的相关的一些属性啊,采用的一些属性呃。
比如说我们之前所分析的这个id 1 id 2,还有我们的物品数量,它的下标这几个属性,那么我们需要所以说呢我们得想办法先得到这几个属性,那么呢我们可以通过它的名字呢来进行这个相关的查询。
而且我们之前已经有写的一些函数哈,那么我们可以来呃有一个get估值index for a啊,我们可以通过这个函数呢来获得它它的下标,或者是我们重新的写一个类似的函数来获取对象的一个对象。
的相关信息也是可以的啊,但是我们现在呢可以直接利用这个函数,来获得这个物品的下标就可以了,然后呢再来调用,这里我们有一个哈背包列表,然后再把再通过这个背包的这个数组呢,我们就可以得到相关的信息了。
好那么我们在这里呢先调用一下这个函数,那么我们把之前哈传进来的这个啊被包物品当同事了啊,传进来,那么我们首先看一下它能不能够正确地获取我们相应物品,在背包里面的这个下标啊,如果失败的话,它会返回-1。
那么如果这个数值为-1的话,那么这里呢我们就返回flash啊,就调用失败,或者也可以打印出一段调试信息啊,对,那么如果调用成功的话,返回的数字呢就是从零开始的一个下标,那么我们得到这个下标之后呢。
我们就可以了,调用我们啊相关的一些数据啊,调用我们成员里面啊,相应我们对象的啊相关数据就可以获取,那么获取之后呢我们就可以了嗯调用我们主线程的啊这个call,那么我们再把主线程的这一段代码进行一下复制。
把它复制到我们的,这里啊不知道这个函数里面,再转到主线程哈,那么这一段哈调用我们存放仓库的这个代码呢,也把它复制一下,那,我直接复制到这里行,那么如果是执行到这最后的话,那么我们就返回啊。
出当然这里来涉及到我们相关的扩的一个调用啊,那么我们呢在这里呢也加上一个try异常的一个处理,就是一,哈哈那么如果出现异常的话,首先呢我们打印出相应的调试信息,说明是什么地方出了错,然后出错的话。
这里呢我们也返回f,好先保存一下,那么我们看一下哈,其他的,那么这个位置的话,我们前面已经取得了它相关的背包的一个下标,那么这个数值呢de一呢我们就可以去他呃,相应背包对象的这个id的这个属性。
因为在前面的话,这里呢在这个good啊,get估值index flow呢实际上已经调用了一次这个get到题,那么我们在这个地方的话,实际上可以直接的呃用这个成员成员数组。
那么我们需要它里面的这个属性n d i d e哈,那么这样写的话可读性就要高一些,这就是我们的家是在这个地方的i d,那么第二个呢也就是我们这个位置,那么这个位置呢我们也可以直接取它这个数组里面的。
属性啊,就是我们的人口i第二这是加五四,这个地方,那么这要保存的这个数量呢,就是从我们这里啊传进来的这个参数,那么它的当前数量呢同样的是在这个背包里面的属性来取,物品数量啊,那么当时这个名字还取得。
这应该是命名呢,出错了,应该是拉姆多,那你rm了,那么最后这里呢是它的一个下标,牛批啊,这是我们的下标,好那么我们编译一下,那么另外还有使用到这个这个成员函数的地方呢,可能呢会编译会出错啊。
那么我们进行相应的修改就可以了,那么我们来看一下有哪些地方出错了,那么这里呢它会有一个提示信息,那么我们进行了相应的一个修改就可以了,你别浪,啊那么我们再重新编译一下,好那么编译成功之后呢。
我们接下来呢呃进行测试,那么再次回到我们的主线程单元嗯,那么相关的代码呢我们可以把它注释掉,这个地方这些用不着的代码呢,我们就可以把它先注释掉,那么在这里呢我们就可以直接调用我们刚才刚才的这个代码。
来进行一下测试,当然最终呢我们最好呢是在这个主线程单元呢,另外跟它封装一个啊m s级的呃,这个挂接到主线程的嗯这样一个函数啊,当然现在我们用这个m s9 开始体积了来进行测试啊,暂时可以不封装这个函数。
好的,那么在,这里呢我们直接就调用了我们的函数来,那么我们来看一下全局变量单元有没有这个背包的这个相关变量g啊,应该是g,bike bike,bike park list,这个,好的,那么我们调用一下。
先get dirty啊,然后呢我们再save so good to depp,然后呢是物品的名字啊,比如说我们就用这个人声为例,然后呢是它的数量,比如说我们存放数量三好,那么我们先进行一下测试。
特斯p3 ,这个是,那我们应该放在test t一这个单元,当然这里呢我们可以把它改成数量数量六啊,这后面呢我们改为数量三,那么这里呢我们也可以进行相关的测试,那么这里呢我们改为数量幺幺,那么编译一下。
然后呢我们打开我们的游戏进行测试。
首先挂接到我们的主线程,然后我们点一下测试,这个时候呢可以看到六个人是呢我们存到了仓库里面,然后这里呢检测12了,11个人生呢放到了我们的仓库里面,那么测试三测试三这里没有反应啊。
嗯我们看一下测试三这里我们有没有添加相关的代码,因为我们测试三这里的代码呢移动到我们测试二这个地方来了,所以说我们也如果需要了,那么在这里呢我们可以添加其他的代码,那么我们再次进行编译,再次测试。
好那么我们再次输入到游戏里边打开游戏,然后呢我们首先挂接到主线层,那么我们看一下现在的48个啊,测试一,六个啊,这里是11个啊,那么这里呢是三个人生,那么我们所有的测试都是成功的,好的。
那么这节课呢我们就就讲到这里,那么下去呢有一个坐垫哈,大家把这个save ods to depted,把它呃就是传递一个参数啊,把它封装成我们的m在这里呢我们封装一下啊。
这个相应的函数及其代码就可以解决,save故事不得碰,那么把它的参数列表传进,那么这样呢提供一个接口,我们方便呢在我们的这个啊方便在主线程之外呢来调用这个函数,好的,那么这节课呢我们就讲到这里。
P65:076-分析取仓库物品功能 - 教到你会 - BV1DS4y1n7qF
大家好。
我是欲金香老師,這節課我們分析一下,從倉庫裏面取出物品的功能,順便我們把第75課的代碼做一下,修改,是不是,我們當時沒有為存放物品的,它的相關的機制沒有進行定義,那麼這節課我們給它加上。
那麼首先我們移到機制單元,那麼這個應該是一個發包的一個,像服務器發包的,然後我們轉到我們,結構單元對它對我們上一節課所寫的,這個函數,替換掉它的一個相關的機制,然後再重新編譯一下,好的,保存一下代碼。
那麼這節課我們接著分析,從倉庫裏面取出物品的功能,那麼一個是前面我們分析的是一個,存放物品的功能,那麼這節課我們分析一個取出物品的功能,那麼首先用我們的OD附加到遊戲。
然後我們先取出這個物品,輸入一定的數量,然後在按確認之前,我們在這裏給它下一個斷點,當然馬上就斷下來的是心跳包,我們不管它,那麼這個時候點了確認之後才斷下來的,才是我們要找的數據,然後取消斷點。
執行到返回,那麼這裏是我們發包,那麼它的參數的來源的話是上一個,課,那麼我們再執行到一個返回,那麼這個時候我們發現它也回到了同一個,地方也是存倉庫,存放物品,看來它存物品與取物品的可能是同一個,課。
那麼我們先讓它跑起來,那麼我們先把它取名為存取倉庫的物品,那麼我們來分析一下,那麼在取物品的時候,它的緩衝區的一些變化,那麼我們再次取物品出來試一下,去拾一個,這個時候我們DB-ECX。
但是這個時候ECX由於機制已經產生了變化,我們只能用ESP+4來查看它的一個對戰,應該是ESP,或者是EBP-2818,也是它的地址,也就是站裏面地址,18A488,那麼實際上。
那麼我們來看一下它裏面的數據,一直到90的,那麼我們看一下,這個時候我們是取物品,那麼取物品的話,它的數據感覺要少上很多,要簡單一些,那麼我們來看一下,它的一個對戰,那麼這是取物品,那麼我們再來看一下。
我們存放物品的時候,也是存放11個,那麼存放物品的時候,我們來看一下,它對戰的一個變化,好,輻射到我們的剪貼板,讓它跑起來,那麼我們從這裏面的話,我們可以看一下,這前面是取物品,那麼這裏是存物品。
都是人參,11個,那麼從這段數據的話,與我們上一節課的存物品的話,好像還有一些變化,那麼我們可以對比一下,存放物品,68,那麼這個地方是一樣的,只有,這裏的有4個字節,它不一樣了。
存物品是2B0C1724,而取物品是2B2C6B4S,那麼後邊的我們可以看一下,基本上是相同的,這個地方也不一樣,還有這裏的,這4個字節是一樣的,然後這一段它也不一樣,那麼從這個來看的話,我們可能的話。
那麼這個是物品的真正的ID,那麼這一串的話,有可能是一個存取的指令,之前我們跟他取的名字叫ID2,那麼現在的話,我們就要找到這段數據的一個來源,還有也就是前面的2B0C,我們看一下。
是不是在取物品的時候,它是不是不變的,存取物品的時候,那麼我們再換一個,我們存放金創藥,11個,再把它的數據複製出來,那麼這個時候存放的是金創藥,那麼我們可以看到存放的時候,這裏都是2B0C1724。
那麼我們再來看一下取物品的時候,是不是都是前面這一個,那麼如果是的話,那麼這一段可能就是我們的存,就是說相關的一個指令,一個是存的指令,一個是取的指令,那麼有可能,那麼我們再存一下人身,存放人身。
已經再取一下金創藥,從倉庫裏面取出來,取4個,用鼠標點確定,然後我們複製出它的緩衝區數據,讓它跑起來,那麼這裏是取物品,那麼我們可以看到取物品的話,這4個字節它是不變的,那麼這裏應該是它的ID相關的。
那麼我們如果都是金創藥的話,那麼這個地方它也不變,那麼這個的話2B0C1724,它應該是一個存取的指令,我們可以把它叫做,好的,那麼我們把這個地方把它記一下,那麼這個地方的話,我們可以把相應的結構。
可以對它進行一些改動,那麼在這裏應該是,EDEF,那麼這裏應該是,EE這個地方,加上0E這個地方,有4字節,是存取指令,那麼存取指令的話,我們用16進制來表示的話,就應該是從高位的24開始。
24170C2B,那麼這是我們存放物品的一個指令,那麼取物品,那麼取物品就應該是從這裏開始的,取物品就應該是A4,A4,這裏B3,C6,B2,那麼這4個字節,我們用D2來表示的話,就可以這樣的一個表示。
當然如果是從字節來表示的話,就是與這個順序來相反,好,那麼我們再接著來看一下,那麼這裏應該是也是它的一個數量,這個位置沒有變,然後這裏,12這4個字節,應該就是來源於我們的物品對象的4C,這個地方。
那麼後邊,我們所說的在取物品的時候,那麼這8個字節的話,是來源於我們背包對象裏面的,4的8個字節,那麼我們再來看一下,取物品的時候,這8個字節它又來源於什麼地方,那麼之前的話。
我們是在物品對象的屬性裏面收到的,那麼我們這一次了,我們依然在這個物品對象,裏面來搜一下,看能不能夠搜索到,那麼在這裏的話,我們可以看到,這裏是11,12,13,這裏是14,它的下標。
那麼我們先從計算出人生的對象地址,那麼14的話,就應該是靈異,靈地,那麼我們先看一下它的物品數量,應該是靈異這個地方,140個,那麼這是我們的人生,那麼人生的地址,我們可以看一下,是從什麼地方開始。
那麼前面這一個,16D17780,那麼我們從這個地方開始搜索,16D17780。
然後我們搜索它的字節集,因為我們在取人生的時候,我們看一下取物品的時候,是這8個字節,我們把它複製出來,然後這裏還有兩個字節,把中間的空格,我們把它刪掉,注意這裏,我們要選字節數,那麼這個時候。
我們的確能夠收到這個地方,那麼我們收到一個地址,那麼這個地址的話,但是它離得比較遠,它的來源的話,不是來源於我們這個對象裏面,離得太遠了一點,那麼我們重新搜索一下,我們再搜索一下。
金創藥的取物品的這幾個字節,那麼金創藥的這幾個字節,它一共有兩個地方,那麼可能是我們搜的不完整,那麼我們看一下,66的後面還有一個6D12,我們一起把它複製出來,那麼我們現在要做的。
就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址。
把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的。
就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址。
把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的。
就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址。
把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的。
就是我們要把這個地址,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來。
那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的。
就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址。
把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的。
就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址。
把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的。
就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址。
把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的。
就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址。
把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的。
就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址。
把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的。
就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址。
把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的。
就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址。
把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的,就是我們要把這個地址,把它複製出來,那麼我們現在要做的。
就是我們要把這個地址,把它複製出來,那麼人生也是人生,但是這個人生的話,它是不是我們背包裏面的人生,因為我們背包裏面的人生的話,剛才我們有計算過,背包裏面的人生是在這個位置,是在16開始的這個位置。
而我們現在這個位置的話,它也有一個人生,加上54,那麼有可能的話,可能就是我們倉庫裏面的對象,它也是54這個位置,與我們之前的沒有變化。
這個是我們所謂的ID2,之前是這樣來表示的,它,這裡是44,那麼我們看一下,它究竟是不是我們倉庫裏面的物品,那麼我們來看一下這個地方,它的一個數量,44,那麼它的數量,這個時候為19。
而好像我們剛才倉庫裏面的,人生的數量的話,也是為19,那麼我們再次來看一下它的一個變化,這裡恰好是19,那麼說明的話,也就是說我們,它的數據來源的話,也是這個位置,那麼只是我們有一個地方發生了變化。
那麼我們取物品的話,它的對象的話,就是倉庫的這個訴訟列表,而我們存放物品,它的物品對象,就是我們背包裏面的對象,它對象不一樣,那麼我們也把這幾個字節,也給它背出一下,加上,我們之前所說的12這個位置。
也是來源於物品對象,是這個位置,而加上我們的,這裡是我們的2A這個地方,也是來源於我們的物品對象,是這個地方,那是我們的倉庫對象,這裡我們取物品,就是倉庫裏面的對象,那麼其他可能還有一個。
也就是我們倉庫裏面的背包格數,我們可以來對上我們之前的分析,來做一下比較,物品在背包裏面的一個下標,那麼看有沒有這個參數,那麼實際上我們可以把這個來,因為它都是同一個庫,那麼可能有很多相似的這個地方。
我們可以參照之前分析的數據。
來進行相應的對數,那麼首先這裡我們只是要改一下,這個是倉庫對象,倉庫,那麼這裡同樣是來源於倉庫對象的4C,這個地方,應該也是我們一次要取的物品數量,取一個物品數量,1、2這個地方。
那麼這裡它同樣來源於5、4,8個字節,還有3、2這個地方,我們看到的這裡也有4字節,它同樣的是來源於1、2,這是存物品的時候,取物品的時候應該也是一樣,我們來看一下,在前面這段,補製一下。
那麼我們在存放物品的時候,這裡的A應該是10,取物品的數量這裡應該是10,10應該是A,那麼前面的這裡是B,取得人稱的數量是11個,3A這個地方,那麼3A這個地方我們來看一下,0B這是它剩餘的數量。
那麼這裡是15了,剩餘的數量是21個,那麼我們再來看一下是不是這樣,我們再來看一下人稱,這裡是19個,它當前的數量也就是13,那麼在這裡我們可以了。
把這裡的斷點先取消掉,刪掉那一層,那麼我們這個時候看一下,DSPDB來顯示一下,那麼這個時候我們可以看到3A,這個地方是13,那麼3A這個地方的話,也就是我們倉庫裏面的人稱的,當前數量。
那麼說明這個的話,它的預定也是一樣的,還有43我們看一下,那麼43在這裡它是0,代表的它的下標是第一個位置,那麼我們也可以做進一步的測試,比如說這個金創要中,當然這個時候它沒有數量,不會顯示這個框。
那麼我們先把它放進去,再來做測試,那麼我們取兩個數量,那麼這個時候我們再來看一下,43這個地方,它的下標是1,這裡也是代表了它的一個下標,那麼我們也可以用這個含義詞來做,一個相應的測試。
那麼它的下標是2,那麼如果我們取一個物品出來,我們看一下,那麼這裡它也會變成我們的數量2,因為都是這個框,存放物品都是同一個框,像倉庫存東西取東西都是同一個框,那麼所以說它的結構的話。
來說的話也是一樣的,那麼只是我們的分析當中,多了一個數據出來,也就是這個地方,B2這個地方,這個地方是加上我們的0,也就是B2,那麼加上0的這四個字節,應該就是它的一個動作指令,我們再來看一下。
那麼這個應該是它的ID,那麼加上0E這個地方,B2C6B3A4,那麼這個就是我們的取物品的指令,我們再來對比一下,看是不是這樣,那麼取物品的時候都是B2C6B3A4,這個一直沒有變。
那麼應該我們的分析應該是正確的,好的那麼我們做上這樣的一個標記,那麼這些都是一樣的,122這個地方,那麼也就是我這裡來我們對緩衝區結構的一個解密,多了一些東西,也就是0E這個地方。
還有一個存取的一個指令,好的那麼這節課的分析,我們就到這裡,那麼下一節課,我們對相應的結構做出一個修改,再進行一個相關的測試,那麼來練進一下我們的想法,好的,那麼我們下期再見。
P66:077-封装仓库列表结构及取仓库物品函数 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么上一节课呢我们分析了啊,从仓库里面取物品的这个功能,那么这节课呢我们嗯会测试这个相应的功能呢做一些准备啊,首先呢我们把仓库列表相关的结构呢封装好。
那么首先我们打开第76课的代码,那么首先我们改一下这个缓冲区的结构,转到我们的结构单元,那么这个缓冲区结构呢,前面的我们这里呢本来前面12个字节我们都不知道它的一个意义,但是我们上一节课分析的时候。
通过一个比较好,那么我们发现呢从零异这个偏移开始的,后面的四个字节呢很可能就是一个存取的一个指令用来区分的啊,那么我们这个时候呢我们可以来在这里边呢减掉四个字节,也就是减掉四个字节之后呢。
也就是引进啊零一,那么后边的这里呢我们就可以定义四个字节的数据,来用来存放这个相应的指令,没问题,come on,那么这四字节,就是我们的相关指令。
那么这个指令的话我们已经发现的了宠物苹果取物品的这个指令啊,就是在后边这两条成物品,这是曲目平时并不或者说这个是一个发包的一个分类啊,那么我们存放物品来用用这个分类编号。
那么取物品来用这个分类编号用来区分的啊,存取之间的一个动作,好的,那么我们先把这里呢进行一个修改,然后进行保存,那么接下来呢由于我们的要用到一个仓库列表里面的,这些相关的数据啊。
所以说我们在这里呢也定一个仓库相关的结构,然后呢再对它进行一个get dirt的初始化,与前面的背包列表了,它大致是相同的定义,那么我们找到前面的背包列表,在它的后边呢,我们定义这个结构。
那么这里是背包的链表结构,那么我们在它的后边,因为这个相应的函数里面呢,它也要用到我们啊这前面的啊,这个背包对象,因为背包的对象的话和我们发现背包的对象偏移。
比如我们的仓库里面的对象的偏移呢它是一样的啊。
好像分队编号也是一样的,那么我们可以用d来看一下它们的分类编号是否一样。
deporter mist,我记一下,那么它的类型呢是ea,那么我们再来看一下背包的,相关的公司,那么我们发现的话这两个类型呢它都是ea啊,都是ea,那么所以说它的对象类型都是一样的话。
那么我们也可以用同样的偏移来进行操作,那么所以说我们在这里定义的时候呢,也就借用了前面的啊背包对象,来定义我们的这个残酷的仓库列表的这个对象,那么它的大小呢我们可以看一下,他一共下来了,是死狗啊。
我们每一行呢是六个,那么所以说它的大小呢是60啊,这是仓库的大小,那么仓库的大小我们定义了之后呢,它里面物品的一个大小我们定义之后,那么我们也需要对它进行一个初始化,那么返回值呢也就是我们这个仓库的嗯。
这个结构类型那么好的,我们先转到我们的cp单元来对它进行一个初始化,那么为了方便复制呢,在这里呢我们直接给它加上一个呃未成员的一个限定,那么它的初始化呢我们就放在呃这个背包列表的初始化后边。
而且我们还可以来复制一下它的相关的代码,相关的代码,那么我们先把它复制一下,在他的基础上进行修改的话,我们会快得多,会快上很多,那么在这里呢,首先我们要改的就是它的一个前缀七deport poli。
好那么初始化的时候呢,还有一个机制呢,我们要改钻石以后的miss,那么同样我们要改的是它的一个大小,那么这是它的一个大小,那么其他的判断呢基本上都是一样啊,这里呢我们需要加上一个s。
或者我们在定义的时候呢,就跟他写的一样啊,这里这个s呢我们把它删掉,good list,啊,二,那么其他的话我们都可以不进行修改啊,因为我们所用到的都是一样的。
其他的这些属性i d i d及其他的要去除物品这一类的,那么我们先编辑一下,好,那么编译通过了之后呢,我们再来看一下,我们还需要添加一个相关的成员函数。
也就是very good index for name,这个时候呢我们是骗你的,是仓库列表,找到它相关的一个下标,那么我们也是仿照上边的这个函数来写标题,估值index类。
那么我们复制一下这个相关的函数,那么在他的后边呢,我们在这里呢改为我们仓库的前面函数里,那么同样的哈,这后边的写法呢也是一样,但是这个地方呢我们的写法呢要改动一下,这里的大小的不一样。
这里它的下标是60,那么后边的这些写法呢也是一样的啊,那么这里呢只是我们骗你的是一个仓库的一个背包,那我写完了之后呢,我们可以做一下相应的测试,那么还有一个呢也就是我们之前的这里有一个保存到我们的仓库。
现在呢我们是从仓库里面把它取出来,那么所以说最后这个函数,那么我们的写法呢也是仿照上面的这个写法来写,那么我们把这相应的代码呢也进行一下复制,那么复制之后呢,我们对它进行相应的修改。
首先名字我们要进行修改,还有这个结构,那前缀呢我们也要进行一个修改,那么修改之后哈里边的这些数据呢,我们还要进行移动,一定的改动,要加上一个指令,这里要变,deserve common的啊,这个要变。
那么come on,我们看一下我们区分的这个指令,那么取物品的话,之前我们是成物品,取物品的话就是这四字节的16进制的实力,那么其他的话应该说都没有什么变化,这个扩的话它也是相同的啊,也没有什么变化啊。
理论上这样我们就可以,那么接下来呢我们进行一下测试,那么测试呢我们现在我们的全局变量单元呢,这里呢添加我们的相应的全局变量,哈哈,最后啊miss,嗯,那么同样的我们要需要呢。
呃声明这样的一个变量在我们的这个跟结构源代码单元,好那么我们再次编译一下啊,在编译之前呢,我们在主线成单元呢添加我们相关的测试,那么这里呢我们把它改为depp啊,desty就行。
那么这样呢我们就啊后面的这个函数呢,我们还需要改一下,get out啊,那么这样呢我们就是每次都会从这个仓库里面呢,取出我们的相关的这个人生的数量,我们改为123好,那么我们再重新编译一下。
那么先看一下我们这里边有没有这么多人参考,有60个啊,可以供我们测试,那么这个时候我们先把o d退出来啊,这样注入的速度会快一些,这个时候没有注入进去了,是我们的这个工作目录啊。
对我们设置一下工作的目录,再重新生成一下。
你唱,那么首先呢我们挂接到主线程,然后看一下仓库里面的人称的数量啊,测试,那么这个时候呢它会显示啊无法转移物品,那么说明的话我们的这个代码的话可能有一些错误,那么我们再接下来再对我们的这个相关的函数呢。
嗯进行一下调试,那么调试的时候呢,我们用o d啊先附加进去,看一下它相关的这个数据,对不对,那么我们现在这个相应的地方来进行下段。
在这个地方进行下段,然后我们再次输入我们的动态链接库,这个时候断一下的话,我们先让它跑起来,会再断一下,好过一些主线程,然后下段,然后再次测试啊,断下来。
这个时候呢我们看一下它的对战d t e s p加四,好的,那么我们看一下对战里面的数据,那么首先呢b2 c6 b3 s68 80s,那么从这段数据的话看来的话,看起来没有什么错误啊。
那么我们再来对比一下指令没有错啊,幺二这个地方也看不出错,那么一这个地方我们看一下,1i这个地方呢是,一取一个物品,那么我们再来看一下后边的,他认为这个地方把自己,323a这个地方。
3a这个地方呢等于3c,3c的话,30x16=48,48+12等60个啊,这个物品数量也没有错,那么43这个位置,事实上这个地方呢为1a那么我们看一下1a的话,a等于26,也就是他所在的这个下标。
那么我们先把断点取消掉,那么这里的话我们可以看一下6424,这里是242526,那么它的下标也没有错,那么为什么无法转移这个物品,那么我们先取一个物品出来嗯,看一下比较一下他们两个的这个缓冲区。
好那么这个时候的缓冲区,我们看一下,第一批e s p加四,那么e s p加四呢,就是这个位置,也就是取出的18a488 这个缓冲区,那么我们来看一下它里面的数值,那么先把这段数字来复制出来。
然后我们自己取了一个数据来把它复制出来,啊这是正确的,这是一个男生,好先让他跑起来,那么是不是这个才是取得一个人称,3d,那么他是不是接连发了两个包,这个地方断一下哪里吃,我们看一下。
那么我们再取一次啊,试一下,可能它是有两次操作啊,这个读取人生的时候啊,存放这个人生,这是第一次操作,那么还有一次这个时候呢它还会断,下一次,一共是两次操作,那我们先先把它取消取消掉。
那么这个时候好像与我们的这个嗯,与我们的这个盛放人生这个物品的话有一些不一样,它在取的时候来回取一次啊,这是包包会发两次,这是发第二次,那么这里面都有我们人生的这个相应的id号。
那么前面这一段是相同的也是相同的,403068c3 b3 c那么前面看起来都是一样的,只是四零,这里呢它不一样,这里有个七八,后边再多了一段数据,那么会不会是我们后边这一段数据的一个填充方式,它不一样。
也可能是,那么这里还有一个我们看一下六零,那么我们自己我们看一下我们自己这里嗯发的这个数据是什么样的,数据测试,肚皮,好让他跑起来,那么这个时候呢我们这个地方呢也会断两次哈,但是断第二次的时候呢。
它不一样,那么这是我们自己发的数据,同样是取一个人参啊,前面的这个b2 c6 ,零一这里我们看一下它这里呢没有相关的这个取一个人生的时候呢,没有这个什么b26 的这个数据,这个地方全是零。
那么后面的数据的话,我们看一下,再看一下六八ca 9 a3 b,那么这个地方也不一样,这是我们自己的数据,他的数据等我们看从二在这个地方开始,那么这里的话b8069 g。
那么我们再重新取一下这个取人声的这个数据,那么我们看一下它调用的来源嗯,来源是同一个地方,那么再看一下它的数据,那么这个数据的话,我们发现与上一节课所抓的这个数据的话,好像也,有些不一样。
那么我们再次再从这个地方下段再看一下,那么然后呢他在另外一个地方又有一段数据啊,出现在这个地方又有段数据出现,那么这些数据呢我们先取消掉,再次到游戏里边,我们再抓一下其他的数据,清创药,啊,嗯。
那么这次取得我们是取得金疮药,那我们再取一下人声试一下,那么这个地方它不一样啊,一个是三,一个是五,那这个地方呢它也与我们上一节课所抓取的数据呢有一些不一样,那么可能是服务器的啊不一样。
所以说这段人还有一些差别,那么我们成物品或取物品之间的话,它应该有一个就是说应该有一个不同,那么我们再试一下存放物品,那么我们发现呢这里呢存放物品的时候呢是2b0 c1724 ,那么有先存放物品之后呢。
这个数据呢会发生一个变化,那么我们再次取物品再试一下,啊同样这个地方为零了,那么这个地方我有那么这个地方的话是里面这个地方它唯有好的,那么我们再做一些修改,那么这个地方呢我们我们做一下修改。
那么可能是这个地方是用三和五来分别来代表我们的,一个是存取物品啊,那么五来可能是用来取物品好的,那么我们再次重新测试一下。
那么这个时候呢同样的物品呢无法转型,那么我们再来看一下啊,曲目屏的时候,端下,那么这个地方呢它是为零,这个地方,那么为零的话,我们再重新给它修改一下相关的指令,那么也就是说我们这个地方它问题。
那我们再把o d啊退一下,把断点的全部要禁止掉,然后呢再退出重新测试一下。
然后呢我们报接到主线程测试,这个时候呢我们可以看到呃可以获得这个人生了啊,每次来一个,这个是两个,这个是三个,那么说明的话呃这个地方的话它同样的是一个取物品的,可能是一个指令,但是由于这个服务器啊。
就说大区和小区它不一样,可能是这个取物品的指令呢它有一些变动,那么还有这个地方啊,里面这个地方的珊瑚它也是一个相关的一个指令,也可能是,那么但是这个地方呢不知道它是几字节的嗯,要分析的话。
我们也可以用ot呢加载到里面哈进行啊,更进一步的一个分析,或者是后边我们在存放物品的时候,可以更进一步的进行一个分析,查看这个数字五的一个来源,那么我们这节课呢再把,落地了,附加到我们游戏里边。
找一下这个数字五的来源来源于什么地方,是几个字节的,呜呜呜。
咳咳那么我们再次在这个存取物品这个地方下段呃,这之前的话我们看一下da这个地方,他恰好是写入的1874这个地方写入的第一个字节,那么我们看一下它来源于什么地方,在这个地方进行下段。
那么我们以成物品为例看一下,那么我们看一下eb x d d e b x加上1784,那么这个地方啊13啊,那么我们对这个地方呢进行一个呃内存写入的断点,看他是什么时候写入的,再次播放的时候。
我们可以看到这里呢有一个数字来自4341784,这里的它是低温的,是四字景啊,说明这个地方,那么这个可能就是一个存取的一个分类标志,比如我们上一节课所分析的嗯,那一个存取指令呢可能是呃可能不是的。
那么这个呢才是一个真实的一个存取的一个指令,那么我们把它复制一下啊,去掉为什么断掉,一个,那么取的话它是来源于另外一个地方,那么我们也可以在这里下断一曲的话是从下面这个地方转上来的。
那么从下面这个地方转转上来的话,它是1p x加1084,这个地方,那么我们重新把这个断点呢取消掉,找它的来源,那么取的时候我们可以看一下db加180c,那么这里呢有个数字五。
那么我们找一下这个数字五的来源,那么我们也可以在这里找到啊,这里呢有一个数字,那么这里呢我们还能够看到数字六啊这一类的,那么可能是其他的一个分类,那么我们暂时我们不管他。
我们只要把这个呃数字三和五先记住,那么这个呢才是一个指令的分类,那么它的偏移的话,我们看一下是,再来看一下它偏移的情况,我们,那么这个数字五呢是在0a这个位置的这四字节,那么也就是他之前的这四个字节。
嘟嘟嘟好的,那么我们再次修改一下相关的一个结构,直到最后,那么这个来come on呢,呃就有些错误啊,那么我们应该是在你a这个位置,那么后面的这四个字节呢,嗯应该是承包物品栏,应该是三取物品来。
应该是土木,那么后面啊还有四个字节呢,这四个字节我们暂时把它取名为nt come on,二八这个也是可能是一个区分的啊,但是呢我们暂时还不知道啊,没有具体的一个确定,那么同样的代码我们也要进行一个修改。
那么在这里的话我们就嗯复制为取物品的话,我们就复制微博,纯物品是三,那么我们再次进行测试,也就是说后面这个五的后面啊,这这几个字节的话可能是无关紧要的,那这这只是一种假设啊。
但是我们还是要进行一下测试才知道,挂机主线程,然后来测试,那么这个时候我们发现的话呃那个他们的二的话,那个数据预览它是没有用的啊,那么没有用的话,我们暂时来把他的名字还是改一下,就不叫come on的。
那么这四字节呢我们就用b先来表示,mp,随便给他取一个数值,那么占四字节的空间就可以了,这样方便我们对齐啊,那么这里的a呢加上这八字节呢就恰好了,等于我们的120啊,因为加上我们的八字九,好的。
那么这节课呢我们就呃那么就写到这里代码。
P67:078-物品购买功能分析 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们一起来分析一下啊,物品购买的呃,关键的一些数据。
那么首先呢我们移动到这个平时指这个npc这里,那么打开商店,打开商店之后呢,在里面呢我们可以购买相应的物品,以这个金创新要小为例,那么我们比如说购买七个啊这个物品,那么这个时候我们按下确认的时候呢。
就会向我们的服务器来,肯定会发送一些信息,告诉我们的这个服务器我们要购买多少物品,这个味道,那么所以说我们在购买物品的这个功能的话,可以从这个发包的这个函数这里下段,然后进行立项分析。
啊找到我们的这个关键的代码,那么下载断裂之后呢,我们再点确认,但是现在呢我还没有点确认啊,它就断下来了,那么像这种情况,我们先让它运行起来,再次我们点还是没有点下确认之后呢,没有点确认呢,它就断下来了。
我们就让它跑起来好,再次点确认啊,这个时候是我点下这个确认之后呢,才下下来的这个断点,那么我们把断点取消掉,按下ctrl f9 啊,然后呢注意断到这个位置,那么我们给他做一个备注吧,注吧购买物品一。
然后给它下一个断点,那么再一次呢执行到反馈,那么呢会断到这个地方,那么这个是纯仓库的啊,那么买卖的呢可能也是这个呃,也要经过这个扣,那么我们在这个地方下断,然后再一次来执行到返回。
那么我们发现呢会断到这个地方,打开仓库,关闭仓库啊啊存放物品,那么这里那么买卖物品呢也要经过这里,那么这个呢可能很很有可能是我们就是呃仓库一些相关的一些操作,比如说点击确认这一类的一些操作。
但是真正的我们出售物品或者是购买物品的话,呃可能是离我们这个发包的这个比较近的这个空好的,那么我们让它跑起来,先让他嗯再一次我们购买物品,让他断下,首先呢它是断在这个位置。
我们看一下e d i的一个数字60嗯,那么这两个数字的话,它也既没有缓冲区,那么呃也没有取地址的这种啊结构啊,那么像这种这个地方的这个这个扩的话,它可能性比较小一些,那么我们暂时把这个断点呢取消掉。
那么然后移到这个地方,那么这个地方呢,最后呢他传的参数呢是取得一个对对这个缓冲区的一个地址,然后做一个参数传进去,那么这个地方呢与我们之前分析的仓库里面,存取物品的这个扩展是一样的,是同一个扩。
那么这个课的话呃,我们对他的这个ex进行一下分析,缓冲区,看一下逼逼,那么我们可以看到这个时候缓冲区呢嗯它有前面的两行数据,那么这个地方呢可能就是我们的数量,那么这里有个6c a9 a3 b了。
这个数字人应当是相当的熟悉啊,是我们i d相关的,我们在存储仓库的时候呢,遇到这个那个id也就是来源于我们物品对象的啊,是在这个地方的这样一个数据,那么可能的话从这个数据的分析来看的话。
很有可能呢那这个过来就是一个通用的呃,我们购买物品存向仓库里面存取物品,都可能要调用这个库,那么呢他就用嗯,可能呢就是用这个地方的指令来来区别我们的呃这个存取或者是购买。
那么我们再回过头来看一下waterp,看一下存储仓库啊,这个地方的哇,像仓库里面存取东西的时候呢,我们这里呢也有一个啊,有一个常量,那么而且呢很巧的都是在假日这个偏移,因为我们这里的话呃。
缓冲距e4 x来,2818281包,2818这个偏移啊,负的2818加上日的话恰好了,也就是我们付的2816,那么呢在这个地方呢我们存储嗯,也就是说加入这个位置,我们如果是这个数值的话。
就应该是向仓库里面存东西的缓冲区号都是加热这个地方四肢水,那么这个呢可能就是我们的存放物品之类的,仓库存,取几位,那么我们回过头来看购买这里,那么购买这里呢它也是2818啊。
那么这里呢也是他负的2818呢,加上日本也也等于我们的2816,但是呢它这四字节的区分不一样啊,这那么我们这个来看就是我们的嗯商店购买指令,购物指名说的是那么同一个位置。
那么缓冲区现在我们对这个缓冲区的了解呢可能就更多一些了。
多上了一个偏移,那么我们可以把第77课的这个偏移呢把它复制出来看一下。
那么这里呢又多了一个加二的这个偏移,然后我们把这这一段说明呢复制出来。
当然在下面的这些偏移呢,我们不一定能够用得上啊,但是我们看一下加热这个地方呢可能是用得上的,那么加名义这个地方呢它是存取指令啊,嗯之前的是一二,这个地方呢它来源于我们4c也就是那个i d。
但是这些好像我们都不一样了,还有数量之前的话它是在1a这个位置,那么我们看一下现在的这个数量的话。
我们再次让他断一下,比如说我们购买清仓要大购买七个,那么我们看一下它的缓冲区域,那么只有前面两行呢有这个相应的数据,我们把它复制出来,金疮要大机构嗯,那么首先呢这四个字节啊,就是我们的这个指令啊。
那么呢这是低位的,从这个9月开始零零,然后再次最后呢再次巴黎嗯,然后这里它有一个数字一,但这个数字一暂时我们还不知道是什么意思,那么这里呢有个674a9 a3 b。
那么这个呢就是以前我们啊像仓库里面存取物品的幺二这个位置说,说明在后面的这些呢我们可能都用不上,都用不上,那么这些不一样,那么它的结构呢我们看一下数量期的话,是从这里1011121314116这个点。
那么这个结构呢它又有一些不一样,是物品数量,那么这是低位啊,如果是高位的话,他可能也是占两个字节,来表示物品的数量,那么零六这个地方,嗯可能他也有他的这个意义,但是我们暂时还不知道,还没有分析出来。
还有就是这个地方这里是f这里是e0 e这个地方,那么零一这个地方呢成了我们的这个app,来源于我们的对象可能应该也是呃是在这个地方,但是这个四色的话,可能它的背包呢就不一样了。
它的这个数组的话应该是这个商店的这个数组列表,但是我们现在的商店这个列表的话,我们还没有找到他的一个机制好的,那么我们继续做一下测试,以人生为例,或者是这个血缘生命为例,那么在这里呢我们购买八个数量八。
让他断下来,那么血缘三发我们看一下它的这个缓冲区,好先让他跑起来。
那么这个缓冲区呢要简单的多啊,这里呢我们可以看到也是数字一啊,那么这里呢从六七这里变成了6a说明他们的i d呢不一样,这里是数量,那么呢它可能就只有这样这样几个属性呃,一个是指定啊。
那么这个指令呢可能还包含了这个零一,或者是在后面再这四个字节有可能是,那么it用来表示购买的是某个物品,那么一六这里的是物品的数量和两个字节,大致就是这样,那么我们再进行一下尝试。
如果我们是出售物品又会怎么样,三那么我们看会不会断在同一个位置,那么这个时候呢我们发现没有断在同一个位置,那么这里呢都是一个发包的一个函数,我们在这个地方呢,下段也是相当于必须是你啊。
那么下段那么我们再来进行一下尝试出售物品的时候,那么这个时候呢它马上就会断下啊,马上断下来应该不是我们所要的,我们点了确认之后呢,再断下的这个地方才是啊,它在它前面一点啊,那么这里呢就是我们的出售。
出售物品,那么我们可以在这里来看到2812,这里呢也就是说我们的2818+6个字节,那么这里呢表示是出色这个常量,而且的话这里呢是四字节的,如果我们这里呢有281来代表的是什么呢,购买好。
那么所以说这两个的话它也是一个一个是购买,一个是出售啊,这两个,所以说我们也能够找出这里的这四个自己的一个意义,那么这四个字节我们看一下,从零六这里开始,012346,那么原级也就是加1。6这个地方。
那么这里呢是支持一表示620表示出售,那么说明它的出售和购买的话也应该是呃调用的同一个空,而且是用的同一个结构,都是这样的一个结构,那么是不是这样的一个结构呢,我们再来啊分析一下。
那么我们需要在这个地方呢进行一个下一个断点,那么我们看一下这个时候呢它的这个缓冲出来是dx啧啧,但是这个时候的话我们可以看到,那么如果是出售物品的话,他后面的这个缓冲区呢就非常的长啊。
这么长一串比我们的要比我们的购买物品呢显得要复杂一些,这是我们的出售物品,那么好像我们也是出售的五个物品,那么或者是说这后面的这一串他可能没有用啊,也有可能,那么有没有用呢,我们可以来做一些尝试。
那么比如说这里出售三个人参,那么我们在这里呢把后面的这一串缓冲区呢,我们全部给它清零,可以用零来填充,看会不会出车成功,很快这个时候呢我们可以看出啊,也迈出了这个人生的啊,从这个消息的具体有没有成功呢。
我们看一下这个人生他剩余的数量啊,这里是六个,那么我们再卖出五个试一下,然后呢我们再看一下它的缓冲区,那么这个缓冲区呢我们给它进行后面的,我们给它进行一个清理,好然后呢再卖出。
那么我们可以看到这个时候呢卖出来它是没有成功的,那么说明这个出售物品的这个结构呢与我们呃购买物品的这个结构呢,它不是完全一样啊,那么显得更加的复杂一些,好的那么这一节课呢我们先分析购买物品啊。
出售物品的这个呢我们留在下一节课再进行这个分析,好我们清仓要倒啊,再来进行一下尝试,一个金仓要到,那么后边的全是零,这里是五,这是67c a,嗯那么我们大致知道这个购买物品的一个作用了。
嗯那么出售物品呢他可能是要进行一个判断啊,判断这个物品呢是否存在啊这一类的,所以说呃他可能这个嗯结构呢里面的数据来可能要多一些啊,多一些好的,那么我们再次来看一下这个结构啊,这边674a啊。
这里是我们的i d,这前面是我们的指定啊,这里这里是我们的数量,那么我们大致都分析好了,那么分析好了的话,我们接下来呢就可以进行一下相应的一个测试啊,初始物品我们就在下一节课在进行讨论。
那么这节课呢我们主要是购买物品,咳,那么接下来我们购买物品的话,我们也可以进行一个以下相应的测试,因为这里呢它只有大概是我看一下,大概只有20个自己的一个空间,那么这样我们可以用代码输入器啊就可以完成。
那么比如说我们要就以这个购买金疮药大为例,那么我们在这里呢也可以呢先跟他分配相应的这个空间,然后呢我们对它进行相应的赋值就可以。
那么在赋值的时候呢,我们用嗯先用16进制,来表示,比如说精通要到这个时候,我们测试这里不够,那么这里呢我们用滴滴来显示一下cp ex,那么这里呢就代表着事物嗯,这样表示的话,我看也不是很方便,加二。
这样来表示好像要好一些啊,这里是四肢解,这里是四肢解,这里是四肢解啊,这里也是四肢解,这样方便我们对齐啊,这里是,这里是我们的嗯,一个字节相当于来表示我们的数量啊,但是我们都可以用四字节的来表示。
这样的修改的话,先复制一下。
那么我们测试的时候呢,就可以直接把这些数字来放进去,那么我们也可以嗯,不如果我们是不分配这个空间的话,我们也可以直接的破写,但是这样我们要写的指令的话就非常的多啊,那么我们直接就这样写嗯。
通过e x e s p i t t e a x加二,那么加二的话都到这个偏移这里,到这个偏移这里呢,我们再对它进行一个协助就可以了,那我写入后面的这个数据,然后再是我们的ex。
或者是我们直接按照这个偏移来也是可以的,那么我们这里的就不需要加二个,那么在这个地方加上,那么这个地方呢我们就是加6+6呢,我们写入一把前面的这一行复制一下,加六之后呢。
然后我们是加0k0 k这个地方呢全是零,然后这是灵异,那么零一这个地方呢就是它的id用来区分物品的这个分类的,然后再是一二,然而这个地方呢是零,然后呢这是一六,要对这个地方呢是它的数量。
比如说我们12哈,最后呢我们在复习ex,当然push ex之前呢,我们还需要来复习0x86 ,最后呢我们是5e4 x。
我们看一下它e4 x的数字是这一句,我们把它复制出来,最后呢再次扩,那么这些这样的话,我们以此来理论上就能够购买了两个这个精通要道啊。
但是我们不知道它后边后边的这一串数据是不是全部需要清零才可以。
那么我们直接先进行一下尝试,那么我们看一下啊,输入到游戏里面,看一下现在金创药的数量是35米,真的,那么我们还需要加上一个前缀,还可以看到,好,的,那么我们再次注入到游戏里面。
那么这个时候呢我们可以看到啊,购买了两个金创药,但是为什么游戏里就关闭了呢,因为我们这里的堆栈它没有来这里分配的空间,这里没有屏障,这里还要让usp加上九零,因为之前我们在这里呢减掉了9年跟字节啊。
相当于是分配的这个空间,但是这里呢我们要把分配的空间呢释放掉啊,理论上这样才可以,那么我们重新再打开游戏上进行一下测试,好打开游戏之后呢,我们再一次打开n pc,打开我们的商店嗯,打开商店之后。
我们看一下现在金创药啊,357,因为刚才购买成功了两个,那么再次输入到游戏的原测试,看一下商务机构359个啊,因为每次来会买两个啊,数字如果这里我们买12个啊,这里是16进制的,相当于一次买18个啊。
3793 97 415,这里433相当于一次就买了18个啊,这里面就相当于一次了,那么我们的购买呢是成功的,那么这里呢我们可以改一下,改为6伏呢,那么就是金创药小改为六六了。
应该就是这个金创药中的这个位置,那么我们如果是改为六八,那可能就是人生有可,啊这个时候呢人生比如说我们去买一个了啊,这个时候呢就买了一个人生,那么在后面的话,这些人可能他的id呢有可能是i卓的。
也可能没有挨着,我们可以尝试买一下啊,这个六九,那么这个时候呢我们发现没有作用啊,没有作用,那么只有在前面这几个的编号呢,它才是i做的啊,说明,轻松要小三个啊,这里可以看到买三个。
那么说明我们的呃这个测试是成功的,那么这节课呢我们就讲到这里,那么下一节课呢我们再来继续把它封装成一个呃相应的函数。
嗯那么这一节课呢也给大家布置一个作业啊,那么作业呢首先呢我们就是要把这个购买物品的相应的这个缓冲区呢,啊结构化,嗯,另外呢把这个呢把它封装成一个函数来进行调用,当然要把它封装成函数的话。
我们还需要有一个工作要做啊,嗯最好呢是要把我们的这个商店的这个数组列表要找到,找到之后呢,我们的这个i d啊,也就是我们的这个零一这个偏移后面的这个i d呢,它的数据呢才有一个来源啊。
我们需要骗你这个商店的这个背包,然后呃得到相应的id呢,然后我们才能够真正的实现这个购买物品,这样我们使用起来才方便,如果像这样,我们每一个我们都要去硬编码的话,这样呢非常的麻烦,好的。
那么我们下一节课呢嗯再来实现啊,相应的这个功能大家也可以自己下去动手一下,做一下,哈那么大家可以尝试进行封装这样的一个函数,那么也就是呃购买物品,根据这个物品的名字后面呢是一个物品的一个数量啊,好的。
P68:079-分析商店列表 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么在上一节课呢,我们分析了物品购买的这个功能扣,那么它的缓冲区结构里面呢,那么其中有一项啊,零一这个偏移这个地方呢用来表示的是我们嗯作品的类型。
那么具体的这里我们称为物品的i d的话可能不是很恰当,i d呢它是唯一的,那么物品的类型的话,它可以是相同的,不就是说在不同的这个玩家类型里面,它可以存在做一个相同的呃这个类型。
这个可能我们叫做物品的类型,那么可能更恰当一些,那我们后边的啊在出售物品的时候呢,它才有一个唯一的一个id啊,身份的一个标识,因为那个身份的这个标识的话,它这个物品呢嗯标识呢应该说它的这个数据量比较大。
是用的我们之前的存仓库的这个功能库啊,缓冲器结构里面呢它是用八个字节来表示的,而物品的类型呢它这里是用四个字节来表示的,那么这节课呢我们主要呢就要分析一下这个商店的这个对象,的一个列表里面的这些对象。
那么我们分析了这些对象之后呢,对象的属性里面,那么按照我们以前的分析的话,就是在4c这个地方啊,对象的,物品对象假设在这个地方呢是我们物品的类型啊,那么之前呢我们把它叫做i d e啊。
那么现在我经过我们的这个分析呢,我发现的话,那么我们把它的名字取名为物品的类型可能更加恰当一些,好的,那么这个商店的这个物品列表的话,与我们背包的这个列表的话,分析的方式呢也有一些类似的地方啊。
那么我们也可以从一个关键数据来作为一个突破口,那么也就是说我们在选中一个对象的时候呢,它会像嗯二是把这个偏移来写入一个对象,嗯,那么这个机子或偏移的话,在我们之前的分析里面已经有。
那么我们先找出这个机子,看以前我们有没有保存,那么以前选中技能的时候,我们有这样一个地方嗯,多少多少加28这样一个偏移,那么我们看一下他最新的机制是多少,在跟贝斯里面有。
那么这个地方啊这是他最新的一个偏移,放置技能的时候用的,选中某个技能的时候,那么实际上我们在选中背包里面的相关的数据的时候呢,它也会啊是同一个机子加偏移,那么比如说我们现在选中的这个地方。
我们看一下它加上5c是它的名字,我们来看一下,加上在这个地方,那么这里加上50的话,就等于六四,那么前面这个偏移呢,我们把它移开,那么这个时候呢我们得到的我们现在选中的啊,也就是金创药宗。
那么如果我们换一下,比如说换这个一元三啊,那么我们这里呢就要改成嗯这个机制来加上我们的c,那么这里呢就等于我们的4c大概是10+5 c这个地址,那么这个时候呢就是一元三。
那么所以说我们要找这里面的这个列表的话啊,我们就可以通过这个选中的对象来搜索,那么我们可以这样来搜索好,首先精创要小,那么我们记下精创要小的这个对象啊,那么第二个呢我们是金创药中啊。
选中的时候呢是这个对象,而这两个对象呢它在我们列表里边呢,它是这两个呢,它是i做的啊,地址的话它是i做的,那么我们可以属于一个字节集啊,如果这两个他都在从同一个地址的话,那么我们就能够把它搜索到。
那么字节级的话,我们应该从第一位来80d b d e52 d,然后是081a12 d,那么应该这样来一首啊,这结局,那么这些集呢我们要从第一位来算起,从这个地位是要转过来,这样啊倒推过来。
当然我们也可以在这里显示的时候呢,我们就显示为这个字节数组,这样也是可以的,好那么我们这里选16进制,然后这里呢我们选字节的数组,然后进行搜索。
那么搜索出来的这个的话应该呢就是我们的列表的一个呃相对的机制,这就是我们的呃商店列表,那么这是数组的机制呃,相对机制,那么它的绝对值机制的话,我们可以在这里来找一下访问这个地址的代码。
那么首先呢我们在这里选中某个对象的时候呢,它的机子呢就会出来啊,我们可以看到,那么这一段的话就是我们的商店的一个相对的一个,就是一个机子的一个公式,那么我们可以把它复制出来啊。
那么这个时候的话我们可以说来就找到了我们的商店的列表,那么它的公式呢就可以通过这里呢推导出来,那么我们可以看到e d i的数值是多少,来看一下,那么就是这个数字啊,e d i。
那么我们再找一下这个e d i它存放在什么地方就行了,那么现在的公司就是这个嗯加上410,加上四神与它的一个下标,我们就可以这样的表示,那么我们再通过c一来搜一下新搜索,这里我们搜他的地址。
那么呢这里呢它就能够收到一个对象啊,我们看一下这个对象是不是我们主要的对象,那么在这里呢我们可以看到了呃,他应该是在所有对象里边啊,从这个嗯因为在这里收到的访问他的地址呢也是一个数组。
那么所以说我们收到的这个地方它不是的,那么应该有另外的一个地址,那我们再重新搜一下,那么我们再看一下,从这些列表里面再找一下有没有相关的这个机制,那么我们先找一下啊,这个地方,三交易,再次访问一下。
那么从这里来看的话,应该是这个所找到的,应该是所有对象列表里面,好的,那么游戏推出了之后呢,我们再重新进一下游戏,因为o d来进行一下分析,跟踪一下。
那么重新打开游戏之后呢,我们先用核武梯附加进去。
那么然后呢我们在这里呢可以找一下啊,它的这个呃e d i的这个数据的来源。
那么在这里我们找一下di数据的来源,那么我们先在这个地方下一个段,然后我们在这里啊选中哈某个物品的时候呢,它会在这个地方断下,先把它取出来,e d x,然后是达到一个相当于是下标。
那么我们看一下e d i现在的数值是多少,那么这个di的话我们看一下55d0 ,1a3 ,那么是在这个堆栈里面啊,这里有一个数据,那么我们在在c一里面先找一下,那么这里呢有一个机子堆栈的话。
它是在180c d18 这个地方啊,18c d8 ,那么我们在这里先找到18c d8 ,直接转到18c d18 这个地方,那么我们也就是从这个口进来的一个参数,我们从这里呃,反馈边窗口跟随。
那么是从这个ecx这里来的,那么这个地方呢它来源于e si加四这个地方,那么我们又要去找这个ei的一个来源,那么我们在这里呢下一个条件断点嗯,e c x300 ,好的先让他跑起来。
然后这个时候呢我们e4 x呢会断下啊,我们看一下,那么它来源于是e s i加上四,那么现在我们找到的这个地方的话,就是它加上四,然后加上410,加上四乘以我们的下标啊,这样来的。
那么这就是我们的这个相应的这个列表,那么我们可以来进行一下测试,dc精创要小,那么下标五一的时候呢是金创要中,那么这里呢是经常要大,那么我们从这里来分析的话,它这个列表呢与我们以往的这个列表呢。
它又有一些不不相同的地方,那么以前我们在这前面的话,直接就是一个机子,但是这里呢它不是,好那么我们再继续找一下e si的一个来源,我们先在c里面搜一下,看能不能都收到相关的机制,那么这里呢它有一个机制。
是f2 d,99c啊,我们找一下它,那么这里呢我们在找的时候呢,要加上一个零前缀,那这个时候呢我们还是没有找到啊,嗯那么没有找到的话,我们可以呢,嗯先对这个地方呢下一个断点选r,没找到机子的话。
说明他是一个偏移,那么我们这个地方呢呃也是一个相应的一个数组,我们可以在这里找到啊,是e c x加上1a x加上四,这样计算出来的,那么我们来看一下gt e4 x加上我们的啊。
这个时候ex呢它已经取出来了,好那么我们不知道之前的这个ex是多少,那么我们再让它跑一下,跑到这个地方,啊再走一下,这里也有一个es si,也是来源于我们e4 x加c,那么我们先把断点取消掉。
再重新登一下,那么我们先来看一下它的是在这个地方,是不是我们所要的这个物品的分类信息,67c9 a3 b,那么看起来的话应该是不,那么我们再重新对这个地方呢,下一个访问断点再来再来跟踪一下。
那么从这里我们来看一下哈,那么之前他的ex的来源来源于什么地方,那么ex的话,我们从,从这里来看的话,它来源于我们上一层的这个bp加八这个位置,那么e b p加八的话,在这里的话等于210。
那么我们看一下现在的app是多少,加八恰好等于210,也就是说这个可能是相关的一个机制,那么这个呢再加上我们的210神影4+4,然后呢再取出里边的这个数字,比ef加2670,那么是这样来的。
然后呢我们再加上外边的410,所以我们的一个下标,那我们再来看一下我刚才的公式e670 对了,还要加上一个死这个地方,再加上我们的5c d c。
这里就只加一个四啊,多加了一个括号就能知道,4611670,我们再把它替换一下,看一下,那么这个e6000 我们替换成我们的公式,就是我们的ec x呃,0f2 c e18 ,再加上2100x4+4。
好那么现在这个地方呢才是我们的青春要大,是这样的这样的一个公式,那么我们再找一下,这个时候找一下ec x看它是不是一个机子,那么这个时候呢我们可以从这个地方来发现的,那么这个e4 x呢,它就是一个机制。
那么当时还是还要考虑的一个问题,就是这个210它会不会变化啊,每一次的时候啊,他会不会改动啊,重启游戏之后,那么我们先把它复制出来,先让游戏跑起来,保存一下,那么我们先退出游戏,那么再重新进一次游戏。
那么进入游戏之后呢。
我们再用ot哈附加一下,读一下刚才这个地址,好那我们现在呢,但是我们还没有打开商店啊,可能的话这个数据量没有初始化,我们访问不到,那么我们先打开这个商店,再用这个公式来访问一下。
那么这个时候呢我们发现了金窗要大啊,那我们看下标零这个地方呢,金窗要小,下标一啊,也就是第二个第三个,第四个,那么第一个我应该是第六个,第七个,那么第七个的时候我们发现了,这个时候它访问不了。
那我们先看一下第七个有没有东西,那么第七个的话应该是这个回程图,我们再访问一下第三口,第三个是人生第四个,第五个测试,第六个开始呢,他就不能够访问了,那么我们移到相应的嗯,把前面的括号去掉。
那么我们看一下它相应的这个列表里面也没有相关的这个数值,那么我们从这个地方的话,我们能够看到啊,12346它都有相关的一个数值,那么只是后边呢我们可以看到这里呢他没有这个数据窗口的这个跟随。
那么这可能是我们o d的一个bug,那么我们先转到这个地方去。
那么转过去之后呢,可能这个地方呢我们才可以访问第七个,这个时候呢我们就能够访问了嗯,然后我们再给它加上括号加5c移到前边dc再加一个括号啊,灰尘-33弦关了,那么这个时候呢我们就可以访问了。
这可以说是我们呃这个og的一个bug啊,这是南明湖的地图,南明洞的一个地图,那么说明我们这目前来看的话,呃,这个公式是可用的啊,直接计算出来就可以了,好的,那么我们把这个公式呢啊标注一下。
那么最终找出来的这个公司呢,就是这个地方,那么它的加四塞这个地方呢就是我们的物品分类编号,好那么我们把它改一下,之前我们把它叫做id啊,现在我们把它就是一个物品的一个类型,啊。
那么下一节课呢我们就可以根据这个公式来来,对我们的整个这个商店里面的这个物品呢进行一个偏离啊,然后呢得出我们具体的一个数值,那么但是从这个公式这里来看的话,它可能也是一个数场啊。
但是呢也有可能就是说我们找到的这个它不是一个真实的一个地址,只是我们现在的测试了,这个偏移呢它没有变,那么也有也有可能我们重启几次游戏之后呢,这个偏移呢它有可能变,那么如果它变化。
那么我们再继续啊用新的方法来分析它,用其他的思路来分析,那么这节课呢我们就先分析到这里,那么这个就是我们的商店的列表,好的,那么这节课呢我们先分析到这里,那么下一节课呢我们在就是说封装我们的这个函数。
也就是上一结构的这个作业,那么我们需要先通过这个列表,先要取得呃这个物品的一个分类编号啊,然后呢我们才能够购买指定的这个物品,那么加加幺六这里面是塑料,这里是物品分类。
当然我们还有一种办法我们可以省略掉啊,呃就是说如果我们把这些分类的物品的类型编号,我们可以提前来把它提取出来,然后呢我们就用不着去建立这个商店里面的这些嗯这个列表,那么我们就直接可以硬编码。
就是把所有的这个列表里面的这个物品类型的,我们自己把它取出来,与这个与相应的这个物品的名字呢关联起来啊,那么这种做法也是可以的啊,只是我们的啊,我们几种方法呢都可以作为一个参考,那么最终你选选择什么啊。
什么方法呢都是可以的好的。
P69:080-遍历商店物品 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们先定一个商店的一个列表结构,然后呢呃偏离我们的商店,把我们的物品分类编号,以及我们的呃物品的名字,那么偏离出来。
那另外还有一个应该是物品在这个商店列表里面的一个下标,如果是没有变的话,应该是ef 4这个地方,你自己的下标,那么我们先用d来嗯加载到我们的游戏。
先做一下哈。
相关的偏移测试。
那么我们再看一下他之前的这个下标的这个位置是多少啊,这个偏移我们可以看一下,参考一下前面的背包的一个分析,1f4 啊,word两个字节对象在背包里边的一个下跌,那么现在呢这里的下标是一。
那么如果我们在这里的数组我们访问啊,下边呢它就是二这两个字节啊,应该是,那么说明这个与我们在背包和仓库里边的这个下标呢,它也是一样的啊,当时说这个是两个字节,但是一个字节它足够用了。
那么我们暂时来就用一个字节来表示,因为这个商店的话,我们数一下1234678 90,它的一个大小的话也是60,相对列表的一个大小,啊,它是它的元素呢一共有60个对象。
那么还有五色这个地方呢是它的一个名字啊,那么我们大致我们只需要这几个就可以了,那么我们再来看一下以前的背包的话啊,它还有一个窗口的坐标,这两个用不到啊,e f4 这个还有一个是数量啊。
数量这个明显也用不到啊,那么我们需要了自己输入要购买的数量啊,因为在商品商店里面的话,它的数量应该都是一对,好的,那么其他的这些属性呢我们都用不到,那么我们接下来呢就打开前面的代码进行偏离。
打开第77课的代码,那么首先呢我们添加它相关的一个机制,那么我们也就是这个物品的这个商店啊,然后他的机子嗯可以说就是这一个啊,这个机制我们可以直接把它计算出来,它也是一个机子在这个地方。
那么前面呢我们啊直接的也可以用在这一串公式来表示它,它的一个机子,然后呢再加四再加410啊,这样算出来的,那么我们也可以直接用这个机制,也可以,好那么然后呢我们再添加相应的结构呃,转到我们的结构单元。
那么我们就在物品背包的后边啊,添加一个相关的结构,那么这个结构呢我们也就包含一个啊,也是呃就是这个背包的对象呢,因为都是同类的啊,他们的这个偏移,那么所以说呢我们就用这个啊背包的这个对象和结构来定义它。
那么在后面的啊,这里呢都是相同的啊,包括这个相应的这个背包的这个函数啊,这些应该都是相同的,那么这个函数呢我们应该也是相同的,get goods index for l,那么唯一不相同的呢。
我们就是要到里面去啊,改变它的机制就可以了,那么首先呢我们也要对它进行一个初始化解题的题,哈哈哈哈,那么它的一个初始化的话,我们就可以仿照前面的它的一个初始化来写背包的一个初始化来写。
那么我们先复制一下,那么复制之后呢,我们可以转到这个背包的啊,初始化函数后边标题道题,那么在这个位置呢我们添加它的一个说明,那么里边的内容呢我们可以照片照搬啊,照搬前面的这一段内容,好复制粘贴下来。
但是我们有的地方我们需要替换啊,一个是嗯这个背包的大小,那么这里呢应该是呃60,我们需要另外定义一个背包的一个大小,那么我们回到结构的头文件,那么在这里呢它的大小呢我们需要重新定义,再回到这里啊。
我们也要需要进行把它的大小来进行改变,那么他的机子也不是我们背包的机子,那么这个机子的话我们需要也需要进行一个改变,bs which shop啊,然后我们需要通过这个公式来来计算出它相应的机子。
也就是在前面这一段,复制一下,他不是,那么首先呢我们取的是这个机子出来,那么取出来之后呢,我们还需要呢,嗯加上我们的后面的这个公式是2100x210 乘以4+4,好那么这样这样取出来。
就是这前面一个括号里面的内容,那么我们还需要再一次加四,那,么加上偏移四,那么加上偏移四之后啊,加到这个四,然后呢再一次啊加上我们的410啊,最后呢后面的都是一样的,那么加上410之后。
后面的这个四乘以a呢,我们在后边呢就是从这里啊取得对象的呃这个机制啊,然后这里我们也要进行一个判断,那么实际上如果我们取出来的某个物品为空的话,这里呢我们就直接可以返回了啊,这里为空的话。
我们就后边呢我们就可以不循环啊,就可以不判断了,那么空呢就可以做一个结束条件,那么这里可以进行一个优化,那么如果在这个地方为空了,那么我们直接来就放,返回this就可以了,那么这里处理异常呢。
我们建议的在用x啊这个呃红外处理,用这个加下划线的这个呢它可以了,抓捕到我们的就是呃只只承担违规的一些呃访问啊,那么这里呢我们也加上调试语句啊,对,344啊,这个地方呢实际上我们用不着啊,啊用不到啊。
但是呢我们多写这样一句了也没有关系啊,c0 f1 ,那么这个地方呢实际上也用不到,那么i d e这里呢我们可以把它改一下啊,这个i d e呢我们叫做物品的分类啊,分类编号。
那么这个我们全部来把它作为一个替换,那么可能这个地方呢才是一个真正的i d啊,这个地方是真正的i p嗯,那么替换成,后来我们先编译一下啊,好偏移的时候已经没有错误了哈,那么我们要呃等一会儿哈。
这里是进行了一个初始化,那么等会我们写段代码,把相应的信息呢我们读出来哈,显示一下,那么再回到我们的图文件,那么这个时候呢我们还需要呢嗯获取它的这个下标的这个函数,我们也需要来定位哈。
然后呢我们才能够取出来,那么这个函数的话我们书写呢呃先跟他为了方便后面方便操作了,我们先跟他加上一个前缀,然后再复制一下,那么再转到啊这个同名的啊背包里面同名的这个函数来转到他的前面。
或者是后面的进行文字,然后我们把上边的这个代码把它复制一下,那么我们看一下还有没有需要改动的地方,那么这个地方呢我们需要它数组的大小不一样,这里是60,嗯比较好,然后再返回。
那么基本上就是这样都是一样的,那么这样呢我们就能够取得某一个物品,它在这个商店列表里面的啊,这个列表里面的一个下标,然后呢我们就可以通过这个下标呢去访问初始化的这个列表,这个商店的这个列表。
然后呢就能够取出它的呃物品分类的编号,以及他的i d啊,也就是作为我们购买物品的一些参数,好的,那么我们再写一个偏离的一个函数啊,用来测试哈,那么在这里呢再写一个偏移的函数。
那么这个函数呢我们就写在啊这个gt indexed for类后面,或者这个get代替后面都可以,那么这样呢主要是显示我们的呃这个初始化的信息来看它是否对,那么我们需要用一个或循环,小于60i加加。
然后呢我们需要来先初始化一下吧,那么如果不初始化的话,我们调用的时候呢,我们就要用这种个体的体质的方式来调用,都是可以的,那么我们这里也可以不初始化,那么直接进行调用,那么首先呢我们要判断。
那么我们先判断一下里面的这个i d这个数字啊,通过这个i d或者是嗯物品的名字来判断一下,那我们就通过,那么这个i d呢实际上我们也要也需要要改一下啊,n d i d。
那么这个i d的话实际上不是i d,那么我们把它取名为物品的分类编号的话可能更好一些,那么这里呢我们也实现一个替换宫殿,都是看物品分类,全部替换,那么切换之后我们看啊编译一下能不能够通过。
这里需要一个返回值,那么偏离完成呢,我们返回true,那么我们对这个物品的编号啊做一个判断,那么如果这个是这个值的话,为空的话,就说明呢嗯我们就偏离了就完成了,就直接返回。
那么如果我们这个相应的这个物品类型的编号它不为零的话啊,不为空的话,或者我们最好是用名字来表示say good night,如果这个名字他都是围攻的话,那么我们就呃就直接就返回,但是我们看一下。
在前面啊,这里用main main city的全部是做了一个清零的一个处理,这好好,那么所以说我们在这里呢才能够添加这样的判断,那么如果他的物品的名字哈,它存在啊,这个地方它不为空。
那么在这里呢我们就可以来对它进行相应的偏离,显示相关的信息,当那,么首先呢我们显示它的一个分类编号,还,好,或者说叫物品类型,然后呢再搜物品名字,那么我们只需要这两个应该就可以了。
当然还有一个是它的一个下标,二,然后这里是物品的名字,然后呢最后是它的一个下标i,啊,那么这个直接啊下标i于它,它读起读出来的这个下标呢应该都是一样的,这两个栏数值应该是一样的,好的。
那么我们再次编译一下,然后测试,那么编译成功之后呢,我们还需要呢在我们的头文件里边呢,把它定义为一个全局变量,那么我们再找到我们的结构,这,三对列,gtr步骤做,第四题。
然后我们再添加到我们的全局变量单元,加上我们的ten,加上这个前缀的修饰符,那么我们解锁了就可以调用它,那么调用的时候呢,我们转到主线程单元,啊这里的除湿掉,那么在之前的啊这些测试呢。
我们就可以先把它初始掉啊,删掉,然后get that,那么我们看一下这个函数的返回值啊,对不对,初始化vs是这,再重新编译一下,看有没有代码,有没有错误,那么我们全局变量单元再引进来看一下。
这里少了少了一个分号,所以说造成我们刚才在这里主线程里面,它添加我们代码的时候呢,嗯它不能够显示出这个指针好,那么再次添加我们的代码,在这里,打印出我们的啊,偏离打印出我们的信息。
那么这次呢我们输入到游戏里面,再重新编译一下。
啊这里也少了一个分号,然后把这里的这个断点呢全部清掉。
然后退出来啊,这样我们输入的时候呢速度会快一些啊,然后我们再注入到游戏里面,这个时候呢我们化解主线程,打开我们的调试信息,查看查看的工具啊,然后我们点测试,这个时候我们可以看到啊。
一共呢有17个啊啊17个物品我们看一下嗯,3663148,那么减掉一个刚好是17个啊,那么所有的物品呢我们都偏离出来的,那么在前面的这些呢就是我们的呃物品的一个编号,65666768啊,6a1 f。
其名doc,但是它并不是说这个物品的分类编号呢,我们可以看到它这个药品的这几个它是哀求的呃,然后人声取原生,啊一延伸哈,这几个人他嗯间隔的距离要远一些,麒麟啊,地图这一类的。
那么我们也可以另外还有一种方法呢,我们就是嗯不骗你,那么直接把这些如果这些物品的类型比较少的话,我们直接可以把他就说硬编吧,就把它全部来把它保存好,然后不去骗你啊,直接就调用这个我们自己写一个函数法。
把它固化起来也是可以的啊,那么固化起来关联起来啊,放在我们自己建一个啊这个列表,商店的一个列表就用不着到游戏里面来来访问它啊,啊因为这些物品的类型的编号的话,它都是固定的啊,都是固定的。
那么愿意使用哪一种方法呢,这个就全看你自己的一个选择,那么这一节课呢我们就讲到这里,那么下一节课呢我们再来来封装,完成我们的这个呃物品购买的这个函数,好的。
P7:018-分析怪物列表_m - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,qq 15033057,欢迎大家参加,预计将技术编程培训,那么今天这节课呢我们一起来分析一下怪物的数码,怪物列表以及怪物对象的呃一些明显的属性。
那么我们啊分析怪物数组的一个思路呢,就是从怪物的对象入手,那么要分析出怪物对象呢,我们就可以从怪物的属性来入手,比如说怪物的名字血量,那这两个东西呢比较明显,但是名字这个数据呢它是啊固定的可能。
而且而且相同名字的怪物的话比较多啊,那么所以说具有一个唯一性的呢,就是这个血量,因为这个血量他在受到攻击的时候呢,它会改变,会改变好的,那么我们打开我们的c e工具啊,那么先呢我们附加到游戏里边。
那么附加进去之后,我们先选中一个怪物啊,那么比如说我们就以这个也是离我们最近的这个怪物能力选中它,那么现在它的一个血量的话啊,是没有变动的,而且是一个固定的一个值。
当然这个值的话它大致在100~2000这个范围之间,所以说我们先搜一下这个范围的数值,收了之后呢,我们再搜一下未变动的数值,啊多过滤几下,然后走上两步,再搜一下,因为变动的数值,那么收了几次之后呢。
我们再对这个怪物来进行一下攻击,那么攻击之后呢,这个时候呢它的数值就变动了,我们搜一下变动的数值,然后呢再收未未变动的数值,应该是当然不知道这个怪物回不回血啊,嗯那么所以说我们在这里呢。
我们再次让他的这个血量改变一下,那么然后呢我们收减少的数值,然后呢再进行一下这个范围的一个过滤啊,最后呢我们收到这几个地方再次对它进行攻击啊,攻击之后减少,我们再搜一下减少的数值。
然后呢这个时候呢他的数字为名额,因为这个怪物呢他死掉了,所以说它的血量没有,那么过一会儿呢应该把这个怪物的数值血量呢它刷新了,那么这个时候我们可以通过它的血量来找到这个对象,附加调试器上去。
那么这个怪物到哪里去了呢,也有可能是这个怪物,那么我们对它攻击了之后呢,我们看一下它产生看到变化产生的变化这个数字啊,那么应该呢就是这个范围就是这个范围,或者说那个怪物被别人拿给消灭掉了。
这个时候数值为零的啊,反正这个怪物是死掉了,卡了之后我把他杀掉的,也可能是其他周围还有其他的玩家啊,把他杀掉了,那么这个时候呢我们可以得到两个对象,一个偏移是五比四啊。
ex加上另外一个呢是1e si加上五比c,它们之间呢相差了一个八的一个偏移,那么我们先看一下哈,后面这个,记一下,这是我们找到的一个机子加五比c,这样是怪物的血量,那么另外还有一个机制在这个地方。
你复制一下,那么这个时候呢我们的e si的质量等于这个啊,它加上的是五比四啊,怪物血量,那么这两个对象的话,我们看哪一个更适合于我们来获取怪物的信息啊,那么接下来的分析的话,我们再搜一下啊。
因为怪物列表的话,他就是怪物的列表,怪物的数组呢它就是用来保存我们的怪物对象的,所以说,这两个对象的话呢,如果他是真正的是对象的话,它就便于我们搜索,这两个数据呢都存放在怪物列表里面。
那么我们再通过它来搜索一下啊,搜索到我们怪物列表的周围,那么怪物列表呢它一般是一个全局的,这两个数据在变,它实际上是堆栈里面,堆栈里面,那么刚才呢我们搜索到的是这两个地址。
但是这个地址呢它也变动了也变动了,我们再重新再扫描一下啊,对八起,那么这两个地址的话离得比较近啊,反正这几个都是机子,我们就先把它记录一下啊,那么另外还有一个就是这个690的这个,那么我们也来搜一下。
那这个呢我没有搜索出七成,那是另外的,可能是在一个另外的某个对象里面,那么这个呢我们暂时先保留,我们先看一下这两个机子里面有没有我们所要的东西,没有我们需要的贡献,这个变化就关掉。
这个数字呢也在不断的变化,这里已经有一个相同的数字,那么等一会呢我们就进去看一下,都进去看一下。
那么打开我们的o t。
那么我们先把oc里面的这个进程呢先取消掉。
再用我们的op附加,那么附加进来之后呢,我们把c里面所找到的这两个地址啊。
先把它记记录一下,是31d,34233,这是第一个,我们在这里看一下,那么这个时候呢我们在这里边呢发现了很多地址,很多很多的地址,那么这些地址的话可能就是我们的外部对象啊,也可能是其他的东西。
那么我们先进去看一下,那么先进入我们的怪物对象,刚才我们加五比四,这里是血量,这是1300的一个血量,我们收到的,那么我们看血量附近有没有怪物的名字啊,应该说这个怪物的名字呢,这个属性它也可能也在这里。
这里有个大概是在31318320左右的,有一个外部的名字,取下三幺几,用dc来显示一下。
那么还在后面365左右再厚1。320,那么从这里来确定的话,我们就是呢它的偏移呢呃就是320,当然是从我们五比四,从下面一个对象和偏移来算,这里面是320,是怪物的名字。
怪不那么如果这个是一个怪物的列表的话。
那么在后面呢这里加四这个位置的话,他也应该是我们的这个怪物的名字,那么我们也可以看到这里是那个大白条的删除啊,就是这样的,那么后面的数组的表现形式的话,这里是乘以i,那么乘以二龙,再看一下,修复三句。
这模型以删了啊,那么乘以三的话,这里呢是我们的那个终极的奇幻书,那么说明这个对象列表里面的话呃,它除了我们怪物列表里,在这个地址来可能是空的,没有东西呃,金刚石啊,这个也是我们汇报里面的物品。
那么说说明我们所找到的啊,这里呢也是一个对象的列表,但这个对象的列表的话,从我我们目前在一个分析来说的话,那么我们再来看一下它这个机子,再在上面我们下一个访问的断点,看一下能不能够找到所谓的基地址。
那么在这里呢我们就能够找到一个数组啊,就是这个31c e740 ,这里一个朝堂,一个朝堂,那么这里的话就是我们的所谓的这个呃对象列表,我们把它备注一下,把这个删掉啊,相遇,那我们先把这个复制一下。
看还有有没有其他的地方。
啊这个地方也有访问ebx这sb c那么1p x的来源呢,我们向上找一下,一bx就是来源来源于这个31c e740 就是来源于这个地方,那么这里我们能够看到的对象没有奇迹。
那么这里是数组的形式。
那么这里呢是直接出现了一个基层,好的,我们删掉这个相应的一个断点。
那么接下来呢我们再看一下啊,另外找到的这个机制是1144av 3。
那么从这里来看的话,里面的对象呢它不断的在变化,不断的在变化,在更新,我们这里可以看到,那么我们进去看一下哈,加上一个括号,进去看一下,我们先用看一下对象的名字,那么在这个地方哈大概也是加320左右啊。
能够看到我们的一个呃大块头山贼,然后我们加上数组的访问方式吧,巨幅山水,二哈这里呢也是大块的创作,三,这里是大骨头,上去是聚不上去,529396,你是怪物七啊,其实这里呢它没有尺寸。
所以我们不到看一下八字,后面都没有了九,那么说明这个地方的话,他全部都是我们的怪物对象,全部都是我们的怪物对象,那么这个呢才应该是我们周围的怪物的列表,那从这个形式上来看来。
可能是所以先这里啊归零的这个地方呢,可能就是我们的机制在这里下一个未成反面的断点,然后断到了e4 x这里,然后看一下e c x这个数字的来源,再让他跑一下,看一下有没有其他的地址,其实他在这里。
他直接就献了一个数组出来,直接献了一个数组出来,也就是这个a88 ,这个地方也就是这里是我们的数据,那这个时候呢它会清零了啊,我先删掉这个断点,让他跑起来,那么这里呢可能才是我们的,周围的怪物列表。
对象列表基础里面放的呢才是我们的呃,那么我们把这个蓝图制下来。
狗子强,那么这个时候呢我们找到两个两个对象,一个是周围的怪物啊,另外一个呢是其他的对象列表,这个内存机子里面呢,但是现在我们分析的是怪物列表的机制,暂时用不上它,先做一个记号。
那么呢这个就是我们的外部的列表的一个机制,我们可不可以把它整理一下,那么整理一下,我们把机子放在前边,加上我们的四神里的下标就行了,它是用ex的代表了下标,那么我们这里来从零开始好。
那么这就是访问到我们的对象。
我一个,那么这第一个对象我们看一下啊,刚才我们分析了加3200这个地方呢是它的名字啊名字,那么还有一个加五四这个地方呢是它的血量。
血量,那么我们把它记录一下。
那么另外还有一个属性呢,这里有个二零啊,它是32,那么32的话代表的恰好是他的一个等级啊,一个极品,那么很有可能的话,这个32就是它的一个等级,那么我们修改一下,看有没有效果,当然现在我们不知道呃。
所选择的这个怪物对象究竟是哪一个啊,那么我们可以先改它的一个名字,看看有没有效果,我第一次来显示一下,对了就是我们选中的这个它的名字就变化了,那么还有一个是我们的等级五比发射地。
看改一下它的本金也没有小30了,啊它的级别也变了,那么说明这个地方呢。
五比八这个地方是怪物的等级。
那么还有一些是怪物的一个坐标来看一下呃,用我们的火点数来看一下,那么我们要看一下当前我们的坐标是多少,2181,那么怪物的这个坐标呢,它也不会相差太多,不错,啊这里有一个坐标,2219。
对了201我们是20181,它是2171啊,这个是负的,那么这个的话就是我们的怪物的,应该是它的坐标了,我们把它记录一下,当然前面还有一个坐标,这里它一共有两个坐标,一共有两个坐标呃,1018。
我这一个让我们看一下1018。
那么这两个坐标呢都是我们的怪物坐标,因为它怪物呢它有两个来回移动的点,可能是它在移动,再看一下日,要求前任要求,哈哈哈,啊是这个怪物啊,它在移动在变化,我们看一下哪一个数值是变化的,你走到他跟前去啊。
21871984,这样这个1984这个离得比较近一点,应该是后面这个这是70啊,我这个是80,啊这个时候怪物的坐标与我们重活19842187,而要放弃,然后985这个是八四。
那么应该是后面一个坐标它离我们比较近啊,啊那就是这两个坐标之间到时候大概是过滤啊,都把它记下怪物的坐标,它有两个可能是来回移动的两个点,一个是1018,是我们的x坐标,还有一个是101c。
这是我们的y坐标,2018,这个是101c,这个是102,点看这个视频,我们再来看一下,这是1020,那么另外还有一个坐标呢,就是我们的加1024g的地方,还有一个坐标是加幺零,rc这个地方。
那么这就是他常用的几个属性,常用的几个属性。
好当然还有一个怪物的一个状态,就是再来看一下它的血量,这个地方,那么这个我们当前攻击的这个怪物来说,是我们刚才感动的那一个怪物,这个才是我们改动的这个快速动的快乐。
那么另外呢怪物应该还有一个死亡的一个状态啊,啊那么这个数值呢我们可以通过c一来搜一下,先移动到它的机子这个地方。
那么我们搜索的时候来看,就从他的机子开始时候,30233c9 ,然后他活着的时候呢,我们就这个时候已经被我们呃杀死掉了,应该呢它有一个状态是零或者是一两种状态,我们就是两个状态之间的一个数字,零和一啊。
这个地方,啊这个时候呢他一般来说呃,再搜一下灵活机的,但是我们不知道它是用一来表示的,是死亡还是用一来表示的,他是未死亡,所以说这一点我们不了解,那么不了解的话,我们这个时候搜一下未变动的数据啊。
这个变动的数值,然后我们攻击它啊,让它死亡之后呢,我们选一下变动的数值,那我们换一把武器,然后死亡之后呢,它这个数呢数字变动,搜一下变动的数值,然后呢再收一个两者之间的一个数字,零和一之间的,好然后呢。
看他有没有复活啊,啊这个就是我们的他已经复活了,那么复活之后呢,这个数值呢它应该是再次变动变动的数值,那么离得比较近的这两个他活着,如果是一的话,那么极有可能就是这两个数字代表它的我走的啊。
然后呢我们的数字之间的再扫一下,f a s和b这两个地方。
当然一个是哪个为零,一个是为一,那我们看一下偏移是多少。
314啊,那我们记一下这个,那么离他很近,这个地方314,那么另外还有一个地方呢。
这个地方离得比较远一点,那么离得太远的话,那么我们说这个可能性就比较低了啊,因为这个我们对象的话它不会太大,应该是不会到这个位置的,不会有前多个字节啊,那么就应该是刚才的这个位置,在314,在这个地方。
那么我们再次攻击它,让它死亡,看一下,好死亡之后来这里就为零了啊,那么所以说这个东西这个怪不得状态,我都的话是活着这个唯一啊。
那么是否,好久啊,那么死亡就为零,那么很多时候我们在攻击的时候呢,我们要判断判断这个怪物是否死亡了,如果这个怪物死亡了的话,我们就对他继续进行一个攻击了啊,继续攻击了,好的。
那么我们今天这节课呢我们就分析到这里,另外当然还有一个对象的一个列表,我们也把它整理出来,这个是对象列表,那这个对象列表的话,暂时我们还不知道啊,那么我们目前所知道的而言的话,好的。
那么我们下节课再编写代码呢,把我们的这个外部的这个属性呢,这些骗你出来啊,怪不得名字血量等级啊,是否是否死亡,这些属性呢我们在编写我们的代码啊,然后呢在把它封装好相应的数据。
P70:081-购买物品函数BuyGoodsForName封装 - 教到你会 - BV1DS4y1n7qF
大家好,我是郁金香老师,那么这节课呢我们一起来完成之前的作业啊,也就是呃书写这个购买物品的这个功能,那么这第一个参数呢是需要购买物品的名字,第二个是购买物品的数量,首先我们打开第八次课的代码。
在它的基础上呢,我们来进行代码的书写。
那么首先我们要做的第一件事情呢,就是添加相关扩展嗯,这个机制展开我们的基础单元,但是我们发现啊,这个发包的这个扩展我们已经有添加了啊。
还有这个参数700的这个我们也有添加,那么于是我们替换掉它,所以这里替换的话,我们需要先放到一个计时器或者是变量里面,然后呢再来调用,参数我们也进行一个替换,好那么我们把它保存好。
那么实际上我们之前的话也有调用这个括号,那么我们可以把这个扩的话单独的封装成一个函数,那么我们先把这一课的内容完成了,后面的我们再来做一些优化啊,呃代码的一些优化,那么这节课呢我们就不做过多的一个了解。
那么首先呢我们来看一下这里呢我们首先要需要添加一个结构啊,因为之前的存存放仓库的这个结构的话,我们这里呢他用不上用不上。
那么这里呢我们需要另外写一个结构,先转到我们的结构单元,在这个仓库啊保存物品的这个缓冲区结构,后边呢我们再定一个购买物品的结构。
那么在这个结构里面的话,我们来看一下啊,主要是这几个偏移呢,我们需要来进行相关的修改,那么我们主要就定义呃这里面的数据。
那么我们把它复制一下,那么首先是加二这个偏移我们需要来对它进行了修改,那么也就是说在他前面呢,我们需要有两个自己的站位啊,也就是要分配一个这个内存空间,占两个字节的位置,然后呢从加二这个偏移这里开始了。
有四次解,那么四次解的话,我们可以用d2 来表示,那么是一个嗯存放的一个指令啊,哒哒哒,指令类型,那么然后呢再加二这个位置来加上这四字节的话,就到了加六这个偏移这里。
那么在这里呢我们需要来表示来购买或者是出售,那么这里我们可以在前面来定义两个红,咳咳那么这两个红呢分别来表示购买出售啊,那么然后呢是零一这个地方,但是灵异的话与这个加六来这个地方差八个字体。
那么所以说我们在这里呢也需要四个字节的站位,那么四个字节呢我们可以定义为d word来站位,也可以用前面的代替四的一个数字来来站位也可以,那么我们这里呢用,这个d word。
那么然后呢再加上我们前面的这里呢,一共341 12,再加上四呢等于幺四,幺四的话恰好了等于16进制的0x1 ,那么所以说在这个地方的话,我们再来定义四个字阶段,第一个word呃,也就是物品的分类编号。
那么在这里呢再加上八个字节,也就是说在它的后面呢再加上啊四字节能才是我们的幺六,所以说在这里呢我需要40几的空间呢来掌握,好那么我们保存一下。
当然这个空间啊,这个缓冲区的空间呢,我们之前的分析的话,它可能是九零个自己啊,16进制的九零,那么在这里的话,我们前面的话才只有16个字节啊,加上这四个字节的话啊,才是ya这么多个知己。
那么所以说在后边呢我们还需要额分配一片空间,那么在这里呢我们同样的用ba类型来表示5p5 x80 ,那么这个空间呢只要大于整体,这个空间只只需要大于我大于等于我们九零个字节了,应该就不会出错了啊。
因为我们就是怕的就是呢后边呢它还有在后边这一块区域呢,有可能是用来做一个啊其他的临时的处理一些数据的啊,那么如果没有这分配这片空间的话,它可能会产生这个数据的一些啊移出。
那么可能会造成一些未知的一些错误,当然这个数额这个结构的最终,大小呢我们也可以通过啊多花一些时间来逆向这个发包的这个函数的,内部呢,我们也能够确定它的大小,那是那样的嗯,会浪费更多的时间啊。
所以说我们在这里的话直接分配啊0x80 个字节就可以了,好那么我们再保存一下,那么这个结构我们分配好好了之后呢,接下来呢我们就来啊工作这个相应的这个函数啊,对它进行一下复制,那么这个函数的话。
我们呢把它封装在我们的这个商店列表里面。
那我们找一下,这里呢是我们的商店列表,那么我们一到这个函数的后面啊,添加这个相应的成员函数,也加上这个绿的前缀啊,作用域的一个限定,然后把这个说明呢复制一下,转到根据估值。
indext for name,那么在这里来添加这个内成员函数的说明,首先给它返回返回一个数字,那么然后我们做的第一步呢,就是通过它传进来的这个呃物品的名字,那么通过这个物品的名字呢。
我们去搜索这个商店领域的商品,看它是否在这个商店列表里边存在,那么我们可以调用前面的这个函数,在这里我们需要再定义一个变量,用来接收返回值,那,么我们通过这个函数去查询。
如果这个整个商店列表都搜索完了之后呢,我们又找到这个名字,那么我们就直接就返回一个数值角,那么如果这个数值它小于零,因为我们的这个下标是从零开始的,如果是小于零的话,就是-1这一类的。
那么我们这里来直接返回,那么如果我们在偏离的时候找到了这个相应的物品,那么这个下标呢它会从大于零大于等于零,那么在大于等于零的情况下呢,我们就可以调用啊下面的这个空购买我们的物品。
当然这里呢我们涉及到扩的一些调用呢,涉及到指针的一些运用,那么我们要加上一个异常的处理,那么在这个位置呢,我们打印出相关的调试信息,如果出现了异常的,那么我们这里呢也返回返回角价值。
那么在这里的话我们也需要呢,呃把我们的,i said send g,在这里我们需要在汇编y啊,定义这个变量,啊啊,那么我们在这个外边我们分配了这个相应的空间的话,呃。
在里边我们就不用分配这个站到这个空间了啊,在这里呢我们就删掉相应的代码,在这里呢我们也给他做一个初始化,因为没有赋值的地方呢,我们都用零来填充,然后对它进行相应的副词,那么首先呢是这个淘宝的一个类型。
那么类型的话在这里呢我们是80092,这个呢表示我们商店和购物的这个指令,那么接下来我们看一下,这是我们的表示购买或者是出售啊,零六这个地方,那么这里呢我们定义了两个相应的红,这个呢表示购买。
然后我们接下来呢是要购买的一个数量,那么这个数量呢来源参参数第兰博,那么最后呢是要购买的这个物品的类型,那么这个物品的类型的话,就需要通过我们之前查询的这个下标来获取啊。
因为我们可以通过这个下标来来访问我们的这个物品列表啵啵,因为这个类型的话在里边呢啊也就是说这个故事type,那么这样的话理论上我们就能够购买所有的物品。
但是我们还需要来把这个缓冲区来传递给我们的这个相应的参数,就是也就是传递给ex,那么前面的这种汇编代码的话,我们就不需要用了,因为它的这个功能的话已经被这一段代码取代调度啊。
那么在这里呢我们首先呢把结构的地址输给我们的一,好,那么我们编译一下,那么在这里呢我们给它添加一个变量,嗯变量的左侧,这里呢给它添加一个类类型,不然它有一个很烦人的一个警告,那么添加之后呢。
我们在这里呢呃转到啊全局变量单元,通过这个商店列表了的这个全局变量呢来调用,转到主线程单元,那么我们这里呢有三个测试按钮,那么呢我们通过它来购买物品,那么比如说购买人三,每次来更为一个或者是两个。
都可以啊,这个数量呢自己来修改,然后我们在测试仪这里的购买金疮医药,那么一次呢就我们两个,在测试三这里呢我们呃看各位什么啊,购买这个密集秘制金疮药,那我们在这里,那么一次呢我们购买三个。
那或者是你去购买一个啊,这个比较贵,那么我们再次编译一下啊,好那么偏移成功之后呢,我们进入到我们的游戏里边。
那么首先呢我们挂接到主线程啊,测试这个时候呢我们看到金窗要小,购买了两个,那么同时它的数量肯定也会变化,这边那么测试二这里我们看到啊人生呢购买了两种啊,这里它的数量呢也会购买一次也会变。
那么测试三的话将会购买这个秘制金创药啊,这里呢他一次呢会购买一个啊,好的,那么我们所有的测试都成功,那么这节课呢我们就讲到这里。
标签:我們,教程,这个,一下,郁金香,笔记,那么,那麼,我们 From: https://www.cnblogs.com/apachecn/p/18441507