【问题标题】:Can I obtain a task in KEXT?我可以在 KEXT 中获得任务吗?
【发布时间】:2023-03-23 06:02:01
【问题描述】:

只是想知道是否有可能在 kext 中为给定的 proc_t 获取任务。 我尝试了 task_for_pid() ,但由于某种我不记得的原因它不起作用。 我尝试了 sys/proc.h 中的 proc_task(proc_t p) 但我无法加载我的 kext,因为该函数未导出。

我猜我做错了什么,但我不知道是什么。假设我可以获得一个进程的任务,我想使用一些马赫调用并分配内存、写入内存等等,但为此,我需要我相信的任务。

【问题讨论】:

    标签: macos kernel-extension


    【解决方案1】:

    很遗憾,我不知道公共直接 proc_t->task_t 查找 KPI。

    但是,在某些情况下,您可能可以不使用 current_task() 并在需要时一直使用该指针。使用task_referencetask_deallocate 进行引用计数(但显然不要永远持有引用,否则它们永远不会被释放)。也可以通过全局变量kernel_task随时访问内核的任务(对应进程0)。

    【讨论】:

    • 有趣的是,您可以从用户空间的角度访问任务并执行各种操作,但不能从 KEXT 执行相同操作。来自 Windows 世界,这有点反直觉 :) 但我每天都在学习。
    • 是的,我的印象是公共 KPI 和非公共 KPI 背后几乎没有系统。我怀疑 Apple 决定了它希望允许 3rd 方开发人员创建什么样的 kext,并且基本上只是编制了 Apple 自己的这些类型的 kext 所需的符号列表,并将它们公开。此后添加了各种零碎物品。
    【解决方案2】:

    经过一些研究,似乎并非如此。 proc.h 中定义了 proc_task(),但它位于#ifdef KERNEL_PRIVATE 之下。尽管有警告,但 KEXT 将编译。

    为了使用该功能,您必须将 com.apple.kpi.private 添加到依赖项列表中,但即使这样做也会失败,因为您很可能不是 Apple :)

    只有 Apple kexts 可以链接到 com.apple.kpi.private。

    无论如何,这个实验很有趣,因为其他 API,如 vm_read、vm_write 等不能在 KEXT 中使用(这可能是有道理的,因为它们是在 vm_user.h 中声明的,我想它们是为用户模式)。

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-15
      • 1970-01-01
      • 2011-09-04
      • 2017-05-25
      相关资源
      最近更新 更多