从 OSX 10.10/10.11 内核检索进程路径
Retrieve path of process from OSX 10.10/10.11 kernel
我想从 kext 中的 PID 中检索进程的路径,如下所示:Get name from PID? 但是,sys/proc_info.h
和 libproc.h
不再可用(afaik) .
是否有任何其他方法可以从 kext 检索进程 struct proc *p
的 proc_info
?
应该return进程的主要可执行文件vnode
,proc_getexecutablevnode()
的函数在私有KPI中,仅适用于Apple发布的kexts。
它所依赖的信息应该存储在 struct proc
的 p_textvp
字段中,这又不是 public ABI 的一部分 - Apple 可以选择更改其布局,因此即使您确实将其定义导入到您的代码中,您的代码在 OS X 的未来或旧版本中也可能不正确。但是,it turns out this field is NULL
anyway.
您可能能够通过 sysctl 机制获取信息,但我看不到明显的方法。您应该能够通过proc_info()
系统调用获取userspace中的信息。 Apple 没有记录它,但您可以阅读源代码。这是由存储在进程地址 space 中的信息支持的,因此,进程实际上可以伪造它。
最后,如果您的 kext 在启动时加载,您可以通过在 KAUTH_SCOPE_FILEOP
中注册一个 KAUTH 侦听器来自行跟踪进程的可执行文件。事件 KAUTH_FILEOP_EXEC
将在进程(成功)调用其中一个 exec()
函数(包括有问题的 vnode)时告诉您。在 OS X/macOS 上,posix_spawn()
更为常见,因为 fork/exec 被明确禁止用于多线程进程,而 macOS 上的大多数进程都有多个线程.这在这里是相关的,因为由 posix_spawn()
触发的 KAUTH_FILEOP_EXEC
事件处理程序实际上在 parent 进程的上下文中运行。所以你需要做一些额外的争论来将可执行的 vnode 信息与子进程 PID 相关联。
还有一点要注意:请注意,可执行文件的 路径 不一定是明确定义的。与 Windows 不同,正在执行的文件可以移动或删除,因此路径可以改变,或者完全消失。此外,文件可以被硬链接,在这种情况下它们有多个路径。 vnode_t
是标识文件的内核类型,而不管其 name/path/etc。 - 常规用户进程将始终具有可执行文件 vnode
,但 vnode
可能没有有效路径。确保您的代码不期望它。
我想从 kext 中的 PID 中检索进程的路径,如下所示:Get name from PID? 但是,sys/proc_info.h
和 libproc.h
不再可用(afaik) .
是否有任何其他方法可以从 kext 检索进程 struct proc *p
的 proc_info
?
应该return进程的主要可执行文件vnode
,proc_getexecutablevnode()
的函数在私有KPI中,仅适用于Apple发布的kexts。
它所依赖的信息应该存储在 struct proc
的 p_textvp
字段中,这又不是 public ABI 的一部分 - Apple 可以选择更改其布局,因此即使您确实将其定义导入到您的代码中,您的代码在 OS X 的未来或旧版本中也可能不正确。但是,it turns out this field is NULL
anyway.
您可能能够通过 sysctl 机制获取信息,但我看不到明显的方法。您应该能够通过proc_info()
系统调用获取userspace中的信息。 Apple 没有记录它,但您可以阅读源代码。这是由存储在进程地址 space 中的信息支持的,因此,进程实际上可以伪造它。
最后,如果您的 kext 在启动时加载,您可以通过在 KAUTH_SCOPE_FILEOP
中注册一个 KAUTH 侦听器来自行跟踪进程的可执行文件。事件 KAUTH_FILEOP_EXEC
将在进程(成功)调用其中一个 exec()
函数(包括有问题的 vnode)时告诉您。在 OS X/macOS 上,posix_spawn()
更为常见,因为 fork/exec 被明确禁止用于多线程进程,而 macOS 上的大多数进程都有多个线程.这在这里是相关的,因为由 posix_spawn()
触发的 KAUTH_FILEOP_EXEC
事件处理程序实际上在 parent 进程的上下文中运行。所以你需要做一些额外的争论来将可执行的 vnode 信息与子进程 PID 相关联。
还有一点要注意:请注意,可执行文件的 路径 不一定是明确定义的。与 Windows 不同,正在执行的文件可以移动或删除,因此路径可以改变,或者完全消失。此外,文件可以被硬链接,在这种情况下它们有多个路径。 vnode_t
是标识文件的内核类型,而不管其 name/path/etc。 - 常规用户进程将始终具有可执行文件 vnode
,但 vnode
可能没有有效路径。确保您的代码不期望它。