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

3
我正在尝试编写适用于Mac OS X的内核扩展,可以在任何进程启动时得到通知。
在Windows中,您可以调用PsSetLoadImageNotifyRoutine(…)并指定回调来在进程启动时调用它。这是一种被记录下来的方式,在从Win 2k开始的所有Windows版本中都有效。
那么,在Mac上是否有类似的东西呢?使用kauth进程监听器似乎可以实现这一点,但OS X从未实现过进程范围。
另一个选择是挂钩SYS_execve和friends,但这是未记录和不支持的方式。我真的不想这样做。
我不需要取消 - 只想在进程启动时得到通知,并获取其pid和路径。
5个回答

5

嗯,您的问题有点模糊。

我认为“当任何进程启动时得到通知”是指 fork 系统调用,而不是 execve。然而,我不知道是否可以通过任何官方API在 fork 时得到通知。

如果您感兴趣的是 execve,请看一下内核授权(kauth)API

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


这是一条非常好的信息!我刚刚尝试了一下,它确实有效。然而,这仅适用于进程启动事件。如何获取进程退出事件? - Petr Kizima
这种方式将无法正常工作。就像我之前说的,最好为任务设置钩子。 - Alexander Stavonin

2
对于任何在2019年之后看到这个问题的人:
苹果有一个相对较新的(macOS 10.15+)C框架,称为Endpoint Security,它提供了进程生命周期事件(以及其他内容),可以由用户模式守护程序或新的“系统扩展”(继承了“内核扩展”的位置)使用,前提是从苹果获得了适当的代码签名授权。一些值得注意的功能包括:
  • 高效/事件驱动模型(es_new_client()
  • 细粒度事件类型订阅模型(例如,通过es_subscribe(), ES_EVENT_TYPE_NOTIFY_EXEC, ES_EVENT_TYPE_NOTIFY_FORK, ES_EVENT_TYPE_NOTIFY_EXIT
  • 丰富的事件上下文,包括piduid等等(例如,进程创建的事件消息(es_event_exec_t)包括一个es_process_t字段,其中包括可执行文件路径等进程详细信息)
  • 可以基于源(父)进程对事件进行“静音”(掩码)(例如,es_mute_process()),以帮助处理信号与噪声和性能影响。
苹果一直在推动开发者采用这个新框架,而不是之前的监控API(如KAUTH、MAC和OpenBSM(/dev/auditpipe)),因此这是我唯一可以推荐继续投资的解决方案。
有一些关于这个主题的WWDC会议和示例项目可供参考:https://developer.apple.com/documentation/endpointsecurity/monitoring_system_events_with_endpoint_security

1

旧问题 - 但是 - 声称只有通过SYS_execve挂钩才能被通知的答案是不正确和危险的。首先,sysent表没有被导出(尽管可以认为它很容易被找到)。其次,您必须修补内存并确保它是可读写的。

在内核扩展中,更好的方法是使用MAC框架(即强制访问控制)。这在XNU源代码的/security分支中。MAC框架专门设计用于这种操作 - 即通过调用而非实际函数或地址覆盖来进行通知/挂钩。这也在一本名为“Mac OS X and iOS Internals”的书的第14章中详细说明。



0

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


你好,Александр。感谢回复。我认为挂钩SYS_execve不是一个正确的选择,因为我的kext会被大多数杀毒软件标记为rootkit。这种方法似乎相当不稳定,因为定位sysent表可能会很棘手。此外,使用libdtrace似乎也不是一个好主意,因为接口可能会改变,所以我将不得不重新编译我的代码。我想知道,在用户模式应用程序中是否可以获得有关进程启动/结束的通知?我想知道,在Mac OS中,大多数杀毒软件是如何做到这一点的?挂钩系统调用吗? - Petr Kizima
用户模式应用程序无法获取有关进程启动/结束的通知。杀毒软件会挂钩系统调用。如果时间滞后对您不重要,您可以使用此信息。 (http://macosinternals.com/index.php?option=com_content&view=article&id=7:how-to-obtain-processes-list&catid=3:xnu&Itemid=6) - Alexander Stavonin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接