【问题标题】:Subscribe on new process creation from kext and get the pid of this process从 kext 订阅新进程创建并获取该进程的 pid
【发布时间】:2014-04-24 17:12:21
【问题描述】:

我正在尝试在我的 kext 中获取有关新创建进程的通知。根据Get process creation notification in Mac OS X我已经订阅了KAUTH_FILEOP_EXEC

但由于一些奇怪的原因,我只有 2 个参数可用 - vnode 和文件名 (https://developer.apple.com/library/mac/technotes/tn2127/_index.html)。

那个时候应该已经创建了进程并且有一个pid,但是内核没有给我。

此时是否可以获取pid?

还有其他方法可以从 kext 订阅新进程创建并获取该进程的 pid 吗?

【问题讨论】:

    标签: macos kernel kernel-extension mach


    【解决方案1】:

    是的,您绝对可以从文件范围内获取 pid:-

    #include <sys/proc.h>
    
    proc_t self = proc_self();
    int pid = proc_pid(self);
    
    // ensure you release the reference to self
    proc_rele(self);
    

    【讨论】:

    • 这是一个创建进程的进程 pid,而不是一个新的进程 pid
    • @GeorgyBuranov,对不起,它对我有用。我在当前项目中使用它,它返回启动过程的 pid。
    • @GeorgyBuranov 请注意,KAUTH_FILEOP_EXEC 通知发生在选择新的可执行文件成功之后,但在进程完全转换到新的可执行文件之前(它仍然以fork()ed 的任何方式运行)。因此,如果您检查proc_t 对象,在某些方面它肯定仍然对应于旧的可执行文件,但它肯定是新进程。有关详细信息,请参阅 xnu 源代码(grep for KAUTH_FILEOP_EXEC 并从那里开始)
    • 奇怪的是,current_task() 返回父进程的 Mach 任务,而 proc_self() 是子进程的。
    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2011-02-02
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多