1

我正在使用称为作弊引擎的内存编辑应用程序。我将作弊引擎附加到游戏中。在我的游戏中,我有一个称为 HP 的 32 位整数。HP 存储在内存地址 A。如果我重新启动游戏,HP 将存储在新的内存地址 B。似乎使用 Cheat Engine,我可以进行指针扫描并找到一个静态内存地址 C,它指向另一个内存地址及其附带的偏移量 D 和偏移量,因此 [D + offset] 在该会话期间始终存储 HP 的内存地址。因此,如果我取消引用 [D + offset],我总是会得到存储 HP 的内存地址。

这是一个图表:

A 或 B --> 生命值

D + 偏移 --> A 或 B

C --> D

使用偏移量有什么好处?为什么 C 不能直接指向 A 或 B?我熟悉在 C 语言中处理数组时使用偏移量是有益的。这是否意味着每当我看到指针的偏移量时,指针都指向数组中的第一个元素,而偏移量指的是数组中的一个元素?

4

1 回答 1

2

如果您了解 C 编程语言,应该很容易想象和理解。您用 C 编写的任何内容都非常接近编译程序时生成的实际机器代码。

C 中对象的抽象通常使用“结构”来完成。

在您的示例中,想象一个非常简单的“播放器”结构:

struct Player {
    int id;
    float xposition;
    float yposition;
    int health;
    int maxhealth;
};

如果要创建这样的对象,可以执行以下操作:

struct Player *myPlayer = malloc(sizeof(struct Player));

高级语言中看起来漂亮的结构化事物实际上只是已编译程序中的一块内存。

要访问例如“健康”,您myPlayer->health;在 C 中执行。但是现在,在一个不知道美丽名称并且只有一块内存可以使用的编译程序中,这看起来如何?

它必须使用基指针的偏移量。在上面的示例中(假设 Windows 操作系统和任何默认配置的健全编译器),一些伪机器代码中的访问将如下所示:

move myHealth, read4bytes[myPlayer + 12]

如果对程序进行逆向工程,则无法从偏移访问中判断内存块是结构、数组还是类(来自 C++ 代码)或完全不同的东西。

于 2013-04-23T18:06:57.010 回答