我有自己的POSIX应用程序启动子进程。我希望通过子进程读取或写入的所有文件的名称以及子进程生成的任何子进程的文件名以及它加载的任何动态库来通知父进程。同样,我需要监视由子进程等产生的所有子进程。
这是怎么做到的?
答案 0 :(得分:1)
我有两个想法。
方法1 - “真实的方式”。
我想你想要ptrace。但它并不容易使用。
本质上,这个调用是用于编写调试器。请注意PTRACE_SYSCALL
步骤直到下一次系统调用。此时,您可以使用更多ptrace
次来查看进程的内存,以观察是否是对open()
的调用。
方法2 - 懒惰,骇客的方式。
您可以使用LD_PRELOAD
环境变量。也就是说,使用您自己要挂钩的调用(例如,open()
,dlopen()
)编写一个共享库,添加自己的代码并调度到正常的libc版本。然后将LD_PRELOAD
环境变量指向此共享库,以便动态链接器在进程启动时加载它。
这种方法的一个缺点是,如果一个进程知道它是以这种方式被观察的,它可以重置环境变量并再次执行自己,并逃避检测。我能想到的另一个问题是,作为一个安全功能,如果你是root用户,那么这个环境变量就不会受到尊重。