XNU:在kext中获取进程启动和清理通知

时间:2015-09-15 13:57:15

标签: macos kernel xnu

启动流程时收到通知的最佳方式是什么?退出内核扩展?

我知道我可以使用KAuth订阅流程创建(KAUTH_VNODE_EXECUTE)。订阅流程清理怎么样?

2 个答案:

答案 0 :(得分:2)

KAUTH_VNODE_EXECUTE对于所有进程来说都不够;这不会捕获没有exec()的fork()ed进程。在OSX上相当罕见,但并非闻所未闻。尽管MAC(com.apple.kpi.dsep)被Apple标记为不支持,但主要OS X版本之间的ABI更改很常见,但至少有一个用于fork的MAC框架策略回调。

除了定期浏览您自己的进程列表,查找有问题的PID的proc_t,并检查它是否仍然有效之外,我不知道有什么关闭。当然,如果检测到具有循环PID的新过程,这也意味着具有相同PID的先前过程已经死亡。如果您有关于相关过程的额外信息,您可以从其他事件推断过程死亡。

答案 1 :(得分:1)

还有一种方法可以在退出时监控进程。 您可以使用内核事件通知机制(kevent),它是freeBSD的一部分并受OS X支持。

流程从流程启动开始(您可以使用kauth或mac框架方法捕获)。在回调函数中,您需要注册适当的事件以便稍后监视。这是通过使用带有以下参数的EV_SET设置kevent实例来完成的:

kevent.ident = pid
kevent.filter = EVFLT_PROC
kevent.flags = EV_ADD
kevent.fflags = NOTE_EXIT
代码中的

应该如下所示:

EV_SET(&ke, pid, EVFILT_PROC, EV_ADD, NOTE_EXIT, 0, NULL);
kevent(kq, &ke, 1, NULL, 0, NULL);  // registration of ke to kqueue represented by kq descriptor. 

最后,您需要另一个线程来监听这些事件,并在时间到来时(进程退出)捕获它们,再次使用kevent命令。

err = kevent(kq, NULL, 0, &ke, 1, NULL);
if (err == -1)
   err(1, "error in catching the event");

if (ke.fflags & NOTE_EXIT)
    printf("this is what you need ..."); 

有关详情,请查看以下doc