Linux 如何找出使用LD_PRELOAD截取哪些函数?
我正在尝试使用Linux 如何找出使用LD_PRELOAD截取哪些函数?,linux,elf,ld-preload,Linux,Elf,Ld Preload,我正在尝试使用LD_PRELOAD机制拦截所有使用库comm.so调用syscallopenat的动态加载函数 考虑以下使用/sbin/depmod命令: #strace -f /sbin/depmod 3.10.0-693.17.1.el7.x86_64 (……) 我想截取调用此openatsyscall的函数 如何找出这个函数是什么openat(可能是别名)和任何其他类似的函数都不起作用-不会截获任何内容 我尝试使用此命令查找我的命令正在使用的动态加载函数: #readelf -p .dy
LD_PRELOAD
机制拦截所有使用库comm.so
调用syscallopenat
的动态加载函数
考虑以下使用/sbin/depmod
命令:
#strace -f /sbin/depmod 3.10.0-693.17.1.el7.x86_64
(……)
我想截取调用此openat
syscall的函数
如何找出这个函数是什么openat
(可能是别名)和任何其他类似的函数都不起作用-不会截获任何内容
我尝试使用此命令查找我的命令正在使用的动态加载函数:
#readelf -p .dynstr /sbin/depmod
这会打印出一些.so
库,所以我递归地使用了readelf
。在递归结束时,我有以下函数列表,其中包含open
和At
:
openat
openat64
open_by_handle_at
__openat64_2
这些都不起作用-它们不会拦截返回文件描述符3的调用
好的,那么如何找出我需要截取的其他函数呢?我是否必须遍历readelf
命令所显示的所有函数,并且递归地一个接一个地(它们很多)?可以调用openat
系统调用(或任何其他调用,请参阅列表),而无需使用标准库中的openat
函数;它可以从(处理ldu预加载)调用。在我的Debian/Sid系统上,动态链接器/lib/ld linux.so.2
正在使用openat
系统调用(例如尝试strace/bin/true
),当然它使用自己的open
或openat
函数(而不是libc.so
)
任何系统调用(原则上)都可以通过直接的机器代码(例如一些适当的SYSENTER
machine指令)调用,或者通过一些间接的(在这两种情况下都不会使用openat
C函数)调用。有关更多信息和规范,请参见
如果您想截取所有这些数据(包括那些由ld linux
完成的数据,这很奇怪),您需要以类似的方式与PTRACE\u SYSCALL
一起使用。此时,您将能够获取程序计数器和调用堆栈
如果您关注以下文件和文件描述符,请考虑设备。
如果您使用gdb
(在没有DWARF调试信息的程序上使用它会很痛苦),您可以(在gdb
中使用ptrace ptrace_SYSCALL
的方法)找出(可能是“中断”)每个原始系统调用
顺便说一句,可能有些人正在通过openat
系统调用(或在其他地方使用openat
实现其open
C功能)。通过研究特定libc的源代码进行检查。因此(可能是GNU)。可以调用openat
系统调用(或任何其他调用,请参阅列表),而无需使用标准库中的openat
函数;它可以从(处理ldu预加载
)调用。在我的Debian/Sid系统上,动态链接器/lib/ld linux.so.2
正在使用openat
系统调用(例如尝试strace/bin/true
),当然它使用自己的open
或openat
函数(而不是libc.so
)
任何系统调用(原则上)都可以通过直接的机器代码(例如一些适当的SYSENTER
machine指令)调用,或者通过一些间接的(在这两种情况下都不会使用openat
C函数)调用。有关更多信息和规范,请参见
如果您想截取所有这些数据(包括那些由ld linux
完成的数据,这很奇怪),您需要以类似的方式与PTRACE\u SYSCALL
一起使用。此时,您将能够获取程序计数器和调用堆栈
如果您关注以下文件和文件描述符,请考虑设备。
如果您使用gdb
(在没有DWARF调试信息的程序上使用它会很痛苦),您可以(在gdb
中使用ptrace ptrace_SYSCALL
的方法)找出(可能是“中断”)每个原始系统调用
顺便说一句,可能有些人正在通过openat
系统调用(或在其他地方使用openat
实现其open
C功能)。通过研究特定libc的源代码进行检查。因此(可能是GNU)。好的,那么在这个特定的示例中,我如何发现这个openat
系统调用是如何进行的ptrace
或strace
不会告诉我是谁做的,只是告诉我它是谁做的。你可以使用其他ptrace
调用来查询程序计数器、堆栈指针等,我检查了syscall
没有这样做,我就像我说的那样,我检查了所有openat
变体。你是说,这必然意味着,它一定是由机器指令完成的吗?根据定义,每个系统调用都是由一些机器指令触发的,比如SYSENTER
,INT
,等等。甚至在perf
profilingtools下还有一个测试OK,那么在这个特定的示例中,我该如何发现,这是如何进行的openat
syscallptrace
或strace
不会告诉我是谁做的,只是告诉我它是谁做的。你可以使用其他ptrace
调用来查询程序计数器、堆栈指针等,我检查了syscall
没有这样做,我就像我说的那样,我检查了所有openat
变体。你是说,这必然意味着它一定是由机器指令完成的吗?根据定义,每个系统调用都是由一些机器指令触发的,比如SYSENTER
,INT
,等等。甚至在perf
profiling工具下也有一个测试。你为什么要
openat
openat64
open_by_handle_at
__openat64_2