0

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

我有编程经验,但从未做过任何游戏开发,而且我对程序的内部运作也不太了解。

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

是否有任何在线资源可供我了解我正在尝试做的事情?

4

2 回答 2

0

你想做的事情并不那么容易。没有“某些位置”,您当然不能依赖始终相同的位置(它很可能不会)。如果游戏有可配置的变量,它可能会为它动态分配内存。所以我能看到的唯一机会是,你反汇编代码并查看创建这样一个变量的函数在哪里。然后您可以使用适当的参数调用它。

于 2013-07-17T05:34:36.727 回答
0

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

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

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

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

于 2013-07-17T18:02:39.393 回答