如何在游戏中强制运行由一系列键触发的方法?

逆向工程 职能
2021-06-11 15:16:39

这是我第一次在 SE 上提问,我会尽我所能提供所有必需的信息,但如果我不够清楚,我会提前道歉。

我正在尝试对某个格斗游戏进行逆向工程,以便能够“手动”运行这些动作。我的意思是,假设通过在键盘上快速按下 SAJ 来运行某个强力移动,我希望能够直接跳转到在代码中使用该移动的方法,而无需按键。

到目前为止,我已经尝试使用 CheatEngine 和 OllyDbg 来搜索与移动名称匹配的字符串,并且还查看了在执行移动之前、期间和之后更改了哪些值,但似乎都没有做任何事情。

我对汇编语言比较陌生,但对 c++、c# 和其他语言有相当多的经验。

我在发布之前寻找了与此类似的问题,但似乎找不到任何有帮助的问题。如果这之前已经发布过而我只是错过了,那么抱歉。

提前感谢您的任何答案。

2个回答

考虑到这是 RE 论坛,这就是我找到该功能的方式。

  1. 在输入处理代码上放置一个条件断点。根据游戏,它可能来自 getchar() 之类的东西,或者在 Windows 消息循环中处理(假设这里是 x86 Windows,因为你提到了 OllyDbg)。
  2. 断点的条件是输入数据等于'j'。您可能很幸运,在反汇编中找到了“j”或“J”的 cmp/jmp(或类似)序列,然后您可以在那里设置一个正常的断点。
  3. 运行游戏,并在键盘上执行组合。
  4. 当断点命中时,您可以单步执行并跟踪call命中语句,其中之一可能是您关心的函数。

假设这个游戏比 8 位主机游戏稍微复杂一点,我担心 Hookgetchar()和喜欢的游戏对你没有多大好处。

对于 Windows 窗口/全屏游戏,通过处理窗口消息接收输入,通常在消息循环中。

在这种情况下,每个窗口都有自己的消息处理循环,它不断调用GetMessage()接收它应该做出反应的事件,例如按键。GetMessage()s 第一个参数是一个指向MSG结构的指针,它在从队列中删除下一条消息后填充该结构。在这里的消息循环例子,这里GetMessage()文件,终于在这里MSG结构文档。

在这种情况下,您应该在以下位置放置断点:

  1. GetMessage
  2. PeekMessage

在您进入消息循环之后,您可能会遇到一个处理不同消息类型的中等大小的 switch-case。该 switch-case 应该读取属于键盘的消息类型MSG结构message成员。最常见的是:

  1. WM_KEYDOWN
  2. WM_KEYUP
  3. WM_CHAR.

一旦您找到处理这些类型的案例,您应该非常接近您正在寻找的功能。这种情况很可能会为参数准备的代码做几行,然后调用您正在寻找的函数。