本期教程我们继续探讨秒杀功能,也就是秒杀敌人的功能。在之前的课程中,我们已经找到了角色对象,包括当前的血量和蓝量。虽然我上期没有详细讲这个角色对象,但实际上,在上期教程中,我们已经能够看到它的作用。我们提到了一个死亡调用(call),这个死亡调用传递的就是一个对象。它传递的是什么呢?就是我们基地值加一零的值,再减一个二零。这个调用传递了一个对象,而RCX代表的是传递的对象。如果我们传递敌人的对象,那么RCX就代表着敌人,我传谁的对象就杀死谁,明白吗?本期教程我们来讲一下周围遍历,这是秒杀敌人的重要一环。我们需要把所有的敌人都找出来,然后获取每一个敌人的对象,再调用一个函数直到把所有敌人都杀死。这样我们就实现了一个秒杀敌人的功能。那我们就来谈一下周围遍历,周围遍历怎么找呢?我们可以通过对象来进行下一个访问,但是我们不能用自己的对象,因为我们自己的对象有一个专门的访问。如果我们访问自己的对象,很有可能就找不到其他的敌人。但周围遍历肯定是包括我们自己的对象的,所以我们要找一个怪物出来,用怪物的对象来找到这个周围遍历的结构。那么怪物的对象怎么找呢?我们上期教程已经找过了,我们可以通过怪物的血量来搜索。首先,我们进行C1未知初始值四字节首次扫描,然后打一下怪,看看数值减少了多少,再次扫描。再打一下怪,再次扫描。这时候,我们会看到一些值减少了,我们选择其中一个试一下,看看血量是否减少。如果是,我们就确认了怪物的对象。怪物的对象通常它的偏移和我们人物的血量偏移一样,是一个3528。我们可以下个访问来看一下。我们首先进行断点读取四字节,同样也是在这个位置 IX 加 1150。这里面是不是就是一个 3528 的 RCX 地址,因为我们已经确认过了。那就是这个地址吗?是这个怪物血量的地址吗?我们减去 3528,得到了他的对象。然后,我们在这个对象的地方进行下一个读取,八字节直接就断了。我们来看一下 R13,R13 是多少啊?是 14FF50C零零 啊,和我们的对象地址是一样的啊,是 E4FF50C零零。然后,我们就往上追,是不是来自于这个 24 呢?
每端这个呢是来自于 RAX 减一个二零,就是这里啊。这里好像访问的是我的对象诶。那我们在这里下个断点,看一下 IX 现在是这个运行运行啊。这里呢是一直变动的啊。要不就是上一口传进来的 IX,最后来源于上一个传进来的,要不就是呢,我这里底下肯定会有一个循环来看一下。看一下这个箭头有一个向上的跳转吧,回车啊,都到这头部了。好像没把我们给包裹进去,难道真来自于外面?我们刚刚看的是这里啊,那我们就往上追嘛,他没把我们包裹住,那就是来自于外面嘛。
我们在这里呢下个断点,IX 来自于这个 call。这个 call 呢,我回车进去了,你会发现和我们找对象的一样,来自于 IX 来自于 RCX 加一零,然后到外面注意 RCX,RCX 呢来自于这个叫什么这个数组,下个段 R9,R9 是什么?R9 是一个地址,然后呢 RAX 呢是一个三,那就是 IX 是一个索引吗?我继续运行看一下 R9 变不变,R9 是不变动的,那说明了我们刚刚看的,不管是我的对象还是这个沙袋的对象,还是好啊,这个出来的 IX 呢就是这里啊,这个 call 出来的 RCX 呢一直变动的都是来自于这一个 R9 是不是来自于这个 R9,然后呢加索引乘以八,是不是?那这个 R9 呢我们来看一下啊,嗯,他是一个非常大的一个数组啊,那我们再来看一下吧,IXIX 呢是来自于 R8 加 R8 乘以 3 啊。
从这里也可以看得出啊,这个 IX1 开始是一个三,然后呢,运行是六,运行是九,运行是 C,他是每次加三。说明什么呢?说明我们这个每一个子就是什么,这叫什么子成员的大小呢?就是说这个数组的子成员大小呢是一个幺八这么大。是不是是一个 R8 吗?R8 1 个二加 R8 是不是 R8 乘以乘以一个三?如果是从零开始的话,是不是就是啊直接加直接就是怎么说呢?零开始啊,那就是第一个嘛。如果是一呢,一是一个三三,再乘以一个八,是不是一个幺八?幺八这么大,那我们就指向这个嘛。这是幺八这么大啊,我们这里所说的幺八,这里看着啊,加幺零是不是这三行?当然当然了,这是从零开始的,所谓的幺八就是到幺零,然后呢这么大这么大,占有八个字节,那我们就来看这个嘛,然后再减一个二零,是不是是不是一个对象很熟悉吧?那我们只需要追一个 R9 了啊,现在追一个 R9,是一个啊我们索引就没有必要追了啊,它是从零开始的,那就是一个 I 嘛,I 乘以一个啊乘以一个八,然后呢再乘以一个三是不是啊乘以一个三,再乘以一个八,那现在我们就缺一个 I9 缺一个 R9,R9 呢我们往上追,来自于 RS R 加第八是不是这样的?RSR 呢我们继续往上追,直到追到极低值来自于 RCX 再给你下个段为上一层对账回车,RCX 呢 RDR 下个段啊,DR 看一下 DA 加 B8 是这里吗,是不是这里我们看一下不就这个 B8 进去,然后呢再进一个进一层啊确实是一个对象啊,那就对了啊。我们继续往上追,阿D啊,这是啥?啊这不会断啊,RSP 加 A0,往上追,RSB 加 A0 好像是一直都没有看到啊,没有看到,我们只能到起始位置了,RSP 啊减六零,我这个是加 A0,A0 减六零是一个 4040,那我们继续减啊,减了一个 1030 了,然后呢再减一个 12020 了,再减一个 1010 了。幺零呢再减一个加八了,加八那就是什么 RSP 加八,ISP 加八呢?这里呢 ISP 呢给了 RX,那就是 RX 加八,那就是来自于 RCX,那我们下段继续,RCX 来自于 23,来自于 r ex,下个单看一下啊,还是这个地方啊。进去 F7F8 运行到 return 减号,RS 来自于这个 call 加 130 的这个 call F7 F8 RCX 加 158 啊,没有出现 RX 啊,继续运行,RX 来自于 RCX 加一零,return 出去了,按减号啊,RCX 加一零,然后呢减号 RCX 加 158,那就是 RCX 加 158 加幺零减号,减号出去啊,继续追 RCX 啊,IEX 减二零,我们先出去看一下 F7F8 RX 啊减二零,IX 是这个减二零诶,这不是我人物对象吗?然后 RCX 是我们的人物对象,然后进这个 call r c x 加 158,那就是人物对象加 158,到这里来 158 呢,然后呢还要加一个幺零,那就是这里,那是不是就是一个啊?我们人物对象回到我们刚刚写的数组这里来啊,是不是就是一个我们人物对象加一个 158 加一个一零的值加一个 B8 呢,是不是这样的?我们来看一下啊,到 B8 的地方看一下哦,我们人物对象没有给它值啊,那我们就复制一下嘛,人物对象是这样,是这个啊,这里呢就是数组的起始位置,那是不是呢,是不是要看什么地方?看我们找的这个地方啊,我们这个 R9 是来自于 RSR 加 B8,在底下呢 RSR 加 C0,他俩干了什么呢?RCX 减 R9,得到了一个相差的值,然后得到了这个相差的值呢,给了 RCX,这是什么意思呢?其实他是在算他的这个结构的大小,这个 R9 呢也就是我们这个 B8 的地方,就是这个箭头打的地方,然后呢 C0 呢就是我们加八的地方,也就是这个地方他两个相减再除以一个 RC 就是除以一个三,是不是就是啊得到了我们的这个啊这个数组的大个数成员个数是不是,其实这个这里的大致意思就是这个意思,他只是为了获得一个 R8,R8 和 RDX 进行对比吗,看到没有,RTX 是最终获得出来的值。是的,如果 R8 比这个 RDS 大,这个数组就结束了啊,这应该又有一个循环啊,那么我把这个对象给消除掉,这个怪兽的对象给消除掉,清楚啊,看一下啊,现在是一个 BB790,我清除,BB790 变成了什么,最终结果变成了 BB778 了。七八和九零相差多少,是不是一个幺八?我说这个数组成员数大小是不是一个幺八,所以说他现在要拔了,但是它返回的并不干脆啊,可以看到他我召唤一个变成了 790,但我清楚的时候呢,它又变这么大了。然后呢慢慢的又会变成 778,是不是,所以说我在我的代码里,我没用这个结构啊,我用的是其他的结构,那这里呢确实是一个结构,确实是一个可以用的结构啊,我们把这个公式给写一下,它的公式是这样的,人物对象啊,就是这个是不是角色对象,然后呢加一个 580,加一个一零,加一个 B8,加一,然后再加一个,就是算我们每个成员数的地址了,然后呢还要加一个幺零啊,他是在我们幺八的地方进去,然后呢加一个幺零,是不是要您才是我们的对象,然后呢每隔三个啊,这是第二个了啊,这个是第二个了,然后呢再加一个一零,是不是这样,然后呢这是第三个,第三个了,再加一个要零,这又是一个对象了,是不是这里啊看头部就知道是一个对象嘛。我们的所有对象,这里呢都是一个像非常像一个 id 的东西啊,具体是什么东西我们不知道,所以说呢要加一个幺零,这样得到了我们子辰元素是不是,不应该这样写啊,应该这样写,这是一个数组的起始位置,然后呢,森林呢是一个结束位置,然后呢数组的起始位置我们可以放在这里,数组的起始位置啊,加 RI 代表的是什么呢,I 等于是一个索引,下标啊,从零开始,啊这里还要减一个 200X20,然后呢这里呢就是一个数组成员数啊,数组成员数不是数组成员数,是数组成员在搞什么,啊从零开始,然后呢它数组成员的大小呢,就是什么 I 乘以三嘛,再乘以八,就是一八,这么大小啊,这个就不写了,还有什么呢。看一下啊,那数组成员数呢我们是要求一下啊,我们 for 循环循环这个数组的时候,I 是有的,但是呢我们没有一个和 I 对比的一个东西,这个东西呢就是一个数组成员数了,数组成员数怎么算呢,不就是结束位置吗,减一个起始位置,然后呢再除以一个除以一个三吗,是不是一个 3÷1 个三,除以一个幺八,是不是除以一个幺八,然后呢得到了一个数组成员数,啊我们通过这个数组成员数啊就能写一个 for 循环了,然后和 R 进行对比,然后呢 I 加加,然后一直循环,一直循环得到了每一个数组的成员,也就是我们周围的对象,是不是,啊那本期教程就到这里了。