【干货】《GTAOL》外挂开发教程04:Hook发包内容(上)
文摘
时事
2025-01-01 18:02
广西
上期教程我们已经讲了关于socket的内容,现在准备开始讲封包的获取和解密方法。在我们解密封包之前,首先需要打印出来,这样我们可以方便地调试。通过hook的方式将封包打印出来可以让我们更轻松地进行调试,而不需要一次次地手动查看。如果我们不将其打印出来,就需要一遍遍地下断点,这会非常不方便。通过hook可以将封包的内容和地址都打印出来,就像我们现在所做的一样,这样就方便多了。我将它打印出来后,就可以进行对比或者复制下来进行分析,这样就会更加方便。接着,我们需要清楚地观察封包的结构,确定哪部分是我们需要解密的内容。这节课的主要内容是带领大家学习如何实现这个hook的代码。我们将学习如何进行hook以及之前使用的几种方式,总的来说,都是比较方便的。最后,我们会使用一种更复杂的方式进行hook,这也是对我们汇编和堆栈知识的一个巩固练习,让大家更深入地理解hook的原理。选择hook的地方时,最好避开函数头部和保存寄存器的地方,因为这样会破坏堆栈导致函数出错。我们尽量选择下面的位置进行hook。在这里,我们首先观察了一下当前的情况。我们可以看到,这里一共有六个字节,他把这个地址的值赋值给了E。我们的目标是在运行到这里时跳转到另一个函数,然后在那个函数里做一些操作。当我们在这里设置断点时,我们应该观察到两个值:波长和包地址。我们需要将这两个值打印出来或者传递给另一个函数,在那里进行处理,并且在完成这个任务后,我们需要执行这一行代码,并且回到原来的位置继续执行。在进入另一个函数之前,我们需要确保堆栈和寄存器都保持平衡,不能有任何差异。这样我们才能实现一个完整可行的hook。我们来看一下,当我们设置了hook之后,我们首先将原来的值改成了十八,然后后面四个字节变成了我们将要跳转的函数的地址,最后还加了一个九零。因为这里有六个字节,我们只使用了五个字节。最后一个字节如果不处理的话,会导致它和后面的字节合并在一起,从而产生新的函数或功能。到时候就可能会出现问题。然后,当我们进入了这个call时,大家有没有考虑到,这个call也需要处理堆栈呢?我们首先需要保存返回值,提升堆栈,并且铺设AD等等。然后,当我们到达这里时,才会去处理上一层的包含和包内容,将其赋值或打印到界面上。这些操作也会影响堆栈。所以,大家在这里要考虑到这些问题。此外,基本上就是我们讲的一样。最后,我们将这个东西传给ESR,然后ESR再读取一层,传给了ESR,最后返回出来。COP D和PUSH AD用来保存寄存器的值。我进来时,将其加入到堆栈中,然后在离开时将其弹出来,没发生任何变化。然后返回,这样就完成了一个完整的hook效果。我们可以看到,每走一步,包含和包内容都在更新。这就是我们达到的效果。到这里,你们可以用自己的方式来复刻这个过程。如果你觉得自己能够实现,我建议你先用自己的方式尝试一下,然后在下期教程中,我们会拿出代码给大家看,看看我们是如何实现的。然后,你可以用你自己的方式来对比一下。应该是你们那种方式更方便更好。这种方式相对比较麻烦,但也考验基本功。你需要对对战和寄存器等有一定的了解,才能避免各种问题。否则,调试起来会很复杂。这些内容我们下期再讲。大家可以自己试一试。本期教程就到这里。