使用适用于 Fallout New Vegas 的 New Vegas Script Extender C++ API,我能够在运行时通过 NVSE 注入器加载的 .dll 插件直接写入进程的内存。但它不像 CheatEngine 那样是一个调试器,因此没有自动处理将新代码插入现有程序集函数的过程。
汇编函数的开始TryOpenPipboy
,我想注入代码到:https : //i.imgur.com/MQUrbXa.png
EquipPlayerPipboy()
我想注入的功能:https : //i.imgur.com/IjmMRFU.png
游戏有一个循环调用MainUILoop
,它运行每一帧,当玩家按下 Tab 键而不按住它时,TryOpenPipboy
调用。
我的猜测是我需要以某种方式创建一个新的空内存块,编辑原始TryOpenPipboy
函数的副本,然后TryOpenPipboy
用我修改过的变体替换所有调用。但这将与任何其他 NVSE 插件严重不兼容,这些插件也以任何方式修改 MainUILoop,以及任何编辑TryOpenPipboy
.
编辑:另一种可能的方法是将 jmp 程序集更改为我的 C++ 函数,然后TryOpenPipboy
从我的函数调用。这意味着TryOpenPipboy
仍然被调用,但未被修改,增加了潜在的兼容性。
那么我应该怎么做呢?