如何访问 kext 中包含的类/函数 (Objective-C)
内核扩展不仅能够在内核级别执行代码,而且还可以使内核级别数据可供更高级别的事物使用,对吗?这就是英特尔 PowerGadget 访问内核级信息的方式,因为它有一个可以从中提取该信息的 kext。
我的问题是,我如何通过我自己的 Objective-C 代码从 kext 访问信息?我可以访问某个功能吗?还是一个班?我该怎么做这样的事呢?
Kernel extensions are able to execute code at kernel levels but also make kernel level data available to higher level things, right? That's how Intel PowerGadget accesses kernel level info, because it has a kext that it pulls that info from.
My question is, How would I access info from a kext via my own Objective-C code? Can I access a function? Or a class? How would I do such a thing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
现代 macOS 内核扩展(当您绝对必须使用它们时 - 对于许多类型的驱动程序,现在 DriverKit 或用户空间中有替代方案)使用 I/O Kit。使用
IOKit
用户空间框架,您可以访问由您的kext实现的I/O Kit服务。IOService
子类中的setProperties()
函数来显式选择。 (同时要格外小心,只允许设置“安全”属性并验证所有输入。)IOService
子类中的newUserClient
方法(该方法可以被覆盖,或者默认返回 IOUserClientClass 指定的类的实例) Info.plist 的 IOKitPersonality 中的属性),并且当您从用户空间调用IOConnectCall*
函数之一时,这会调用 IOUserClient 子类中的externalMethod
函数。Modern macOS kernel extensions (when you absolutely must use them - for many types of driver, there are now alternatives in DriverKit or user space) use the I/O Kit. Using the
IOKit
user space framework, you can access the I/O Kit services implemented by your kext.setProperties()
function in your kext'sIOService
subclass. (While taking extreme care to only allow setting "safe" properties and validating all inputs.)IOUserClient
subclass - the keys here are that callingIOServiceOpen
from user space invokes thenewUserClient
method in yourIOService
subclass (which can be overridden or by default returns an instance of the class specified by the IOUserClientClass property in your Info.plist's IOKitPersonality), and that when you call one of theIOConnectCall*
functions from user space, this calls theexternalMethod
function in your IOUserClient subclass.