glibc
并且eglibc
有一个PTR_MANGLE
,它加密可写内存中的指针(更准确地说,是“XOR”而不是“加密”)。
我没有找到太多关于该功能的阅读。man -k PTR_MANGLE
没有返回任何点击,谷歌正在返回一些肤浅的喋喋不休。为数不多的权威文章之一是 Drepper在 Live Journal 上的指针加密。
是否有任何深入的文档?是否可以扩展到用户空间进程,还是仅限于运行时库?如果是这样,启用该功能的编译器开关或选项是什么?可以在运行时禁用该功能吗?
PTR_MANGLE
是 glibc 的一个内部特性,建立在宏上。它不是由编译器以任何方式自动化的。您可以在应用程序中复制相同的内容,但您也必须手动完成;它的工作原理类似于:
uintptr_t xor_key; // needs to be initialized with random "key" before use
#define PTR_MANGLE(p) (1 ? (void *)((uintptr_t)(p) ^ xor_key) : p)
这可能与 glibc 的实现完全不同;好久没看它了,就在脑海里写下这个。条件运算符看似无用的用法是强制生成的表达式与原始指针具有相同的类型,以便可以直接使用。
请注意,该操作是其自身的逆操作,因此PTR_MANGLE
可用于“加密”和“解密”。