如何找出用 LD_PRELOAD 拦截哪些函数?

马克·盖尔克

我试图拦截所有动态加载的函数,这些openat函数comm.so使用使用LD_PRELOAD机制调用系统调用

考虑以下/sbin/depmod命令的使用

#strace -f /sbin/depmod 3.10.0-693.17.1.el7.x86_64

(……)

openat(AT_FDCWD, "/lib/modules/3.10.0-693.17.1.el7.x86_64", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3

我想拦截调用这个openat系统调用的函数

如何找出那个函数是什么?openat,这可能是一个别名,以及任何其他类似的功能,都不​​起作用 - 没有任何东西被拦截。

我尝试使用此命令来查找我的命令正在使用的动态加载函数:

#readelf -p .dynstr /sbin/depmod 

这会打印出一些.so库,所以我readelf递归地使用它们。在递归结束时,我有以下具有open的函数列表at

openat
openat64
open_by_handle_at
__openat64_2

这些都不起作用 - 它们不会拦截返回文件描述符 3 的调用。

好的,那么如何找出我需要拦截的其他功能?我是否必须逐一遍历命令显示的所有函数readelf,并且递归地这样做(有很多)?

巴西尔·斯塔林克维奇

openat 系统调用(或任何其它一个,见系统调用(2)对的列表)可以被称为不使用openat从标准库函数; 它可以从ld-linux(8)处理 LD_PRELOAD调用在我的 Debian/Sid 系统上,看起来动态链接器/lib/ld-linux.so.2正在使用openat系统调用(例如尝试strace /bin/true),当然它使用自己的openopenat函数(不是 中的libc.so)。

任何系统调用都可以(原则上)由直接机器代码(例如一些适当的SYSENTER机器指令)调用,或者通过一些间接syscall(2) 调用(并且在这两种情况下openat都不会使用 C 函数)。有关更多信息,请参阅Linux Assembly HowToLinux x86 ABI规范。

如果你想拦截所有的人(包括那些通过做ld-linux,这是奇怪的),你需要使用ptrace的(2)PTRACE_SYSCALL类似的方式使用strace(1) 此时您将能够获得程序计数器和调用堆栈。

如果您关心以下文件和文件描述符,还可以考虑inotify(7)工具。

如果您使用gdb(在没有DWARF 调试信息的程序上使用它会很痛苦),您可以使用catch syscall(使用ptrace PTRACE_SYSCALLin的方式gdb)找出(并且可能“中断”)每个原始系统调用。

顺便说一句,有可能一些C 标准库正在open通过openat系统调用(或openat在其他地方使用来实现它们的C 函数通过研究您的特定源代码libc.so(可能是 GNU glibc,可能是musl-libc)来检查。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何修复LD_PRELOAD?

来自分类Dev

使用LD_PRELOAD拦截c ++类构造函数

来自分类Dev

用 LD_PRELOAD 替换 memcpy@glibc_2.14

来自分类Dev

无法使用LD_PRELOAD挂钩ncurses函数

来自分类Dev

LD_PRELOAD 带有枚举和结构的函数

来自分类Dev

如何在ld_preload中使用perf?

来自分类Dev

如何使静态链接的ELF文件加载LD_PRELOAD .so

来自分类Dev

如何在ld_preload中使用perf?

来自分类Dev

如何将LD_PRELOAD设置为进程?

来自分类Dev

LD_PRELOAD完成后,如何卸载库?

来自分类Dev

如何使用带有 LD_PRELOAD 的 gdbserver 进行调试

来自分类Dev

ld wrap和LD_PRELOAD都无法拦截系统调用

来自分类Dev

为什么我不能使用LD_PRELOAD在bash中拦截write(2)?

来自分类Dev

如何使用LD_PRELOAD向应用程序注入后台线程?

来自分类Dev

如何在Android的媒体服务器上使用LD_PRELOAD?

来自分类Dev

如何为ptrace子项设置LD_PRELOAD环境变量

来自分类Dev

如何仅将LD_PRELOAD应用于目标程序?

来自分类Dev

如何将.so设置为可用于LD_PRELOAD

来自分类Dev

rlwrap中的LD_PRELOAD?

来自分类Dev

LD_PRELOAD无法正常工作

来自分类Dev

Linux:LD_PRELOAD + -z,initfirst

来自分类Dev

不使用LD_PRELOAD替换符号

来自分类Dev

LD_PRELOAD目标是哪个程序

来自分类Dev

具有文件功能的LD_PRELOAD

来自分类Dev

LD_PRELOAD 和动态链接器

来自分类Dev

为什么不鼓励使用LD_PRELOAD?

来自分类Dev

LD_PRELOAD不会影响RTLD_NOW的dlopen()

来自分类Dev

正在运行的进程的重载符号(LD_PRELOAD附件)

来自分类Dev

LD_PRELOAD和线程局部变量