1

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

这里是一个图:

A或B - > HP

d +偏移 - > A或B

Ç - > d

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

+0

在这个级别的答案可能会受到代码旨在运行的芯片(或虚拟机)的体系结构和指令集的严重影响。一些指令集通过为偏移索引提供快速寻址模式来鼓励这种情况。 – dmckee 2013-04-23 16:32:54

回答

2

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

C语言中对象的抽象通常是用“struct”来完成的。

在您的例子设想一个非常简单的“播放器”的结构:

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

如果你想创建这样一个对象,你可以做这样的事情:

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

什么是好的用高级语言看结构化的东西其实只是编译程序中的一块内存。

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

它必须使用基址指针的偏移量。在上面的例子中(假设Windows操作系统和任何默认配置成熟的编译器)在一些伪机器代码的访问将是这个样子:

move myHealth, read4bytes[myPlayer + 12] 

如果您反向工程编程',你不能告诉无论内存块是一个结构体,一个数组,还是一个类(来自C++代码)或者完全不同的内存块的偏移量访问。

+0

完美解释。真棒回答。 :) – user2312080 2013-04-23 18:33:11