我知道如何使用 LD_PRELOAD
拦截系统调用,这些调用发生在我可能没有源代码的已编译程序中。例如,如果我想知道一些未知程序 foobar
对 int fsync(int)
的调用,我编译一个包装器
int fsync(int)
对于
(int (*) (int))dlsym(RTLD_NEXT,"fsync");
进入共享库,然后我可以将环境变量 LD_PRELOAD
设置为其并运行 foobar
。假设 foobar
是动态链接的(大多数程序都是这样),我将了解对 fsync
的调用。
但现在假设有另一个未知程序 foobar1
并且在该程序的源代码中有如下语句:
execve("foobar", NULL, NULL)
也就是环境没有通过。现在整个 LD_PRELOAD 方案崩溃了吗?
我通过将上面的 statemet 编译成 foobar1
来检查,当它运行时,不会报告来自 foobar
的调用。
虽然我们可以安全地假设大多数现代程序都是动态链接的,但我们完全不能假设它们可能会或可能不会使用 execve
?
那么,整个 LD_PRELOAD 方案,每个人都说它很棒,除非你有相关程序的源代码,否则它不会真正起作用,在这种情况下你可以检查对 execve
的调用> 并在必要时对其进行编辑。但在那种情况下,如果你有一切的来源,就不需要 LD_PRELOAD。当您没有正在检查的程序的源代码时,LD_PRELOAD 特别有用。
我哪里错了 - 人们怎么能说 LD_PRELOAD 可用于检查未知程序正在做什么?
最佳答案
我想我也可以为 execve
编写一个包装器。在包装器中,我向原始 envp
参数添加了一个字符串:"LD_PRELOAD=
my library"
。这“似乎”有效,我检查了简单的例子。
我不确定我是否应该发布一个很容易超过我的 C 经验水平的“答案”。
如果从长远来看这真的行得通,有人可以发表评论吗?
关于c - 当未知程序可能在不传递环境的情况下调用 execve 时如何使用 LD_PRELOAD 捕获调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35038314/