1

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

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

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

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

4

2 回答 2

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,它始终是军械库中的有用工具。

于 2009-06-23T06:28:35.773 回答
0

编写一个“interposer”库来挂钩您的 fopen 并为所有子进程设置 LD_PRELOAD 环境变量。这适用于动态链接库。

如何做到这一点的例子可以在这里找到:http: //developers.sun.com/solaris/articles/lib_interposers.htmlhttp://lists.debian.org/debian-powerpc/2004/11/msg00039.html显示了 fopen() 插入器的部分实现。

于 2009-06-23T19:27:31.267 回答