编辑内存并复制PC游戏的动作?

时间:2013-07-16 16:15:47

标签: debugging memory assembly code-injection

有一款带有游戏内控制台的单人游戏PC游戏,允许用户执行命令和设置变量。我的目标是能够通过外部程序执行命令,就像通过控制台输入命令一样,并改变变量的值。

我有编程经验,但从未进行任何游戏开发,而且我对程序的内部工作也没有太多的了解。

首先,我在控制台中输入了“set myvar myval”命令,然后在程序的内存中搜索“myval”(使用HxD)。我找到了完整命令“set myvar myval”的多个实例,并且只发现了一个仅仅变量值的实例。更改此位置的值会更改游戏中的值,因此我知道它是变量值的正确位置。但是,在一个程序中,我怎么知道在哪里查找这个变量的值?游戏内存中是否只有某些位置可以容纳值,而在该空间内,变量的值是否总是存储在相同的内存范围内?如何在不崩溃程序的情况下增加值的长度?

我是否有在线资源可以了解我正在尝试做什么?

2 个答案:

答案 0 :(得分:0)

你要做的事情并不那么容易。没有“某些位置”,你当然不能依赖于总是相同的位置(它很可能不会)。如果游戏具有可配置的变量,它可能会动态分配内存。因此,我唯一可以看到的是,您反汇编代码并查看创建此类变量的函数。然后你可以用适当的参数调用它。

答案 1 :(得分:0)

在WoW游戏的黄金时代,有一种工具可以通过为某些值搜索程序存储器来做你想要的事情。因此,如果您想要非常昂贵的物品,您只需要搜索该物品的ID,然后您将当前物品ID的每个出现都替换为该昂贵物品的ID。它很完美,但只有在您尝试注销并再次登录之前它才有效。您的新商品的ID未保存在服务器上,因此旧商品保留在您的商品库中。

回到主题。您能够找到set myvar myval字符串的实例,但这些实例实际上不是操作代码,当然还有myvar的值。游戏命令通常被解析和解释。如果它们被编译,一切都会更容易(因为你只需要找到已编译代码的位置,然后放在那里你自己的代码),但是目前,你必须通过许多测试找到你的变量的位置。

找到游戏使用的内存位置的唯一两种方法是反汇编,或执行测试并统计找到位置 - 但在动态内存分配的世界中,这几乎是不可能的。

更改“值的长度”通常肯定会导致程序出现问题,因为值超出内存会影响另一个对程序运行很重要的“变量”值。