如何将我的dext与DriverKit中的USB设备相匹配



我正在编写一个driverkit扩展,其目标是阻止USB设备,如闪存驱动器。作为起点,我选择了https://developer.apple.com/documentation/driverkit/communicating_between_a_driverkit_extension_and_a_client_app?language=objc

为了不禁用键盘或鼠标,首先我试图将我的dext与一个具体的USB驱动器匹配,我在注册表中找到了它的vendorId(注意六进制到十进制的转换(。问题是,当闪存驱动器插入时,系统与我的dext不匹配,并继续使用系统1。

怎么了?是否需要配置配置文件?有可能以这种方式匹配任何设备吗?

驾驶员权利文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.developer.driverkit</key>
<true/>
<key>com.apple.developer.driverkit.transport.usb</key>
<array>
<dict>
<key>idVendor</key>
<integer>9128</integer>
</dict>
</array>
</dict>
</plist>

Info.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>IOKitPersonalities</key>
<dict>
<key>DeviceControlDriver</key>
<dict>
<key>idVendor</key>
<integer>9128</integer>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleIdentifierKernel</key>
<string>com.apple.kpi.iokit</string>
<key>IOClass</key>
<string>IOUserService</string>
<key>IOProviderClass</key>
<string>IOUSBHostDevice</string>
<key>IOUserClass</key>
<string>DeviceControlDriver</string>
<key>IOUserServerName</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>UserClientProperties</key>
<dict>
<key>IOClass</key>
<string>IOUserUserClient</string>
<key>IOUserClass</key>
<string>DeviceControlDriver</string>
</dict>
</dict>
</dict>
<key>OSBundleUsageDescription</key>
<string></string>
</dict>
</plist>

这里有几个子问题,我将尝试单独解决它们:

为了不禁用键盘或鼠标,首先我试图将我的dext与一个具体的USB驱动器匹配,我在注册表中找到了它的vendorId(注意六进制到十进制的转换(。问题是,当闪存驱动器插入时,系统与我的dext不匹配,并继续使用系统1。

[…]

<key>idVendor</key>
<integer>9128</integer>
…
<key>IOProviderClass</key>
<string>IOUSBHostDevice</string>

在macOS上匹配USB设备遵循非常的特定规则。如果您不遵循Apple文档中列出的匹配模式之一,匹配通常会失败

您正试图单独在idVendor上进行匹配;这将不起作用,您需要在idVendor + idProduct或列出的其他模式之一上进行匹配。

怎么了?是否需要配置配置文件?有可能以这种方式匹配任何设备吗?

如果您希望分发驱动程序,甚至在启用SIP的情况下在本地运行驱动程序,则需要配置文件。请注意,苹果通常只为特定的供应商ID发放授权;如果你的需求超出了这个范围,你需要直接与苹果联系。

对于没有有效代码签名的本地测试,可以禁用SIP;您仍然需要在签名中嵌入有效的授权,但您可以使用与授权不匹配的配置文件。

我正在编写一个驱动程序套件扩展,其目标是阻止USB设备,如闪存驱动器。

请注意,这将在一定程度上受到限制,因为在早期系统引导期间,不考虑第三方kexts和DriverKit扩展进行匹配。这意味着,苹果驱动程序可以声称的任何设备,以及在macOS启动时已经连接的设备,都将始终与苹果自己的驱动程序相匹配,而不是与您的驱动程序匹配。

对于USB,您可以在一定程度上通过使用USBDeviceReEnumerate函数强制重新枚举来解决此问题。请注意,这模拟了硬插拔,因此对于已安装的存储设备,您应该首先干净地卸载,例如。

最新更新