c - 当未知程序可能在不传递环境的情况下调用 execve 时如何使用 LD_PRELOAD 捕获调用

标签 c linux dll

我知道如何使用 LD_PRELOAD 拦截系统调用,这些调用发生在我可能没有源代码的已编译程序中。例如,如果我想知道一些未知程序 foobarint 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/

相关文章:

mysql - bash 脚本中的循环未捕获文件中的所有行

c++ - 程序在 Windows 中跨 DLL 边界使用嵌入式 Python/C++ 代码崩溃

c++ - 通过对 dll 的 stdcall 操作字符串时出现问题

C 编程,为什么我不能将 strcpy() 与索引一起使用?

c++ - 如何判断一个项目是c还是c++项目?

linux - 如果缓冲区大小太小而无法容纳 read() 系统调用返回的读取数据,会发生什么情况?

linux - Reaver 在等待信标时挂断了电话

c++ - 在安装了 VS08 的旧 XP 中使用最新的 dll 函数

c - 使用 free() 时大小为 4 的无效读取

C - 多个左值错误