File 在POSIX环境中,如何跟踪子进程访问的文件?
我有自己的POSIX应用程序,它启动一个子进程。我希望向父进程通知子进程读取或写入的所有文件的名称,以及子进程生成的任何子进程的文件名,以及它加载的任何动态库。类似地,我需要监视子进程生成的所有子进程,等等File 在POSIX环境中,如何跟踪子进程访问的文件?,file,monitoring,posix,File,Monitoring,Posix,我有自己的POSIX应用程序,它启动一个子进程。我希望向父进程通知子进程读取或写入的所有文件的名称,以及子进程生成的任何子进程的文件名,以及它加载的任何动态库。类似地,我需要监视子进程生成的所有子进程,等等 这是怎么做到的?我有两个想法 方法1——真正的方法 我想你想要。但是它不容易使用 本质上,此调用用于编写调试器。请注意,PTRACE_SYSCALL将一直执行到下一个系统调用。此时,您可能可以使用更多的ptrace调用查看进程的内存,以观察它是否是对open()的调用 方法2——懒惰、刻薄的
这是怎么做到的?我有两个想法 方法1——真正的方法 我想你想要。但是它不容易使用 本质上,此调用用于编写调试器。请注意,
PTRACE_SYSCALL
将一直执行到下一个系统调用。此时,您可能可以使用更多的ptrace
调用查看进程的内存,以观察它是否是对open()
的调用
方法2——懒惰、刻薄的方式
您可以使用LD\u PRELOAD
环境变量。也就是说,编写一个共享库,其中包含您想要钩住的调用的自己的实现(例如,open()
,dlopen()
),添加您自己的代码并分派到正常的libc版本。然后将LD_PRELOAD
环境变量指向此共享库,以便动态链接器在进程启动时加载它
这种方法的一个缺点是,如果一个进程知道它正在以这种方式被观察,它可以重置环境变量并再次执行自身,从而逃避检测。另一个我能想到的是,作为一个安全特性,如果您是root用户,这个环境变量就不受欢迎。对此我有两个想法 方法1——真正的方法 我想你想要。但是它不容易使用 本质上,此调用用于编写调试器。请注意,
PTRACE_SYSCALL
将一直执行到下一个系统调用。此时,您可能可以使用更多的ptrace
调用查看进程的内存,以观察它是否是对open()
的调用
方法2——懒惰、刻薄的方式
您可以使用LD\u PRELOAD
环境变量。也就是说,编写一个共享库,其中包含您想要钩住的调用的自己的实现(例如,open()
,dlopen()
),添加您自己的代码并分派到正常的libc版本。然后将LD_PRELOAD
环境变量指向此共享库,以便动态链接器在进程启动时加载它
这种方法的一个缺点是,如果一个进程知道它正在以这种方式被观察,它可以重置环境变量并再次执行自身,从而逃避检测。我能想到的另一个问题是,作为一个安全特性,如果您是root用户,那么这个环境变量是不受尊重的