拦截子进程文件系统活动的方法

时间:2009-06-23 06:07:56

标签: linux winapi filesystems posix hook

我有一个用C编写的小型命令行应用程序,它充当其他程序的包装器/启动器(想想:xargs)。该应用程序编写为在FreeBSD / Linux(通过fork()/ exec())和Windows(CreateProcess())上编译。除了能够拦截,注入或以其他方式操纵子应用程序的命令行参数之外,我想知道是否有一种简单的方法来拦截子程序的文件系统活动(或者它的子项,等等)。我主要感兴趣的是只读取或写入的文件名,而不是所述文件的内容,并希望拦截尽可能轻量级。

在上面搜索一些相关的关键字时,似乎有很多方法可以在Win32中执行此操作。从文件系统筛选器驱动程序到篡改PE导入表头。在我的包装程序的可执行文件中,这些似乎都不可能是微不足道的或者我可以自包含的东西(例如,大多数都需要额外的DLL或驱动程序文件以及主可执行文件。)另外,我希望这可以在Windows XP到7上工作,如果可能的话,无需破解UAC或其他平台增量。这是我的孩子过程,所以我认为我应该能够安全地监控它的活动:)

在Linux上,有inotify(),但它监视一般的文件系统访问,而不考虑我的子进程/ es。 FreeBSD的kqueue()也是如此。这些也在SMP情况下出现故障,其中包装器的多个实例可能正在运行不同的程序,并且每个实例都需要消除彼此之间子进程的文件系统活动的歧义。

我当然感谢SO社区可能提供的任何建议。

2 个答案:

答案 0 :(得分:3)

我要做的唯一建议是使用strace(跟踪系统调用和信号),虽然这更像是一个调试工具,但确实会影响被跟踪过程的性能

strace -f -e trace=file -o <output-file> <cmd-line>

-f - follow forks
-e trace=file - will output system calls related to the file-system
-o <output-file>

恕我直言 - 如果你熟悉strace,它总是在军械库里有用的工具。

答案 1 :(得分:0)

编写一个“内插器”库,它挂接你的fopen并为所有子进程设置LD_PRELOAD环境变量。这适用于动态链接的库。

如何执行此操作的示例可以在此处找到:http://developers.sun.com/solaris/articles/lib_interposers.htmlhttp://lists.debian.org/debian-powerpc/2004/11/msg00039.html显示fopen()插入器的部分实现..