繁体   English   中英

C++ 内存保护指针

[英]C++ memory protect pointers

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

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

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

由于你的问题很笼统,这里有一些一般性的想法。

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

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

那么通常你将能够通过int* pB = &(ca) + 1访问b 这不是任何定义的标准,但在大多数系统上这可能会起作用。 一般来说,因为 C++ 允许非常低级的内存管理,您基本上可以从应用程序内的任何位置访问应用程序内存的任何部分,尽管合理(滥用)使用它需要一些逆向工程。

当你暴露公共数据时,你可以返回const引用和指针,但当然仍然很容易改变这个内存:

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

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

如果你想保护你的记忆免受外部变化的影响,事情就会变得有点棘手。 一般来说,操作系统会确保分配给不同进程的内存是分开的,你不能随便去写其他进程的内存空间。 但是,Windows API ( Read / WriteProcessMemory ) 中有一些可以使用的函数 当然,这需要大量的逆向工程,以确定究竟在何处在内存中改变所在的指针,但它是可能的。 一些防止这种情况的方法是 VirtualProtect,如Dani 的回答中所述 您可以做越来越复杂的事情,例如保留重要数据的校验和或

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

但作为页面上的一个答案, 我发现正确指出:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM