将程序与正在运行的游戏挂钩,更新每帧

时间:2018-07-25 20:56:54

标签: python artificial-intelligence reverse-engineering unreal-engine4

我正在尝试为使用Unreal引擎4的游戏编写自定义AI API。虽然我可以使用Python很好地读取进程内存,但我遇到了一个更大的问题-仅在相关时读取进程内存并发送仅在可能的情况下才在输入中-因此仅渲染一次帧。如果我要发送输入,则需要专门在帧上发送输入(游戏是格斗游戏)。

因此,我需要以与游戏本身相同的帧率更新自己的AI API。我的第一个想法是调查进程内存,找出每帧是否有更新的值-尽管始终有更新的值,但似乎在发生8帧后在内存中进行了更新。不幸的是,由于更新循环的更新速度不够快,因此8帧帧无法使AI正确执行输入。

我将更多地查看内存,但我想知道是否可以将程序附加到正在运行的进程中以查看窗口本身-如果它已被更新(呈现了新的内容),请更新AI本身的游戏状态。有没有办法可以实现?

1 个答案:

答案 0 :(得分:0)

我们正在谈论的是基于虚幻引擎构建的游戏,您找不到每个帧都在更改的地址。

这使我担心您要在哪里/如何查找每帧更改的地址。也许以防万一,尝试使用内存扫描工具,例如CheatEngine。

每帧应该有一些地址更改。我想到的是:

  • 使用此功能时引用的地址之一:UGameplayStatics::GetRealTimeSeconds(GetWorld());

如果您真的找不到改变每一帧的变量,那么我为您提供了一种解决方案,可通过执行以下操作来挂钩到在每帧过程中调用的函数:

这绝不是一个完整的解决方案,因为它涵盖了一个主观复杂的主题,您可能需要从其他来源那里学习。

[注意]

如果该游戏使用反作弊功能,则您可能会因为这种行为而被禁止使用,我建议您在尝试之前进行研究。对于使用以下建议可能引起的任何问题或损失,我不承担任何责任。

备份选项:

  1. 使用CheatEngine,打开目标进程。
  2. 寻找在每一帧都被调用的函数(像这样):
    • 找到您怀疑每帧都读取的变量(不必更改)
    • 将其添加到您的地址列表中
    • 右键单击地址列表中的条目,然后选择:查找访问此地址的人
    • 接受将调试器附加到进程的提示
    • 注意计数,它的上升速度非常快吗?大!这很可能每帧都被读取
    • 停止该工具,然后单击计数较高的列表中的“指令”条目
    • 点击显示反汇编程序按钮
    • 您现在正在查看每帧访问您地址的函数的解释操作码
    • 只需右键单击突出显示的行,然后单击选择当前功能以找到该功能的开始
    • 我将亲自在该行( F5 )上切换一个断点,并在侧面显示游戏,以确保每帧触发一次(在每次断点后继续使用 F9 >)。
  3. 您现在在突出显示的行的地址列中具有基本地址 + 功能地址
  4. 这里是困难的部分,需要进一步解释,这是您需要进行的学习练习。

    • 通过在运行过程中注入代码或在运行过程之前修改过程来学习修补功能的过程。
    • 注入的代码可以通过内存映射文件命名管道与您的进程通信,并在每帧设置一个标志。
    • 您需要在保留原始操作码的同时执行此操作,以确保该程序可以通过以下任一方式正常运行:
      • 执行后恢复
      • 跳到代码洞穴并在跳回之前执行原始操作码
      • 完全重定向功能(不适合您当前使用,但值得一读)