问题 如何在外部程序中使用通过内存扫描程序发现的数据?


所以,有些背景:我正在使用一个名为的内存扫描程序 作弊引擎 在我试图制作机器人的非开源视频游戏中获取游戏统计数据(例如hp,mana,exp)的实时值。

为了让我的机器人有效地使用这些信息,我需要及时从欺骗引擎(或具有类似功能的任何内存扫描程序)到我的机器人代码。

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

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

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


1963
2017-08-31 18:59


起源

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


答案:


这个问题没有一个简单的答案。据我所知,你对这个领域很新,所以你真正需要的是一个 适当的介绍 对于这个主题,为此我建议阅读 利用网络游戏:作弊大规模分布式系统

这是一本很棒的书,它在一本书中展示 详细 游戏黑客的工作方式,它致力于一个 关于如何构建机器人的整章

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

那里    地段 的 教程 在那里显示如何使用 C 和 C ++因为他们是做这种东西的首选语言。另一个选择是使用a 宏工具 如果你想要简单的东西 为你玩游戏

现代电脑游戏实现自己的 反作弊 使人们喜欢的机制变得更加困难  (和我)。从那以后 这本书 介绍攻击和防御技术我推荐给任何对如何利用计算机游戏感兴趣的人。 这本书充满了代码示例

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


10
2017-09-27 23:29





尝试使用Lua界面来获得所需内容。

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

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


0
2017-08-31 21:12



呃,那个例子实际上并不能满足我的需要;它主要关注代码注入的GUI,而我需要一个Lua函数,它返回通过作弊引擎获得的内存地址的当前值。 - zergylord


你可以使用 COM 用Lua中的脚本(带有 LuaCOM)一边和 MATLAB 或者C在另一方面


0
2017-09-27 16:24





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

scanmem 为Linux做那件事。

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


0
2017-09-27 18:13





你试过Visual VM吗?

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


0
2017-09-27 21:21





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

但是,监视一个你没有控制的实时进程是非常重要的,所以除非你是11级的黑帽代码向导,否则我怀疑它不起作用。

即使你说你想要查看一些可以猜测内存转储的整数,但要以编程方式,一致地找到该区域要困难得多,同时可能会经常进行重新跟踪,因为数据可能会被复制或移动程序状态发生了变化。

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

问:Cheat Engine会在网络游戏上运作吗?

答:大部分时间都没有

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


0
2017-09-27 21:58