我正在尝试修改游戏(Fallout New Vegas),使其在窗口失去焦点时不显示暂停菜单。
我想到了两种方法:当焦点发生变化并点按将显示暂停菜单的调用时被调用。
查找确定游戏是否被聚焦并点按该代码的代码

已经存在一种可靠的补丁游戏在运行时是可执行文件,但是我不确定找到失去焦点时调用代码的最佳方法。

我尝试使用作弊引擎来查找代表游戏是否专注的变量。在检查变量周围的代码时,找不到任何可打开菜单的内容。

关于如何实现此目的的任何想法?

#1 楼

如果有一种方法可以筛选出被调用的函数与没有被调用的函数,这样您可以淘汰成千上万个无用的函数调用并磨练感兴趣的函数,那不是很好吗?对我们来说幸运的是,您可以做这种事!不幸的是,它依赖于CPU,因此,如果您没有运行Intel处理器,那么您就不走运了(如果是这样,请不要停止阅读;我在此答案中还提到了其他一些事情)。 />
Ultimap和Ultimap 2(在Cheat Engine的主窗口中,单击Memory view按钮-> Tools-> UltimapUltimap 2)在功能上相同,但操作方式非常不同。我不久前在Ultimap上制作了一个视频,所以我鼓励您观看它,因为其中有很多内容。还有另一个人的视频也很好地解释了Ultimap,您可能会发现它有用。由于Intel PT是Ultimap 2的工作要点,因此必须使用最新的Intel CPU。基于时间轴的方法),但仅适用于32位应用程序。这是一个由创建程序的人制作的有关如何使用它的精彩视频。 -足够了解它是否可行,所以值得一提。

过去,您可以尝试通过作弊引擎枚举DLL /符号来找到有意义的符号探索的名称。在Cheat Engine的主窗口中,单击Memory view按钮-> View-> Enumerate DLL's and Symbols,然后查看您看到的内容。我还制作了关于该主题的视频,如果您想在实际中观看它,可以在这里找到。

最后,这听起来像是您要进去的方向,只不过您现在可能需要使用反向跟踪。单击此处以阅读我对另一个问题的回答,在其中我详细说明了如何通过q​​4312079q链来向上追溯您的方法,在其中您可以尝试强行通过以找到主要调用方(在完成后,跟踪,转到链上的每个呼叫者,对CALL以及可能被压入堆栈的任何东西(可能会使它进一步不平衡)进行NOP,看看会发生什么;冲洗并重复)。还请考虑我在答案中提到的有关利用Cheat Engine的CALL功能的内容,通过它您可以找到外部参照,字符串,函数等进行探索!之所以尝试这样做,是因为可以通过许多不同的机制(函数,线程等)控制暂停。如果您可以在一个字节内找到一个完全控制暂停的布尔值,那就太好了!如果您可以从菜单中找到一个字符串,那么可以从那里追溯,最终找到绘制菜单的时间/位置以及游戏暂停的绝佳时机!但是请注意,您可能会陷入困境,这需要您处理多个函数调用,内存地址等。祝你好运!

#2 楼

我建议您使用差异调试。您可以使用IDA或BinNavi之类的其他工具(如果您的目标是32位)完成此操作。基本上,您必须执行以下操作:



记录游戏开始以来的初始跟踪,在游戏中执行操作,然后退出游戏菜单。
记录一个新的跟踪,这一次,将窗口移出焦点。
与前两个跟踪进行比较,看看在第二个跟踪处专门执行的新代码在哪里。