【问题标题】:Mac OS : is there any way to sniff system open call without kernelMac OS:有没有办法在没有内核的情况下嗅探系统打开调用
【发布时间】:2018-07-22 23:47:49
【问题描述】:

我必须从 Mac OS 中的任何位置打开一个文件,并且我想在它在任何相关应用程序中打开之前进行一些操作。有什么办法可以嗅探系统打开调用并保持一段时间并进行一些操作。

例如,我正在打开 test.doc 文件,该文件将在 msword 应用程序中打开,或者可以通过右键单击选择任何其他应用程序并打开。我想在我的 text.doc 文件上启动这个 ms word 应用程序或任何相关应用程序(系统打开调用)之前执行一些操作。

Mac OS (C/C++/ObjectiveC/Swift) 的编程语言有什么方法可以不用进入内核。

我们将不胜感激任何帮助。

【问题讨论】:

  • 您到底需要什么?使用 bash 命令open -a "Application name" file.extension 你可以打开任何东西,因此如果你在这个打开之前写一些脚本来完成一些工作,你就会得到你想要的。我希望我理解你是正确的。
  • 我可以打开文件并在打开之前添加我的逻辑。但是,如果一个普通用户在第三方应用程序中从 finder 打开一个文件,我不能持有它,我没有那个事件。
  • 要求是:如果用户打开系统中的任何文件,我的应用程序会知道,这个文件将要打开,然后我可以做我的操作并打开文件。它的一种覆盖/嗅探系统的开放调用

标签: swift macos filesystems kernel-extension


【解决方案1】:

据我所知,完全拦截/挂钩系统调用只能在 kext 中完成。

如果是针对特定应用程序,并且该应用程序支持动态加载的插件,您可以编写一个挂接系统调用的插件。

原则上,即使应用程序不支持插件,您也可以将代码注入进程并挂钩该进程的 open() 系统调用。 (例如使用 mach_inject)用户在 Finder 中双击文件,这将启动应用程序并立即打开文件,您可以在其中注入代码的时间窗口非常小。我不认为只有用户空间代码可以可靠地做到这一点。

【讨论】:

  • mach_inject 作为一个选项可能不再值得一提——像 Finder 这样的系统应用程序受 SIP 保护,不能成为目标。 (task_for_pid() 会失败。)
  • 感谢您提供的信息。有示例代码吗?
  • 代码注入和库函数覆盖比 Stack Overflow 的答案要复杂得多。 (我在一个客户项目中使用了这种技术,那部分代码仅是大约 400 LOC。)
【解决方案2】:

即使使用内核扩展,由于内核中的各种保护措施(例如 KASLR),挂钩系统调用也不再可行。使用 Mojave,由于 SIP,代码注入将不再可行。唯一支持的方法是使用Kernel Authorisation (KAuth) framework

【讨论】:

    猜你喜欢
    • 2019-06-17
    • 1970-01-01
    • 2017-10-13
    • 2011-11-16
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多