我开发了一个系统,需要使用kext监视文件,该文件注册文件操作范围(KAUTH_SCOPE_FILEOP)。 在OSX 10.8及更早版本中,一切都按预期工作,程序的执行将提供开始执行的程序所需的pid,ppid和文件名。
在vnode范围内,我按照“Mac OS X Internals”一书中的建议检索回调中的pid,如下所示: -
data.pid = vfs_context_pid((vfs_context_t)arg0);
对于我使用的文件范围: -
proc_t self = proc_self();
data.pid = proc_pid(self);
proc_rele(self);
我在小牛队看到的问题发生在应用程序通过xpc生成帮助应用程序时。例如,安装软件包(.pkg)会启动Apple的Installer,它使用相关的“runner”帮助应用程序。
当filescope报告'runner'的执行时,文件路径是正确的,但报告的pid和ppid是父应用程序的安装程序,而不是帮助应用程序的那个。
测试时,注册VNode范围(KAUTH_SCOPE_VNODE)会报告正确的pid和ppid。
如Apple的文档所述,文件操作范围可用于实施防病毒扫描程序。
在这种情况下,如果帮助应用程序的pid和ppid被报告为其父级的pid和ppid,则可能无法检测到帮助应用程序。
有人可以告诉我如何在Mavericks中使用文件操作范围注册时检索正确的pid和帮助应用程序的ppid吗?
答案 0 :(得分:1)
问题在于Apple正在用posix_spawn替换对fork / exec的调用。
posix_spawn的本质意味着在创建实际进程之前通知文件范围,这是查看父pid而不是子pid的原因。
KAuth和文件范围之前的posix spawn,这就是为什么它在这种情况下无效。
解决方案是使用VNode范围。