Mac OS X下如何通过kext(内核扩展)打开访问硬盘卷
问题描述
在应用中尝试通过如下代码打开(访问)硬盘卷:
int mode=0; int hd_h=-1; const char* device = "/dev/rdisk1"; mode=O_RDWR|mode_basic; hd_h = open(device, mode);
执行上述代码时返回Operation not permitted错误。经调研得知可通过kext实现该需求,目前已编写在内核空间访问硬盘的示例kext(驱动),创建了IOUserClient子类,且已在用户空间调用IOServiceOpen(),需要明确技术实现路径:如何在kext中打开硬盘卷并将访问句柄返回至用户空间?
当前编写的用户空间服务匹配代码如下:
CFDictionaryRef matchingDict = NULL; io_iterator_t iter = 0; io_service_t service = 0; kern_return_t kr; // Create a matching dictionary that will find any USB device matchingDict = IOServiceMatching("com_osxkernel_driver_IOKitTest"); // Create an iterator for all IO Registry objects that match the dictionary kr = IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &iter); if (kr != KERN_SUCCESS) return -1;
实现方案
注意:内核态和用户态地址空间完全隔离,内核态打开设备返回的句柄属于内核态资源,直接传递数值到用户态完全无法使用,正确逻辑是kext内部持有硬盘设备的访问引用,通过IOUserClient的跨态通信通道转发IO请求,不要做跨态直接传递内核句柄的操作。
1. kext侧打开目标硬盘设备
- 不要在内核中硬编码
/dev/rdisk1这类BSD路径,通过IOKit匹配规则定位目标设备:如果要访问整块物理磁盘,匹配IOMedia类且Whole属性为true的实例;如果要访问单个分区卷,匹配对应BSD名称的IOMedia实例即可。 - 匹配到目标设备对象后,调用设备对象的
open(this, 0)方法获取打开引用,打开成功后将该设备对象指针存储在自定义kext类的成员变量中,持有引用直到连接关闭。 - 注意:受SIP(系统完整性保护)锁定的系统卷,即使kext运行在内核态也无法完成写入操作,测试前先确认目标卷不属于SIP保护范围。
2. 基于IOUserClient实现跨态IO转发
- 在自定义的
IOUserClient子类中重写externalMethod方法,自定义一组操作枚举值,分别对应磁盘读、磁盘写、获取磁盘参数、关闭设备几类核心操作。 - 收到用户态传入的对应操作请求时,调用之前持有的存储设备对象的
read/write方法完成实际IO,通过IOExternalMethodArguments提供的输出缓冲区、内存描述符将读取到的数据、操作结果回传给用户态。 - 重写
clientClose方法,当用户态进程退出或主动断开连接时,调用持有设备对象的close(this)方法释放引用,避免内核资源泄漏。
3. 用户态侧逻辑修正
- 现有匹配字典逻辑可正常工作,迭代到匹配的
io_service_t实例后,调用IOServiceOpen(service, mach_task_self(), 0, &connect)获取io_connect_t类型的连接句柄,该句柄是用户态和kext通信的唯一有效凭证。 - 后续所有磁盘IO操作,均通过
IOConnectCallStructMethod/IOConnectCallMethod接口传入对应操作码、参数缓冲区,和kext侧externalMethod的分发逻辑一一对应,完成IO请求的下发和结果接收。 - 所有操作完成后调用
IOServiceClose(connect)主动关闭连接,触发kext侧的资源回收逻辑。
补充说明:macOS 10.15及以上版本对kext的签名、加载权限有极严格的限制,未经过苹果官方公证的kext默认无法加载,测试自研kext需要先关闭SIP。如果是面向普通用户分发的应用,不建议采用kext方案,可优先尝试通过
DiskArbitration框架申请设备访问权限后在用户态直接操作/dev/disk*设备,避免kext带来的系统稳定性风险和审核障碍。
内容的提问来源于stack exchange,提问作者Sudhanshu Pareek
相关产品推荐
相关产品推荐

