Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在Mac OS X中获取进程创建通知_Macos_Hook_Kernel Extension - Fatal编程技术网

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

Macos 在Mac OS X中获取进程创建通知,macos,hook,kernel-extension,Macos,Hook,Kernel Extension,我正在尝试为MacOSX编写kext,它将在任何进程启动时收到通知 在Windows中,可以通过调用PsSetLoadImageNotifyRoutine(…)并指定进程启动时将调用的回调来完成此操作。这是一种文档化的方式,它可以在从Win 2k开始的所有窗口中工作 Mac有类似的产品吗?使用kauth进程侦听器似乎可以实现这一点,但进程范围从未在OSX中实现过 另一种方法是钩住SYS_execve和friends,但这是一种未记录且不受支持的方法。我真的不想走这条路 我不需要任何取消操作-只希

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

在Windows中,可以通过调用PsSetLoadImageNotifyRoutine(…)并指定进程启动时将调用的回调来完成此操作。这是一种文档化的方式,它可以在从Win 2k开始的所有窗口中工作

Mac有类似的产品吗?使用kauth进程侦听器似乎可以实现这一点,但进程范围从未在OSX中实现过

另一种方法是钩住SYS_execve和friends,但这是一种未记录且不受支持的方法。我真的不想走这条路


我不需要任何取消操作-只希望在进程启动时收到通知,并获取其pid和路径。

任何进程启动时,只有通过SYS\u execve挂钩才能收到通知。
另外,您可以尝试使用DTrace和libdtrace来接收进程启动通知;我一直在尝试,但没有成功。

好吧,你的问题有点模棱两可

“任何进程启动时收到通知”IMHO表示
fork
系统调用,而不是
execve
。但是,我不知道是否可以通过任何官方API在
fork
上通知您

如果您感兴趣的是
execve
,请查看


您可以在
KAUTH\u SCOPE\u VNODE
中注册并跟踪
KAUTH\u VNODE\u EXECUTE
,以便在execve执行之前收到通知(并可能通过回调返回值来拒绝它成功);或者在执行
execve()
后,在
KAUTH\u SCOPE\u FILEOP
中注册并跟踪要通知的
KAUTH\u FILEOP\u EXEC

旧问题-但是-声明系统执行挂钩是唯一通知方式的答案是不正确和危险的。首先,sysent表没有导出(尽管可以很容易地找到它)。第二,你必须修补内存并确保它是rw


在kext中,更好的方法是使用MAC框架(这将是强制访问控制)。这在XNU源代码中,在/security分支中。MAC框架正是为这类操作而设计的——即通知/挂接,没有实际的功能或地址覆盖,但有调用。这一点在第14章《MacOSX和iOS内部结构》一书中也有详细介绍。

下面是一个使用Mac和KAUTH的示例


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

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

  • 高效/事件驱动模型()
  • 细粒度事件类型订阅模型(例如,
    ES\u event\u type\u NOTIFY\u EXEC
    ES\u event\u type\u NOTIFY\u FORK
    ES\u event\u NOTIFY\u EXIT
    via)
  • 丰富的事件上下文,包括
    pid
    uid
    ,以及更多内容(例如,用于流程创建的事件消息()包括一个包含流程详细信息的字段,包括可执行路径)
  • 可以根据源(父)进程(例如)对事件进行“静音”(屏蔽),以帮助处理信号v。噪音和性能影响
一段时间以来,苹果一直在推动开发人员采用这种新框架,以支持以前的监控API(如
KAUTH
MAC
OpenBSM
/dev/auditpipe
),因此,这是我可以推荐投资的唯一解决方案


关于这一主题,有一些WWDC会议和示例项目可用:

HelloАааааааа。谢谢你的回复。我不认为挂接SYS_execve是一个正确的选择,因为我的kext将被大多数抗病毒药物标记为rootkit。这种方法似乎非常不稳定,因为定位sysent表可能很棘手。另外,使用libdtrace似乎不是一个好主意,主要是因为接口可能会更改,所以我必须重新编译代码。我想知道,在用户模式应用程序中,我是否可以获得有关进程开始/结束的通知?我想知道,大多数抗病毒药物是如何在Mac OS中发挥作用的?挂接系统调用?在用户模式应用程序中,无法获取有关进程开始/结束的通知。抗病毒药物正在钩住系统调用。如果时间延迟对您不重要,您可以使用这是一个极好的信息!我只是试了一下,效果不错。但是,这仅适用于进程启动事件。如何获取进程退出事件?这种方式无法正常工作。正如我前面所说的,我们最好为任务设置挂钩。