Objective C API 用于在 OSX 上检查从浏览器下载的文件

Objective C API for Checking File Download from Browser on OSX

我注意到 Mac OSX 的 Sophos Anti-Virus 当我下载文件时,它会立即扫描它。这在我安装和测试的任何浏览器中都没有浏览器插件。因此,在 OSX 上,人们在应用程序中使用什么 Objective C API 来检测文件是从浏览器下载的?我注意到人们推荐 DTrace 命令(和衍生脚本),但是 OSX 的 El Capitan 版本破坏了那个命令。

FSEvents 允许您在目录和下面的所有内容发生变化时得到通知。它是一个 C API,因此在 ObjcC 中当然可用。有很多可用的示例。

我能想到几个解决方案。

1) use a Launch Agent to watch when your Downloads folder is modified,然后它可以启动一个助手应用程序(用 Objective C 编写)来做一些事情。

2) 因为你用 kext 标记了这个,你可能想在内核事件层做一些事情。考虑 Kernel Queues. Looking at this tutorial, it appears that this runs at the user level.

3) 并且可以使用 GCD 来监视文件系统事件(+1 给 Gerd!),here's another tutorial I found by the same author of the previous one

More information might be available here.

我无法单独在 Objective C 中取得某些成就,但我可能有一个 /Library/LaunchDaemon 可以使用 Objective C 应用程序来 运行 /usr/bin/fs_usage命令检测事件,然后解析,然后运行对文件进行扫描。 Objective C 脚本可以使用 C 的 popen() API 在后台任务中打开该命令,然后扫描它以查找更改。这必须以 运行 为 root,这就是为什么从 /Library/LaunchDaemon 调用它的原因(当然,必须知道如何制作 launchd plist 文件)。 (当然,你也可以制作一个 C/C++ 或其他方式来启动这个过程并过滤它,包括一个 Perl 脚本,全部从 /Library/LaunchDaemon 调用。)

这是一个例子,当我从 Google Chrome 浏览器下载 example.txt 到我的 /Users/mike/Downloads/test 文件夹时,我只是 运行 检测到。请注意,只有一个 open 系统调用。因此,您需要在代表 Apple 的元数据服务工作者的 mds 上进行 grep,然后查找 open 调用,该调用只会在从浏览器下载文件时发生一次,然后从中获取路径名以便扫描该文件。

sh-3.2# fs_usage -w -f pathname | grep '/Users/mike/Downloads/test' | grep mds
14:26:08.424743  getattrlist                            /Users/mike/Downloads/test/example.txt                                                                                                  0.000023   mds.3432456
14:26:08.424750  open              F=20       (R_____)  /Users/mike/Downloads/test/example.txt                                                                                                  0.000007   mds.3432456
14:26:08.478919  getattrlist                            /Users/mike/Downloads/test/example.txt                                                                                                  0.000057   mds.3432457
14:26:08.504923  stat64                                 /Users/mike/Downloads/test/example.txt                                                                                                  0.000018   mds.3432457
14:26:08.504969  fsgetpath                              /Users/mike/Downloads/test/example.txt                                                                                                  0.000005   mds.3432457
14:26:08.505001  stat64                                 /Users/mike/Downloads/test/example.txt                                                                                                  0.000020   mds.3432457
14:26:08.505076  getattrlist                            /Users/mike/Downloads/test/example.txt                                                                                                  0.000021   mds.3432457
14:26:08.505126  listxattr                              /Users/mike/Downloads/test/example.txt                                                                                                  0.000032   mds.3432457