尝试通过具有更高探测分数的OS X kext禁用设备访问

时间:2015-09-21 14:39:36

标签: macos iokit kernel-extension facetime

我需要禁用对某些设备(例如内置FaceTime Camera)的访问权限,并且一直试图通过提供一个比当前附加的探针得分更高的简单kext来实现这一目的。

我的kext与IOProviderClass IOUSBInterface和IOProviderClass IOUSBDevice匹配并附加到相机,但所有原始kext仍然附加到它。这就是它在IORegistryExplorer中的表现:

FaceTime HD Camera (Built-in)@14700000   # USB device
+-- FaceTime HD Camera (Built-in)@0      # USB interface
|   +-- FaceTimeDisabler                 # my kext matching as IOUSBInterface
|   +-- IOUSBInterfaceUserClientV3       # original
+-- IOUSBDeviceUserClientV2              # original
+-- IOUSBInterface@1                     # original
|   +-- IOUSBInterfaceUserClientV3       # original
+-- IOUSBInterface@2                     # original
+-- FaceTimeDisabler                     # my kext matching as IOUSBDevice

我认为设备和驱动程序匹配的重点是选择一个kext连接到设备,所以我希望如果我的kext与最高的探测分数相匹配,它将获得对设备的独占控制,但这清楚事实并非如此。

我的问题是这些:

  1. 如何确保我的kext获得对设备的独占访问权?
  2. 如果有更好的方法来禁止访问设备,它是什么?

1 个答案:

答案 0 :(得分:2)

如果您要声明对USB设备或接口的独占访问权限,则需要open() nub对象,指定kUSBOptionBitOpenExclusivelyMask参数中的options位。

因此,在FaceTimeDisabler的{​​{1}}方法中,请执行以下操作:

start()

然后在您的IOUSBNub* usb_provider = OSDynamicCast(IOUSBNub, provider); if (usb_provider == nullptr) { IOLog("FaceTimeDisabler: Provider is not USB nub\n"); return false; } bool got_exclusive_access = usb_provider->open(this, kUSBOptionBitOpenExclusivelyMask); this->opened = got_exclusive_access; if (!got_exclusive_access) { IOLog("FaceTimeDisabler: failed to acquire exclusive access to camera USB device/interface.\n"); return false; } 方法中,确保在时进行相应的stop()调用,并且仅当<{strong>} close()成功时才open()在上面的例子中是正确的。)

请注意,this->opened标志仅适用于USB系列,即使kUSBOptionBitOpenExclusivelyMask存在于任何地方。在open()对象上,IOPCIDevice隐含了排他性,因此当您尝试阻止访问基于PCI的FaceTime摄像头时,不要传递USB独占位,而是调用{{1} } / open()。 (我的2015年13“rMBP相机是基于PCI的 - 供应商ID open,设备ID close,类代码0x14e4