你好,我正在编写一个Linux模块(基于一个名为“Ccontrol”的GitHub项目)来创建缓存分区(也称为页面着色)以减轻时序侧信道攻击(以防止像Prime+Probe这样的攻击)。我使用LD_PRELOAD系统环境变量覆盖了所有的malloc()、calloc()和free()调用并用颜色感知调用替换它们。现在我也在寻找给堆栈和数据段上色的方法。为新生进程分配内存的系统调用/库是什么?有没有办法使用LD_PRELOAD或任何其他方法覆盖此调用(无需重新编译内核)?先谢谢大家了加尔 最佳答案 有两个内存分配系统调用:sbrk,扩
对标题感到抱歉,真的想不出其他任何东西来描述这个问题:)好的,事情是这样的:我正在尝试在Linux下使用专有的免费软件应用程序(因此出现了问题;如果我有源代码,我可以重建它)。此外,我试图在不受支持的Linux版本上运行它,并且应用程序的几乎所有组件都单独工作,但不能一起工作(如果应用程序完全运行,它们应该如此)。让我澄清一下。有一个GUI,可以在不受支持的操作系统中正常启动。然后,从这个GUI中,您可以调用一堆命令行工具-有用的是,GUI还会吐出在每种情况下调用的命令行。现在,从GUI调用其中一些命令失败了-然而,因为我调用了实际的命令行(假设:“extprogram-arg11-a
对标题感到抱歉,真的想不出其他任何东西来描述这个问题:)好的,事情是这样的:我正在尝试在Linux下使用专有的免费软件应用程序(因此出现了问题;如果我有源代码,我可以重建它)。此外,我试图在不受支持的Linux版本上运行它,并且应用程序的几乎所有组件都单独工作,但不能一起工作(如果应用程序完全运行,它们应该如此)。让我澄清一下。有一个GUI,可以在不受支持的操作系统中正常启动。然后,从这个GUI中,您可以调用一堆命令行工具-有用的是,GUI还会吐出在每种情况下调用的命令行。现在,从GUI调用其中一些命令失败了-然而,因为我调用了实际的命令行(假设:“extprogram-arg11-a
我使用LD_PRELOAD技巧来捕捉open64()调用,我想我知道如何正确地做到这一点:使用程序foobar编译自#include#include#includeintmain(){open64("foobar.txt",0);return0;}我按预期捕获了open64:>LD_PRELOAD=$PWD/catch.so./foobaropen64called但是,当open64被替换为fopen64时:#includeintmain(){fopen64("foobar.txt","r");return0;}现在open64没有被捕获。为什么?如果fopen64调用open,我确实
我使用LD_PRELOAD技巧来捕捉open64()调用,我想我知道如何正确地做到这一点:使用程序foobar编译自#include#include#includeintmain(){open64("foobar.txt",0);return0;}我按预期捕获了open64:>LD_PRELOAD=$PWD/catch.so./foobaropen64called但是,当open64被替换为fopen64时:#includeintmain(){fopen64("foobar.txt","r");return0;}现在open64没有被捕获。为什么?如果fopen64调用open,我确实
如果我直接使用共享库中的函数,即通过在代码中声明该函数并在编译时进行链接,则LD_PRELOAD可以正常工作。但是,如果我使用dlopen()/dlsym(),则LD_PRELOAD无效!问题是我想调试一个使用dlopen()加载某些插件的程序,并且该程序使用绝对文件名,因此仅使用LD_LIBRARY_PATH将无法工作。这是说明问题的示例代码。./libfoo.sovoidfoo(){printf("version1\n");}./preload/libfoo.sovoidfoo(){printf("version2\n");}main.c#include#includevoidfo
如果我直接使用共享库中的函数,即通过在代码中声明该函数并在编译时进行链接,则LD_PRELOAD可以正常工作。但是,如果我使用dlopen()/dlsym(),则LD_PRELOAD无效!问题是我想调试一个使用dlopen()加载某些插件的程序,并且该程序使用绝对文件名,因此仅使用LD_LIBRARY_PATH将无法工作。这是说明问题的示例代码。./libfoo.sovoidfoo(){printf("version1\n");}./preload/libfoo.sovoidfoo(){printf("version2\n");}main.c#include#includevoidfo
我正在使用LD_PRELOAD来捕获linux中的write()系统调用。我能够成功地为写入系统调用执行此操作并使其工作。但是当我调用printf()时它不起作用。如果我们使用strace观察printf堆栈跟踪,我发现,最后printf调用write()系统调用以写入控制台,但当时我的write()系统调用在实际调用write()系统调用之前没有被调用.有人知道为什么会这样吗? 最佳答案 从一个库到另一个库或从可执行文件到动态加载库的函数调用通过PLT(过程链接表)进行,并且能够通过使用LD_PRELOAD进行重定向。但是,库中的
我正在使用LD_PRELOAD来捕获linux中的write()系统调用。我能够成功地为写入系统调用执行此操作并使其工作。但是当我调用printf()时它不起作用。如果我们使用strace观察printf堆栈跟踪,我发现,最后printf调用write()系统调用以写入控制台,但当时我的write()系统调用在实际调用write()系统调用之前没有被调用.有人知道为什么会这样吗? 最佳答案 从一个库到另一个库或从可执行文件到动态加载库的函数调用通过PLT(过程链接表)进行,并且能够通过使用LD_PRELOAD进行重定向。但是,库中的
我有一个共享库(libtest.cpp)和一个简单程序(test.cpp)。我希望他们共享一个线程局部变量gVar。共享库通过LD_PRELOAD链接。这是共享库libtest.cpp的代码:#include__threadintgVar;voidprint_gVar(){printf("%d\n",gVar);}下面是test.cpp的代码。#include__threadintgVar;void__attribute__((weak))print_gVar();intmain(){gVar=10;print_gVar();return0;}然后我使用以下脚本来编译和运行它们。g++