我正在尝试为Mac OS X编写kext,它将在任何进程启动时收到通知。
在Windows中,您可以通过调用PsSetLoadImageNotifyRoutine(...)来执行此操作,并指定在进程启动时将调用的回调。这是记录的方式,它适用于从Win 2k开始的所有Windows。
Mac有什么相似之处吗?似乎可以使用kauth进程侦听器来实现,但是OS X中从未实现过程范围。
另一个替代方法是挂钩SYS_execve和朋友,但这是未记录和不支持的方式。我真的不想这样走。
我不需要任何取消 - 只是希望在流程开始时得到通知,并获得它的pid&路径。
答案 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_EVENT_TYPE_NOTIFY_EXEC
、ES_EVENT_TYPE_NOTIFY_FORK
、ES_EVENT_TYPE_NOTIFY_EXIT
通过 es_subscribe())pid
、uid
等等(例如,用于流程创建的事件消息 (es_event_exec_t) 包括一个 es_process_t 字段,其中包含流程详细信息,包括可执行文件路径)Apple 一直在推动开发人员采用这种新框架,以支持以前的监控 API(例如 KAUTH
、MAC
和 OpenBSM
(/dev/auditpipe
))所以这是我可以建议投资未来的唯一解决方案。
有一些关于该主题的 WWDC 会议和示例项目:https://developer.apple.com/documentation/endpointsecurity/monitoring_system_events_with_endpoint_security
答案 3 :(得分:0)
SYS_execve挂钩是在任何进程启动时通知的唯一方法。 此外,您可以尝试使用DTrace和libdtrace来接收进程启动通知;我一直在尝试,但没有成功。
答案 4 :(得分:0)