【问题标题】:Objective C API for Checking File Download from Browser on OSX用于在 OSX 上检查从浏览器下载文件的 Objective C API
【发布时间】:2016-03-22 04:51:13
【问题描述】:

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

【问题讨论】:

    标签: objective-c macos file-access dtrace kernel-extension


    【解决方案1】:

    FSEvents 允许您收到有关目录和以下所有内容更改的通知。它是一个 C API,因此当然可以在 ObjcC 中使用。有很多可用的例子。

    【讨论】:

    • 当然可以。但是用户可以在他们的 Mac 上将文件下载到他们想要的任何地方,因此 TO 的应用程序必须收到每个可用目录的通知。但也许扫描默认的“下载”文件夹(或者用户的主文件夹及以下文件夹)可能就足够了。
    【解决方案2】:

    我能想到几个解决方案。

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

    2) 既然你用kext 标记了它,你可能想在内核事件层做点什么。考虑Kernel QueuesLooking 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.

    【讨论】:

    • 您的第一个链接(在 Launch Agents 上)似乎是一个死链接——我的浏览器就在那里等待。
    • GCD 教程仅展示了如何检测对特定文件的更改。我在 Twitter 上联系了作者,看看它是否可用于检测 /Users/mike/*(我的主文件夹)的更改。
    • 我使用了 this LaunchAgent 示例和 WatchPaths 选项。我用一个输出到 /tmp/output.txt 并带有附加信息的 bash 脚本来切换它。它告诉我下载中发生了文件事件,但没有告诉我文件名。所以,我不能用我正在编码的工具扫描那个文件。它似乎还在一遍又一遍地运行,从未停止过,即使我没有在我的下载文件夹中进行任何文件活动。
    • 我试图让 GCD 示例在单个文件上工作——什么也没发生。然后我尝试this example 检查 FSEvents 更改,但它也不起作用。所以,我还是卡住了。
    【解决方案3】:

    我无法单独在 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 调用。)

    这是我刚刚运行的一个示例,以检测我何时将 example.txt 从 Google Chrome 浏览器下载到我的 /Users/mike/Downloads/test 文件夹中。请注意,只有一个 open 系统调用。因此,您需要在mds(代表 Apple 的元数据服务工作者)上进行 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
    

    【讨论】:

      猜你喜欢
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2014-09-09
      • 2015-10-27
      • 2019-07-19
      相关资源
      最近更新 更多