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

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

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

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

有帮助吗?

解决方案

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

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

其他提示

我要做的唯一建议是使用 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 ,它总是在军械库里有用的工具。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top