这是我第一次询问关于SE的问题,我会尽力提供所有必需的信息,但是如果我不清楚的话,我会提前道歉。

我很抱歉试图对某个格斗游戏进行逆向工程,以便能够“手动”进行移动。我的意思是说,通过快速按下键盘上的SAJ键可以执行某种强力动作,我希望能够跳转到在代码中使用该动作的方法而无需按下键。 >
到目前为止,我已经尝试使用CheatEngine和OllyDbg搜索与移动名称匹配的字符串,还查看了执行移动之前,期间和之后更改的值,但似乎都没有做任何事情。

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

在发布之前,我曾寻找过与此问题类似的问题,但似乎找不到任何有帮助的问题。如果这是以前发布的内容,而我只是错过了,请对此表示抱歉。

感谢您的任何回答。

评论

您尝试过键盘模拟器吗?我会尝试在游戏之外模拟这样的事情。

“我希望能够跳到使用该代码中的移动方法而不必按下键” –您不会说要在什么条件下跳到该代码?

抱歉。我的意思是我想跳到只需要按一个按钮,而不是快速连续三个或三个以上的按钮来使用该移动的方法。

我同意@ws,只是在游戏外使用键盘宏进行操作可能会更容易

在作弊引擎中有一种方法可以使用->内存视图->工具-> Ultimap来执行运行所需的功能,以移动它记录游戏使用的所有功能,而只是不断过滤结果,直到获得几个,例如10或20。然后您手动检查每个功能,看看您需要哪个功能

#1 楼

考虑到这是RE论坛,这就是我要找到的函数的方式。


在输入处理代码上放置条件断点。根据游戏的不同,它可能来自诸如getchar()之类的东西,也可能是在Windows消息循环中处理的(假设您提到过OllyDbg,此处假定为x86 Windows)。
断点的条件是输入数据等于'j '。您可能会很幸运,并在反汇编中找到“ j”或“ J”的cmp / jmp(或类似)序列,然后可以在此处设置一个正常的断点。
运行游戏并执行组合
当击中断点时,您可以单步执行并跟踪被击中的call语句,其中之一很可能就是您所关心的功能。 >

评论


感谢你的回答。我会试一试,然后再回覆您。另外,我正在使用ollydbg运行x64 Windows。请原谅我的无知,但是olly不能在x64窗口上工作吗?我没有意识到这一点。

–SplitHorizo​​n
15年10月28日在16:37

没关系,我只是回答了我自己的问题。可能应该更认真地阅读olly网站。 :/

–SplitHorizo​​n
15年10月28日在16:42

#2 楼

假设此游戏比8位控制台游戏复杂,恐怕会钩住getchar(),类似的游戏对您没有多大帮助。

使用Windows窗口/全屏游戏时,输入会被在通常情况下,是在消息循环中处理窗口消息。在这种情况下,每个窗口都有其自己的消息处理循环,在这种情况下,它经常调用GetMessage()来接收它应该响应的事件,例如按键。 GetMessage()的第一个参数是指向MSG结构的指针,将其从队列中删除后随下一条消息一起填充。

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


GetMessage()
MSG

消息循环,您可能会遇到一个中等大小的开关箱,处理不同的消息类型。该开关箱应读取GetMessage结构的PeekMessage成员,以获取属于键盘的消息类型。最普遍的是:


类型,您应该与要查找的功能非常接近。这种情况很可能会花几行代码来进行参数准备,然后调用您要查找的函数。