3

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

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

Mac有类似的东西吗?使用 kauth 进程侦听器似乎可以实现这一点,但进程范围从未在 OS X 中实现。

另一种选择是挂钩 SYS_execve 和朋友,但这是未记录且不受支持的方式。我真的不想走这条路。

我不需要任何取消 - 只想在进程启动时收到通知,并获取它的 pid 和路径。

4

5 回答 5

5

嗯,你的问题有点模棱两可。

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

如果execve您对此感兴趣,请查看内核授权 (kauth) API

您可以在 execve 执行之前注册KAUTH_SCOPE_VNODE并跟踪以KAUTH_VNODE_EXECUTE获取通知(并可能通过回调的返回值拒绝它成功);或注册KAUTH_SCOPE_FILEOP并跟踪KAUTH_FILEOP_EXEC以在执行后得到通知execve()

于 2012-04-25T22:45:32.397 回答
1

老问题 - 但是 - 说明 SYS_execve 挂钩是唯一得到通知的方法的答案是不正确且危险的。一方面,没有导出 sysent 表(尽管可以说它很容易找到)。对于两个,您必须修补内存并确保它是 rw。

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

于 2013-03-11T04:37:01.130 回答
1

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

Apple 有一个相对较新的(macOS 10.15+)C框架,称为Endpoint Security,它提供进程生命周期事件(除其他外),可以由用户模式守护进程或新的“系统扩展”(“内核扩展”的继承者)使用前提是从 Apple 获得了正确的代码签名权利。一些显着的特点是:

  • 高效/事件驱动模型(es_new_client()
  • 粒度事件类型订阅模型(例如ES_EVENT_TYPE_NOTIFY_EXEC,通过es_subscribe(ES_EVENT_TYPE_NOTIFY_FORK ) )ES_EVENT_TYPE_NOTIFY_EXIT
  • 丰富的事件上下文,包括pid,uid等等(例如,用于进程创建的事件消息 ( 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

于 2021-01-27T16:43:51.070 回答
0

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

于 2011-11-25T02:04:20.740 回答
0

这是一个使用 MAC 和 KAUTH 的示例。

https://www.synack.com/2015/11/17/monitoring-process-creation-via-the-kernel-part-i/

于 2016-10-29T13:41:44.103 回答