我正在尝试修改游戏(Fallout New Vegas)以在窗口失去焦点时不显示暂停菜单。我想到了两种方法:
找到焦点更改时调用的代码,并 nop 显示暂停菜单的调用。
找到确定游戏是否聚焦的代码,然后确定
已经有一种可靠的方法可以在运行时修补游戏的可执行文件,但是我不确定在游戏失去焦点时找到调用代码的最佳方法。
我尝试使用作弊引擎来查找代表游戏是否聚焦的变量,但是在检查变量周围的代码时,我找不到任何调用菜单打开的东西。
关于如何解决这个问题的任何想法?
我正在尝试修改游戏(Fallout New Vegas)以在窗口失去焦点时不显示暂停菜单。我想到了两种方法:
找到焦点更改时调用的代码,并 nop 显示暂停菜单的调用。
找到确定游戏是否聚焦的代码,然后确定
已经有一种可靠的方法可以在运行时修补游戏的可执行文件,但是我不确定在游戏失去焦点时找到调用代码的最佳方法。
我尝试使用作弊引擎来查找代表游戏是否聚焦的变量,但是在检查变量周围的代码时,我找不到任何调用菜单打开的东西。
关于如何解决这个问题的任何想法?
如果有一种方法可以过滤已调用的函数和未调用的函数,这样您就可以剔除数以千计的无用函数调用并专注于一个感兴趣的函数,这不是很好吗?我们很幸运,你可以做这样的事情!
Buried in Cheat Engine 是一个非常强大的工具,叫做Ultimap(以及它的继任者Ultimap 2)。不幸的是,它依赖于 CPU,所以如果你没有运行英特尔处理器,那么你就不走运了(但如果是这种情况,请不要停止阅读;我在这个答案中提到了其他一些事情)。
Ultimap 和 Ultimap 2(在 Cheat Engine 的主窗口中,单击Memory view
按钮 -> Tools
->Ultimap
或Ultimap 2
)在功能上相同,但操作方式却截然不同。不久前我在 Ultimap 上制作了一个视频,所以我鼓励你观看它,因为它有很多内容。其他人的另一个视频也很好地解释了 Ultimap,您可能会发现它有用。
Ultimap 2 不需要 DBVM 来工作(这太棒了),但是您确实需要使用最新的 Intel CPU,因为Intel PT是 Ultimap 2 工作的关键。
除此之外,CDA(又名FunctionHacker)以一种不同的(很棒的,基于时间线的)方式过滤函数调用,但只适用于32位应用程序。这是一个关于如何使用它的优秀视频,由创建该程序的人制作。
我怀疑还有一种方法可以使用Frida来发现和过滤函数调用,但我对它还不够精通,还不知道它是否可行,所以这可能值得也可能不值得一提。
除此之外,您可以尝试通过 Cheat Engine 枚举 DLL/符号以找到有意义的符号名称以供探索。在 Cheat Engine 的主窗口中,单击Memory view
按钮 -> View
-> Enumerate DLL's and Symbols
,然后查看您看到的内容。我还制作了一个关于该主题的视频,如果您想看到它的实际效果,可以在此处找到。
最后,这听起来像是您前进的方向,但您现在可能需要利用回溯。单击此处阅读我对另一个问题的回答,我在其中详细说明了如何在CALL
链中向上追踪您的方法,您可以尝试强制向上寻找主要调用者(在您进行追踪之后) ,转到链上的每个调用者,NOPCALL
以及可能推送到堆栈的任何可能会使其进一步不平衡的东西,看看会发生什么;冲洗并重复)。还要考虑我在该答案中提到的关于利用Dissect Code
Cheat Engine 功能的内容,您可以通过该功能找到外部参照、字符串、函数等进行探索!
有些游戏可能会受不了您的尝试,因为暂停可以由许多不同的机制(函数、线程等)控制。如果你能在一个字节中找到一个完全控制暂停的布尔值,太棒了!如果你能从菜单中找到一个字符串,然后从那里回溯到最终找到菜单被绘制的时间/位置以及游戏暂停,太棒了!但请注意,您可能会陷入困境,需要您处理多个函数调用、内存地址等。祝你好运!