您也可以在 UNIX exec 之前从 C 源代码以编程方式执行此操作。
如果您查看setarch 的来源(这是一个来源):
http://code.metager.de/source/xref/linux/utils/util-linux/sys-utils/setarch.c
您可以查看归结为系统调用 (syscall) 还是函数调用(取决于您的系统定义的内容)。来自 setarch.c:
#ifndef HAVE_PERSONALITY
# include <syscall.h>
# define personality(pers) ((long)syscall(SYS_personality, pers))
#endif
在我的 CentOS 6 64 位系统上,它看起来像使用了一个函数(它可能调用了上面的 self-same 系统调用)。看看 /usr/include/sys/personality.h 中包含文件中的这个 sn-p(在 setarch 源代码中引用为 <sys/personality.h>):
/* Set different ABIs (personalities). */
extern int personality (unsigned long int __persona) __THROW;
归结为,您可以从 C 代码调用并设置个性以使用 ADDR_NO_RANDOMIZE,然后使用 exec(就像 setarch 一样)。
#include <sys/personality.com>
#ifndef HAVE_PERSONALITY
# include <syscall.h>
# define personality(pers) ((long)syscall(SYS_personality, pers))
#endif
...
void mycode()
{
// If requested, turn off the address rand feature right before execing
if (MyGlobalVar_Turn_Address_Randomization_Off) {
personality(ADDR_NO_RANDOMIZE);
}
execvp(argv[0], argv); // ... from set-arch.
}
很明显,你不能在你所处的过程中关闭地址随机化(笑:除非可能是动态加载),所以这只影响以后的分叉和执行。我相信地址随机化标志是由子子进程继承的?
无论如何,这就是您可以在 C 源代码中以编程方式关闭地址随机化的方法。如果您不希望强制用户手动干预并使用 setarch 或前面列出的其他解决方案之一启动,这可能是您唯一的解决方案。
在您抱怨关闭此功能的安全问题之前,一些共享内存库/工具(例如PickingTools shared memory 和一些IBM databases)需要能够关闭内存地址的随机化。