C++ C++;内存保护指针

C++ C++;内存保护指针,c++,C++,是否可以“内存保护”指针,以便实际上不可能在代码中更改它们,从而尝试在代码中更改它们会导致总线错误?我指的不是const,而是操作系统级别的某种更深层的不变性保证。这个问题适用于任何操作系统 (Carmack在这里提到了类似的内容:)看看(Windows)或(POSIX)。由于您的问题非常笼统,这里有一些一般性的想法 在应用程序中,该语言为您提供了许多保护数据的结构。例如,不打算公开的数据应标记为private。但这并不妨碍客户机对类进行反向工程,例如,如果您有 class C { publ

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


(Carmack在这里提到了类似的内容:)

看看(Windows)或(POSIX)。

由于您的问题非常笼统,这里有一些一般性的想法

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

class C {
  public:  int a;
  private: int b;
}; 
然后通常您可以通过
int*pB=&(c.a)+1访问
b
。这不是任何定义的标准,但在大多数系统上,这可能会起作用。一般来说,因为C++允许非常低级别的内存管理,所以基本上可以从应用程序的任何地方访问应用程序内存的任何部分,尽管明智地(AB)使用这一点需要一些逆向工程。 公开公共数据时,可以返回
const
引用和指针,但当然仍然很容易更改此内存:

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

再次,这不是标准C++,编译器会使用<代码> const 限定符来执行优化,当你绕过它时,事情可能会中断,但是语言不会阻止你这样做。 如果你想保护你的记忆不受外部变化的影响,事情就变得有点棘手了。一般来说,操作系统确保分配给不同进程的内存是分开的,您不能只在其他进程的内存空间中进行写操作。但是,在Windows API中(

Read
/
WriteProcessMemory
)可以使用。当然,这需要大量的反向工程来确定要更改的指针在内存中的确切位置,但这是可能的。如中所述,一些防止这种情况的方法是虚拟保护。您可以做的事情越来越复杂,比如保存重要数据的校验和或

[编写]驱动程序,监控SSDT,然后在执行WriteProcessMemory或ReadProcessMemory时捕获,如果这些调用指向游戏,您可以挤压这些调用

但正如第一个答案正确指出的那样:

安全是不存在的。你能做的唯一一件事就是尽可能使它难以破解


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

你的问题不是很清楚。但是
const
允许你对不可变的东西进行标记。使你的问题清晰明了,主题明确,读者无需观看视频。看,你想保护他们什么?子类的变化?其他(公共)客户的变更?直接修改内存的外部黑客所做的更改?地球翻转位磁场的变化?@CompuChip很确定他指的是这里的磁场。你甚至没有提到你需要解决哪个操作系统。让人们看一段视频来理解一个问题不是很好。如果每个人都这么做。。。你应该写一个简短的视频内容摘要。不知道为什么这会被否决——这基本上是一个好答案,尽管它可能需要更多的解释,也许还需要一个代码示例。