Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 在POSIX环境中,如何跟踪子进程访问的文件?_File_Monitoring_Posix - Fatal编程技术网

File 在POSIX环境中,如何跟踪子进程访问的文件?

File 在POSIX环境中,如何跟踪子进程访问的文件?,file,monitoring,posix,File,Monitoring,Posix,我有自己的POSIX应用程序,它启动一个子进程。我希望向父进程通知子进程读取或写入的所有文件的名称,以及子进程生成的任何子进程的文件名,以及它加载的任何动态库。类似地,我需要监视子进程生成的所有子进程,等等 这是怎么做到的?我有两个想法 方法1——真正的方法 我想你想要。但是它不容易使用 本质上,此调用用于编写调试器。请注意,PTRACE_SYSCALL将一直执行到下一个系统调用。此时,您可能可以使用更多的ptrace调用查看进程的内存,以观察它是否是对open()的调用 方法2——懒惰、刻薄的

我有自己的POSIX应用程序,它启动一个子进程。我希望向父进程通知子进程读取或写入的所有文件的名称,以及子进程生成的任何子进程的文件名,以及它加载的任何动态库。类似地,我需要监视子进程生成的所有子进程,等等


这是怎么做到的?

我有两个想法

方法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用户,那么这个环境变量是不受尊重的