macOS kexts 能否将代码注入特定进程(就像 mach_inject 那样)?
Could macOS kexts inject code to specific processes (like mach_inject did)?
虽然 mach_inject 是一个方便(但有风险)的解决方案,可以将您的一些代码注入其他应用程序(主要用于自定义 Finder),但自 10.11 起它就不再工作了。
是否有可能通过使用某种 kext 来实现相同的功能?
这样做的目的是在 windows 之上为特定应用程序添加一些视觉效果。也许有一个更简单的解决方案,比如 Accessibility API?
谢谢!
使用kext,你当然可以获得任何进程的任务句柄;这是自 SIP 以来用户 space 不再使用的部分。可以使用 task_get_special_port(task, TASK_KERNEL_PORT, &task_port)
将 kext 中的 task_t
指针转换为特殊端口,然后可以使用 mach_msg_send_from_kernel()
将其发送给用户 space 任务。一旦你在用户 space 中有了端口,你就可以做一些常见的事情,比如在目标任务中分配、读取和写入内存等。但是,如果目标任务设置了非常严格的代码签名标志,任何尝试在未签名的内存页中执行代码将因进程崩溃而失败。这意味着它不适用于大多数 Apple 自己的应用程序。正如您提到的,除代码注入之外的其他方法可能更容易、更安全。
虽然 mach_inject 是一个方便(但有风险)的解决方案,可以将您的一些代码注入其他应用程序(主要用于自定义 Finder),但自 10.11 起它就不再工作了。 是否有可能通过使用某种 kext 来实现相同的功能?
这样做的目的是在 windows 之上为特定应用程序添加一些视觉效果。也许有一个更简单的解决方案,比如 Accessibility API? 谢谢!
使用kext,你当然可以获得任何进程的任务句柄;这是自 SIP 以来用户 space 不再使用的部分。可以使用 task_get_special_port(task, TASK_KERNEL_PORT, &task_port)
将 kext 中的 task_t
指针转换为特殊端口,然后可以使用 mach_msg_send_from_kernel()
将其发送给用户 space 任务。一旦你在用户 space 中有了端口,你就可以做一些常见的事情,比如在目标任务中分配、读取和写入内存等。但是,如果目标任务设置了非常严格的代码签名标志,任何尝试在未签名的内存页中执行代码将因进程崩溃而失败。这意味着它不适用于大多数 Apple 自己的应用程序。正如您提到的,除代码注入之外的其他方法可能更容易、更安全。