【干货】如何开发一款游戏修改器?14:明文CALL

文摘   游戏   2025-01-07 00:01   广西  
那么,关于分析线程发包的话题,我们在上期教程已经谈论了一些关键点。但是,如果我们要跟踪调用层次比较深的情况下,可能会花费很多时间。不过,还是有一些捷径的。因为多线程发包需要一定的同步手段,这可能会提供一些突破口。
首先,同步手段可以是一个突破口。你可以在网上查找一些现成的同步锁、临界区等,这些都是常见的同步手段。Windows 提供了一些相关的 API,比如事件、信号量和临界区。但是,我们在这里只是简单地提及了这些,暂时不深入讨论。
另一个突破口是数据传递。在多线程之间传递数据时,数据本身可能是一个突破口。这些数据可以是容器中的数据,也可以是其他形式的数据。临界区的使用也非常普遍,你可以查找相关的 API,比如进入和离开临界区的函数。
虽然我们暂时不打算使用这些手段,但是在遇到困难时,它们可以作为一个备选方案。现在,我们还是先按照上一节课的思路来进行分析。我们假设铭文库有一个缓冲区地址和一个包大小,并尝试跟踪两层调用。我们会记录下使用到的库,并查找这两层库中与我们假设相符的参数。至少,我们期望找到一个缓冲区地址,虽然包大小可能在缓冲区结构中。技能库和物品使用库应该都会调用到这个功能,但也不能百分之百确定,至少有一个大概率。
在本期教程中,我们将着重关注物品的使用情况。在物品使用的分析中,一个关键点是 E4X 对象。这是我们需要重点跟踪的对象。同样地,在处理技能的时候,比如使用技能的时候,我们也要关注类似的对象。
现在,我们先来看一下物品使用的情况。我们已经记录了上期教程中物品使用率的一些信息。我们现在找到了物品使用的代码段,并进入查看。在这里,虽然它们都是从同一个地方进入的,但实际上它们是不同的物品,并且它们的虚拟函数被重写,指向不同的代码段。
我们现在的重点是跟踪 E4X。它存储在 1BX 中,我们需要记录下这个对象的相关信息。在这个库中,我们注意到没有参数传递,所以我们不需要记录。然后我们继续往下走。在这里,我们可以看到只有一个参数传递,可能是指随机动画,可能是指门。我们再继续深入查看。在这里,我们看到了很多参数传递,有一个字符串,可能是指随机门的传送。
我们需要深入进去,因为这个库有两个参数传递,看起来比较像我们之前描述的情况。我们继续往下走。在这里,我们看到了两个参数,但这个层次比较深。我们需要继续跟进,因为这个库有两个参数传递,看起来符合我们之前的描述。
在这个过程中,我们需要注意传递的字符串可能是发给服务器的参数之一。其中一个参数可能是缓冲区,而另一个可能是字符串的长度或者包的大小。如果这些参数符合我们之前的特征描述,那么这个库调用的地方可能就非常多了。
首先,我们来检查一下调用这个库的地方是否非常多。在这个库中,调用该框架的地方只有 17 个。因此,看起来虽然不是特别多,但我们还是继续向下查看。接着,我们看到另一个库,它也有两个参数,并且复活了。但是这两个参数都是地址,可能是指包大小,但一般不会太大,最多几百个字节。因此,虽然它看起来像是符合条件,但可能并不是我们要找的。
我们继续往下走,查看这个库是否有更多的参数。在 return4 函数中,我们只看到了一个参数,因此这个库也不符合。
我们继续往下跟,但到目前为止还没有发现比较可疑的地方。在我们的重点关注之后,这个破好像结束了。我们跟进去看了一下,虽然有两个参数,但没有发现包含可疑代码的地方。我们看到了 EDX 加零,这表示我们即将返回上一层。在这个过程中,我们没有找到可疑的代码,所以我们需要重点跟进查看。
继续往下走,但在一个函数中,我们只看到了一个参数,所以也不是我们要找的地方。我们把这个地方标记为 pass。在接下来的搜索中,我们发现没有更多的可疑地方。这是一个遗憾。所以我们暂时将这个地方标记为 pass,如果没有找到,我们只能重新开始搜索。
下一次跟踪时,我们放松一点,将跟踪的层次放到两层左右再重新搜索。在这次跟踪中,我们要注意对象的相关访问,因为对象可能包含我们需要的信息,比如技能或物品的 ID,但也可能不包含。这个可能会比较困难,但我们需要继续努力。
首先,我们从这个库中查找对象的进入点,然后看看1EX加四。我们先跟进两层,这是第一层。如果在第一层找不到,我们就不必继续跟进了,直接跳过。这个地方我们要做标记,就是说我们不需要关注了,直接跳过。
我们继续向下查找,但这个地方马上就要返回了,所以我们应该重点分析这个。我们之前已经查找了前面的库,虽然看起来比较像,但它并没有经过这里。这个扩展看起来可能更符合要求,因为它的 ESI 是包的地址。我们给这个地方做个标记,或者设置一个断点,然后返回到 EIP 这个地方,重点跟进。因为其他地方我们基本都已经分析过了。
在这个地方,我们找到了一个 ESI,它写入了一些数据。我们可以高亮显示一下 ESI,看看它写入了哪些数据。我们向上找,看看写入的数据的大小。这里只有一条写入数据的指令,它的大小是多少,就是我们要找的包的大小。
接下来,我们需要进一步分析。我们先复制这段代码,然后写一个测试来验证。我们怀疑这段代码就是我们要找的,所以我们先测试一下。我们先写好这段代码,然后测试一下,看看是否能够控制服务器。
当然,在我们测试完成之前,这只是一个猜测。我们要测试一下,看看这段代码是否真的能够实现功能。至于后面的库是否有用,我们也需要测试一下才知道。
接下来,我们将这段代码复制出来,用汇编的方式写一下。然后在代码注入器中进行注入。代码注入器很容易使用,我们只需简单复制粘贴。在写汇编代码时,记得在字母前加上一个零前缀。然后我们找一个代码注入器来试一下,将汇编代码注入进去。我们认为这段代码可能是我们要找的,但需要测试验证一下。我们先写一段测试代码,然后注入到代码注入器中进行测试。
首先,在我们的堆栈上分配空间,我们使用了 SUB ESP 指令,开辟了 100 个字节的空间。使用完之后,我们需要进行清理操作。我们使用了 ADD ESP 指令,将堆栈指针加回去 100,这样就完成了凭证的释放。
在分配空间后,我们需要给这个空间赋值,将其指定给 ESI 寄存器。实际上,这个空间只需要两个字节,但我们分配了 100 个字节,这是因为我们只能分配大的空间,不能分配小的。这样写完之后,我们将代码复制到代码注入器中。然后我们尝试注入,但好像没有成功。我们再看一下我们的代码,看看是否有问题。
我们写了两个字节进去,然后看起来没有问题。接下来,我们在某个地方设置了断点,以便进行测试。如果这确实是明文发包的话,那么使用第一个物品时,它应该会经过这里。我们尝试了一下,但好像没有经过那里。我们可能需要再跟一下。
在移动时,他经过了这个地方,这也是一个可能的地方。我们把后面这个括号加上试一下,这也是可能的。前面那个可能是主包,后面这个可能是压包法宝或者明文发包的。我们再次运行,但好像仍然没有反应。
我们需要搜索一下常量,如果这确实是明文发包的话,调用地方应该很多。我们搜索了一下,发现了 254 个调用了这个库的地方,这说明他有一定几率是我们要找的明文发包。
然后我们继续分析,看看是否能够成功。我们再次尝试注入,但好像还是没有反应。我们取消了所有断点,然后按数字键 5,但好像还是没有反应。可能是因为掉线了,我们退出游戏再试一下。
重新进入游戏后,我们重新注入并尝试点击窗口,这次调用成功了。我们再次尝试注入,并点击窗口,这次也成功了。我们删除了后面的一句,然后再次注入并点击窗口,也成功了。这说明后面的那句代码似乎与结果没有关系。
总之,我们现在还没有对后面的那句代码进行细致的分析,所以不太清楚它的作用。如果这确实是主包的调用,那么我们的推测应该是正确的。我们尝试写入数据包,这个包的内容是 2700。
如果是主包的话,那么在使用物品或者回城的时候,很可能会经过这个地方。当然,并不是绝对的,因为不同的游戏有不同的机制,我们只能说是有一定的概率。我们可以查看一下调试信息,这个游戏肯定不止 200 多个法宝,如果这个地方是主包的话,它也应该是其中之一。当然,还有其他的可能性,比如可能还有其他的法宝,包括物品等等。我们给它标注一下,暂时称为铭文包零一,因为可能还有其他的铭文包。
我注意到在走路的时候好像也会经过这里,我们尝试按下键盘上的数字键 1,他应该是打开了一个叫做七侠镇的地方,然后我们点了四级松鼠,应该会发包。我们看到断在了这里,这里有两个参数,一个是包的缓冲区,一个是包的大小。这个包的大小应该是随机的,这是一个地址,也可以叫包内容地址。然后我们记录下这个地方,看起来这个包的结构相当复杂,里面有很多偏移的数据,来确定传送到哪个地方去。我不打算详细分析这个结构,因为它比较复杂,我们本期教程没有时间去分析它。
我们只是做了一个例子,基本上能够确定这个东西是发包的。我们让它跑起来,然后再试一下攻击怪物,选中怪物好像也会经过这里。不过,进入这个包里面的六个字节的话,如果是移动的话,这六个字节应该表示的是什么呢,暂时还不太清楚,我们暂时给它标注一个问号。
这个地方究竟要做什么,我不太清楚。让我们找一个更清楚的地方来分析一下。比如说,当我们打开背包的时候,也会向服务器发送指令。我们可以试着运行一下,穿上一双鞋子再来试一下。点右键看一下穿上这双鞋子的时候,有四个字节的指令。这四个字节可以分成三部分来看。第一个部分可能是指令的偏移量,两个字节,可能表示物品。第二个部分是一个字节,不太清楚是什么。第三个部分有四个字节,可能是背包的下标。我们可以尝试换一个格子再来使用,看看是否能够更清楚地理解。
当我们换到其他格子时,例如使用传送符,他打开了一个不同的界面。我们可以看到在这个界面中,使用的物品的下标从零变成了三。这个变化说明了这个值可能就是背包的下标。
接下来,我们再来看看其他类型的物品,例如药品。药品的使用可能会有不同的指令结构。我们可以看到,前两个字节可能表示指令类型,但第二个部分的含义还不太清楚。接着,还有两个字节的内容,但是它们的含义也不太明确。
这个情况可能是因为不同类型的物品有不同的指令结构。我们可能需要更多的测试,尤其是对于补充血量的药品来说,因为它们有不同的种类,而每种药品可能有不同的指令结构。这样我们才能够更清楚地理解这些指令的作用。
总的来说,尽管我们还需要更多的测试和分析,但至少我们已经对整个框架有了一个大致的了解。我们可以确定这个包是用于随机传送的,并且可能还具有复用的功能。
比如说,药品的使用都遵循着相同的主体结构,只是在结构中的偏移数据有所不同。那么,我们该如何还原这些结构呢?我们可以在后续课程中进行更详细的讲解。今天,我们先确定一下铭文包的位置,然后就到此为止。关于这些结构的细节,我们需要更多的道具和时间来进行测试和分析,才能完全理解它们的作用。
举例来说,我们已经能够确定一个背包下标的含义,这经过了两轮测试的确认。至于'B'和'D'这两个未知的数据,我们暂时还不清楚它们的含义。但是,通过测试我们已经可以确定它们可能是一种类型,而不是简单的物品。可能性较大的是,它们与装备相关。因为在使用物品时,我们发现包大小为十个字节,这暗示着我们需要更多的测试来了解包的内容。
因此,本期教程我们就到这里,下一期我们可以先准备一个大一点的账号,看看里面是否有更高级别的、更丰富的道具。这样我们就可以使用这些账号进行更主动的测试。如果大家有问题,可以随时提出,在后台留言,我会尽快回答。


暮色的狐
这是一只高强度上网冲浪、高质量输出内容的狐狸。主打ACGN杂谈、技术干货分享、第九艺术鉴赏、网梗百科解析、情感树洞鸡汤、正能量价值观~
 最新文章