在Mac OS X中获取流程创建通知

时间:2011-11-23 22:27:32

标签: macos hook kernel-extension

我正在尝试为Mac OS X编写kext,它将在任何进程启动时收到通知。

在Windows中,您可以通过调用PsSetLoadImageNotifyRoutine(...)来执行此操作,并指定在进程启动时将调用的回调。这是记录的方式,它适用于从Win 2k开始的所有Windows。

Mac有什么相似之处吗?似乎可以使用kauth进程侦听器来实现,但是OS X中从未实现过程范围。

另一个替代方法是挂钩SYS_execve和朋友,但这是未记录和不支持的方式。我真的不想这样走。

我不需要任何取消 - 只是希望在流程开始时得到通知,并获得它的pid&路径。

5 个答案:

答案 0 :(得分:4)

嗯,你的问题有点含糊不清。

当“任何进程启动时”通知“恕我直言”表示fork系统调用,而不是execve。但是我不知道是否可以通过任何官方API通过fork通知您。

如果execve是您感兴趣的内容,请查看kernel authorization (kauth) API

您可以在KAUTH_SCOPE_VNODE注册并跟踪KAUTH_VNODE_EXECUTE,以便在执行exec之前得到通知(并可能通过回调中的返回值拒绝成功);或者在KAUTH_SCOPE_FILEOP注册并跟踪KAUTH_FILEOP_EXEC,以便在执行execve()后收到通知。

答案 1 :(得分:1)

旧问题 - 但是 - 说明SYS_execve挂钩的答案是通知的唯一方法是不正确和危险的。例如,sysent表不会被导出(尽管可以说它很容易找到)。对于两个,你必须修补内存并确保它是rw。

在kext中,更好的方法是使用MAC框架(即强制访问控制)。这是在XNU源中,在/ security分支中。 MAC框架专门用于这种操作 - 即没有实际功能或地址覆盖的通知/挂钩,但带有标注。这也在一本名为“Mac OS X和iOS Internals”的书中详细说明,第14章。

答案 2 :(得分:1)

对于 2019 年后发现此问题的任何人:

Apple 有一个相对较新的 (macOS 10.15+) C 框架,称为 Endpoint Security,它提供进程生命周期事件(除其他外)并且可以由用户模式守护程序或新的“系统扩展”(“内核扩展”的后继者),前提是从 Apple 获得了适当的代码签名权利。一些值得注意的功能是:

  • 高效/事件驱动模型 (es_new_client())
  • 粒度事件类型订阅模型(例如 ES_EVENT_TYPE_NOTIFY_EXECES_EVENT_TYPE_NOTIFY_FORKES_EVENT_TYPE_NOTIFY_EXIT 通过 es_subscribe()
  • 丰富的事件上下文,包括 piduid 等等(例如,用于流程创建的事件消息 (es_event_exec_t) 包括一个 es_process_t 字段,其中包含流程详细信息,包括可执行文件路径)
  • 可以根据源(父)进程(例如 es_mute_process())对事件进行“静音”(屏蔽),以帮助处理信号与噪声和性能影响。

Apple 一直在推动开发人员采用这种新框架,以支持以前的监控 API(例如 KAUTHMACOpenBSM (/dev/auditpipe))所以这是我可以建议投资未来的唯一解决方案。

有一些关于该主题的 WWDC 会议和示例项目:https://developer.apple.com/documentation/endpointsecurity/monitoring_system_events_with_endpoint_security

答案 3 :(得分:0)

SYS_execve挂钩是在任何进程启动时通知的唯一方法。 此外,您可以尝试使用DTrace和libdtrace来接收进程启动通知;我一直在尝试,但没有成功。

答案 4 :(得分:0)