在函数钩子中调用游戏的函数

逆向工程 艾达 拆卸 视窗 C++ 函数挂钩
2021-06-23 09:44:41

如何在函数钩子中调用游戏函数?

比如我hook了winsock的recv函数。然后,我检查了一个数据包。这个数据包有我当前的hp值。我检查了 hp。如果它低于恒定的 hp 阈值,我将调用一个游戏函数,该函数使用一个项目来治愈我的 hp。是否可以在不使应用程序崩溃的情况下调用该游戏功能?

我尝试在调试器中观察它调用使用项目的游戏功能的执行情况。但是,它会使应用程序崩溃。我想这可能是因为寄存器?顺便说一句,堆栈很好。

我想知道为什么我在 recv 函数内部调用 winsock 的 send 函数时没有崩溃。但是,当我调用除发送之外的游戏功能时,它会崩溃。是因为我在不同的模块中吗?或者你不能在不同的模块中调用函数?但是我在调​​试器中跟踪了执行过程,当执行使用 item 的调用时,它确实转到了该函数。请帮帮我。

2个回答

问题是游戏的函数通常只在某些情况下才会被调用。如果您在函数未准备好时调用该函数,则游戏状态可能是错误的,您可能会遇到崩溃或其他意外行为。例如,在正常的代码流中,调用者在调用函数之前准备了一些对象,但你不这样做。

用如此有限的信息很难说出确切的原因,但我建议您在正常游戏流程中跟踪该函数的执行情况,而不是从钩子中调用它并查看它们的分歧点;也许您可以弄清楚如何修复它以使其表现相同。

除了 Igor 的回答,我想建议另一种方法:

如果您尝试调用的函数确实需要一些额外的准备工作、全局游戏状态变量的特定条件等。对您尝试调用的函数进行逆向工程并实现修改和状态更改可能会更容易你渴望自己。这可能就像找出您的角色结构的内存位置并使用您自己的代码修改健康参数一样简单。

需要考虑的另一点是,您尝试调用的函数设置的状态和条件要求可能比仅传递正确的参数更复杂。例如,它可以期望全局变量被初始化,这可能只发生在游戏的后期阶段。

最后,您可能有一个与您处理接收到的消息的方式相关的错误,并且在这些消息到达时对游戏状态有隐藏的假设。编写验证预期条件的仔细代码既可以帮助您诊断手头的问题,也可以通过避免在错误情况下调用来修复它。