【问题标题】:How can I use data discovered via a memory scanner in an external program?如何在外部程序中使用通过内存扫描仪发现的数据?
【发布时间】:2014-08-04 21:06:14
【问题描述】:

所以,一些背景知识:我正在使用一个名为 cheat engine 的内存扫描仪来获取我正在尝试的非开源视频游戏中的游戏统计数据(例如 hp、mana、exp)的实时值制作一个机器人。

为了让我的机器人有效地使用这些信息,我需要及时将其从作弊引擎(或任何具有类似功能的内存扫描器)中获取到我的机器人代码中。

现在,一种明显的方法是将所有信息保存到一个文件中,然后在我的机器人代码中加载该文件,但由于这些数据需要大约每半秒左右更新一次,所以这不是真正的解决方案。

我真正需要的是一个非常方便的内存扫描器,它允许您将发现的信息用作某种编程语言(最好是 java、c 或 matlab)中的一组变量,或者是一种访问内存地址的方法以上述语言之一找到。

后一种选择应该是可行的,因为作弊引擎会给出内存地址、控制进程 ID 和数据类型。

【问题讨论】:

  • 我认为 MATLAB 将是一个非常糟糕的选择。我不认为 MATLAB(或者 Java,但我不是 Java 专家)可以让您直接与内存交互。即使可以,在游戏和作弊引擎上运行 MATLAB 所产生的开销也会使其变得昂贵。我会在 C 中执行此操作。
  • 如果数据不断移动,您几乎肯定会遇到竞争条件,即在扫描数据和使用结果之间移动。根据您想要对数据执行的具体操作,这可能会导致您的机器人出现暂时的不当行为,或者机器人和/或游戏完全崩溃......
  • @strictlyrude27 我想这么多;我只提到了 MATLAB,因为我已经在其中编写了大量的 AI 行为,而且我怀疑 java 可以触摸内存,因为它运行在 VM 上。我可能最终会在 c 中做一些事情。
  • @R.. 是的,幸运的是我知道数据应该在的范围内,所以我可以丢弃虚假查询。为了清楚起见,我只看几个整数的值,没有复杂的数据结构。此外,我不会尝试修改我获得的任何值。
  • 为什么不使用内置在作弊引擎中的 lua 来做你想做的事? Lua 是一种非常酷的语言。您还没有表明您的 AI 与 MATLAB 的紧密程度。你需要matlab有什么原因吗?如果有,在 matlab 和 cheatengine 之间编写一个小的 ASCII 套接字程序,你就可以开始了。更奇特的方法是围绕 CheatEngine 编写一个 JNI/Java 接口,在 java 中运行它,然后在 Matlab 之外运行它。取决于你的需要。

标签: c assembly


【解决方案1】:

这个问题没有一个简单的答案。据我所知,你是这个领域的新手,所以你真正需要的是对这个主题的适当的介绍,为此我推荐阅读Exploiting Online Games: Cheating Massively Distributed Systems

这是一本很棒的书,它以详细的方式展示了游戏黑客是如何工作的,并且它专门用了一个整章来介绍如何构建机器人

如果你想编写一个应用程序来读/写数据到这些内存地址,你需要研究像ReadProcessMemory()WriteProcessMemory()这样的函数。无论您选择哪种语言来实现您的机器人,都需要提供对 Windows API 的访问。这是必需的,因为您必须操作另一个进程的内存空间。

There are lots of tutorials 展示了如何使用 CC++ 执行此操作,因为它们是首选的语言做这种事情。另一种选择是使用macro tool,如果您想要简单的play the game for you

现代电脑游戏实施了自己的反作弊机制,让(和我)这样的人更难做到这一点。由于this book 提供了攻击和防御技术,因此我向任何对如何利用计算机游戏感兴趣的人推荐它。 本书充满了代码示例

我很抱歉没有提供更多信息,但我过去曾因帮助人们满足您的好奇心而受到批评,而且我也永远不会比这本书的作者解释如何做这些事情做得更好。

【讨论】:

    【解决方案2】:

    尝试使用 Lua 接口来获得所需的内容。

    这是一个例子(我没有尝试过,但我假设它有效....)

    http://forum.cheatengine.org/viewtopic.php?t=530047

    【讨论】:

    • 呃,这个例子实际上并没有满足我的需要;它主要专注于代码注入的 GUI,而我需要一个 Lua 函数来返回通过作弊引擎获得的内存地址的当前值。
    【解决方案3】:

    您可能可以将COM 与Lua 中的脚本(带有LuaCOM)一起使用,另一侧使用Matlab 或C

    【讨论】:

      【解决方案4】:

      您需要使用调试库来执行此操作。您可以在变量的位置上设置一个观察点,当它触发时,您将获得它的值。

      scanmem 为 Linux 执行此操作。

      不幸的是,许多闭源游戏都竭尽全力避免使用调试器,因此这可能不适用于您的游戏。

      【讨论】:

        【解决方案5】:

        您尝试过 Visual VM 吗?

        http://visualvm.java.net/download.html

        【讨论】:

          【解决方案6】:

          Cheat Engine 是开源的,所以你要做的就是查看 Cheat Engine 的源代码,看看内存转储是如何工作的。

          但是,监视不受您控制的实时进程非常重要,因此除非您是 11 级的黑帽代码向导,否则我怀疑它不会起作用。

          即使您说您想查看一些您可以通过内存转储猜测的整数,但要以编程方式始终如一地找到该区域要困难得多,同时可能会经常重新跟踪,因为数据可能被复制或当程序的状态改变时移动。

          另请阅读 Cheat Engines 常见问题解答中的这篇令人鼓舞的引文:

          问:Cheat Engine 是否适用于在线游戏?

          A:大多数时候,没有

          但无论如何,试试吧 - 听起来很有趣,我相信你会学到一些东西,而且总有机会让它发挥作用:-)

          【讨论】:

            猜你喜欢
            • 2012-05-21
            • 2011-05-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多