C ++内存保护指针

时间:2016-03-19 10:07:54

标签: c++

是否有可能“内存保护”指针,以便实际上无法在代码中更改它们,因此尝试在代码中更改它们会导致总线错误?我不是指const,而是指操作系统级别的某种更深层的不变性保证。该问题适用于任何操作系统。

(Carmack在这里提到类似的东西:https://youtu.be/Uooh0Y9fC_M?t=1h41m

2 个答案:

答案 0 :(得分:1)

查看VirtualProtect(Windows)或mprotect(POSIX)。

答案 1 :(得分:1)

由于您的问题很普遍,以下是一些一般性的想法。

在您的应用程序中,该语言为您提供了许多保护数据的结构。例如,不应公开的数据应标记为private。这并不妨碍客户端对您的类进行逆向工程,例如,如果您有

class C {
  public:  int a;
  private: int b;
}; 

然后通常您可以通过b访问int* pB = &(c.a) + 1。这不是任何定义的标准,但在大多数系统上,可能工作。通常,因为C ++允许非常低级别的内存管理,所以基本上可以从应用程序中的任何位置访问应用程序内存的任何部分,尽管明智地(ab)使用它需要一些逆向工程。 / p>

当您公开公共数据时,您可以返回const引用和指针,但当然仍然可以很容易地更改此内存:

const* T myImmutable = new T();
const_cast<T*>(myImmutable)->change(); // Oops

同样,这不是标准的C ++,因为编译器将使用const限定符来执行优化,当你绕过它时,事情可能会中断,但语言不会阻止你这样做。

如果你想保护你的记忆免受外部变化的影响,事情变得有点棘手。通常,操作系统会确保分配给不同进程的内存是分开的,您不能只是在其他进程的内存空间中写入。但是,可以使用Windows API(Read / WriteProcessMemory)中的there are some functions。当然,这需要大量的逆向工程来确定在内存中哪个要更改的指针所在,但这是可能的。如Dani's answer中所述,VirtualProtect有一些防范方法。您可以做越来越复杂的事情,例如保留重要数据的校验和或

  

[编写]一个监视SSDT的驱动程序,然后在执行WriteProcessMemory或ReadProcessMemory时捕获,如果他们指向游戏,你可以压缩这些调用

但正如page I found that on上的第一个答案正确指出:

  

不存在安全性。你唯一能做的就是尽可能地破解

这是一个你永远不应忘记的教训!