3

我想从 kext 中的 PID 中检索进程的路径,如下所示:Get name from PID? 但是,sys/proc_info.h不再libproc.h可用(afaik)。

有没有其他方法可以从 kext中检索proc_info进程?struct proc *p

4

1 回答 1

3

应该返回进程的主要可执行文件的vnode函数proc_getexecutablevnode()位于私有 KPI 中,该 KPI 仅适用于 Apple 发布的 kexts。

它所依赖的信息应该存储在 的p_textvp字段中struct proc,这又不是公共 ABI 的一部分 - Apple 可以选择更改其布局,因此即使您将其定义导入代码,您的代码也可能不正确OS X 的未来或旧版本。然而,事实证明这个字段NULL无论如何都是.

也许可以通过 sysctl 机制获取信息,但我看不到明显的方法。您应该能够通过proc_info()系统调用获取用户空间中的信息。Apple 没有记录它,但您可以阅读源代码。这是由存储在进程地址空间中的信息支持的,因此,进程实际上可以伪造它。

最后,如果您的 kext 在引导时加载,您可以通过在KAUTH_SCOPE_FILEOP. KAUTH_FILEOP_EXEC每当进程(成功)调用其中一个函数时,该事件都会告诉您exec(),包括有问题的 vnode。在 OS X/macOSposix_spawn()上更为常见,因为 fork/exec 被明确禁止用于多线程进程,并且 macOS 上的大多数进程都有多个线程。这在这里是相关的,因为KAUTH_FILEOP_EXEC触发的事件处理程序posix_spawn()实际上是在进程的上下文中运行的。所以你需要做一些额外的争论来将可执行的 vnode 信息与子进程 PID 关联起来。

还有一点需要注意:请注意,可执行文件的路径不一定是明确定义的。与 Windows 不同,正在执行的文件可以移动或删除,因此路径可以更改或完全消失。此外,文件可以被硬链接,在这种情况下它们有多个路径。vnode_t是标识文件的内核类型,无论其名称/路径/等如何。- 常规用户进程将始终具有可执行文件vnode,但vnode可能没有有效路径。确保您的代码不会出现这种情况。

于 2015-11-16T17:03:29.960 回答