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
我注意到 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