macOS DriverKit:制作 PCI dext 来替换内置驱动程序

2023-12-02

我正在尝试在 DriverKit 中编写一个用户空间 PCI 驱动程序,用于教育/研究目的。我找到了一个来自 WorthDoingBadly 的示例其中包含 PCI 设备 dext 的样板代码(我已删除了漏洞利用代码)。

我已将其修改为通过以下方式匹配 Thunderbolt PCI NVMe 设备IOPCIPrimaryMatch钥匙。我已经能够在禁用 SIP 的情况下编译、签名和加载它systemextensionsctl developer on.

当我的设备插入电源时就会出现问题Start我的驱动程序中的函数被调用。我尝试打电话ivars->pciDevice->Open(this, 0);在设备上,失败并显示0xe00002cd“(iokit/common)设备未打开”。

同时,我可以在内核日志中看到,当调用我的驱动程序时,内置 NVMe 驱动程序已经在初始化。

如果我跳过呼叫Open只需致电RegisterService();,我可以在 IORegistryExplorer.app 中看到,IONVMeController 和我的“PCICrash”都列在 PCI 设备下。

我推测,如果我可以阻止内置 NVMe 驱动程序占用设备,我的驱动程序就可以工作。这有可能吗?

作为参考,我的 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>IOKitPersonalities</key>
    <dict>
        <key>PCICrash</key>
        <dict>
            <key>IOClass</key>
            <string>IOUserService</string>
            <key>IOProviderClass</key>
            <string>IOPCIDevice</string>
            <key>IOUserClass</key>
            <string>PCICrash</string>
            <key>IOUserServerName</key>
            <string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
            <key>IOPCIPrimaryMatch</key>
            <string>0x25228086</string>
            <key>IOPCITunnelCompatible</key>
            <true/>
        </dict>
    </dict>
</dict>
</plist>

这是驱动程序的 PCICrash.entitlements:

<?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.pci</key>
    <true/>
    <key>com.apple.developer.driverkit.transport.pci.bridge</key>
    <true/>
    <key>com.apple.developer.driverkit.allow-any-userclient-access</key>
    <true/>
</dict>
</plist>

这是应用程序的 PCICrashApp.entitlements:

<?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.security.files.user-selected.read-only</key>
    <true/>
    <key>com.apple.developer.system-extension.install</key>
    <true/>
</dict>
</plist>

我在 Xcode 中构建而不进行签名(与 WorthDoingBadly 的设置相同),然后运行以下命令:

$ codesign -s - -f --entitlements "PCICrash/PCICrash.entitlements" "[...]/PCICrashApp.app/Contents/Library/SystemExtensions/com.worthdoingbadly.PCICrashApp.PCICrash.dext"
$ codesign -s - -f --entitlements "PCICrashApp/PCICrashApp.entitlements" "[...]/PCICrashApp.app"
$ systemextensionsctl reset
$ [...]/PCICrashApp.app/Contents/MacOS/PCICrashApp
2023-05-08 18:28:17.810 PCICrashApp[3438:81755] requestNeedsUserApproval
2023-05-08 18:28:23.152 PCICrashApp[3438:81755] didFinishWithResult: 0

A view of IORegistryExplorer. It starts out with white text, upon loading the app and registering the extension, it resets the device, and reattaches it using the stock NVMe driver. Maybe this could be explained by a crashing driver. enter image description here


经过多次评论后,我们确定问题只是探测分数之一。

I/O Kit 匹配使用数字探测分数来解决匹配冲突。这是专门为了使特定于设备或特定于供应商的驱动程序获得更高的探测分数,从而优先于适用于类兼容设备的通用、独立于供应商的驱动程序。这正是我们这里的情况。

USB 匹配具有内置机制,可根据匹配模式的类型提高探测分数,因此供应商/设备特定的驱动程序会自动获得优先级,而无需指定显式的探测分数。

The PCI设备匹配逻辑另一方面对待IOPCIClassMatch基于具有相同优先级的匹配字典IOPCIMatch, IOPCIPrimaryMatch, and IOPCISecondaryMatch默认模式,所以正如我们在这里发现的,你最终可能会打成平局。

解决方案是包含一个显式的IOProbeScore匹配字典中的内容超出了通用驱动程序的内容。探测分数作为属性附加到“获胜”车手,因此在这种情况下IONVMeController节点有一个IOProbeScore值为 100 的财产(0x64),所以只要你超过这个值,你的司机就应该获胜,例如:

            <key>IOProbeScore</key>
            <integer>1000</integer>

因此,为了战胜通用(AHCI、XHCI、NVMe 等)PCI 驱动程序,您可能必须在特定于设备的驱动程序中设置探测分数。正如我所提到的,USB 有其自己的自动机制,因此我一般不建议为 USB 驱动程序设置显式探测分数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

macOS DriverKit:制作 PCI dext 来替换内置驱动程序 的相关文章

随机推荐

  • 使 Adob​​e 字体在 IE9 中与 CSS3 @font-face 配合使用

    我正在构建一个小型 Intranet 应用程序 并尝试使用 但没有运气Adobe字体我最近购买了 据我所知 在我们的案例中 这并不违反许可证 我将 ttf otf 版本的字体转换为 woff eot 和 svg 以便针对所有主要浏览器 我使
  • 如何动态更改 JXTreeTable 中特定单元格的颜色

    我在用JXTreeTable现在为了制作树表结构 我想动态更改特定单元格的颜色 如何改变单元格的颜色 我发现这段代码可以改变颜色 但这不起作用 这是代码 leftTree setDefaultRenderer Object class ne
  • 在Python中获取或构建PEM证书链

    是否可以使用 ssl 和 Python 获取 PEM 格式的整个证书链 我可以通过以下方式获得具体的 import ssl addr 192 0 2 1 cert str ssl get server certificate addr 44
  • Python - TypeError:listen() 缺少 1 个必需的位置参数:'self'

    我一直在 PyCharm 中开发 AI 但我似乎在尝试调用方法来尝试获取音频输入时遇到了 voice recognition 错误 Users waynedeng Desktop AI venv bin python Users wayne
  • 如何将新的用户控件添加到工具箱或新的 Winform?

    我有一个现有的库 不是 Winforms 应用程序 它为真正的 Windows 应用程序提供一些 Winforms 在这个库中 我想创建一个用户控件来将一些控件分组在一起 为了实现这一目标 我右键单击 添加 用户控制并将一些控件拖到新的用户
  • 在 Sublime Text 构建系统中使用自定义变量

    我正在 macOS 上配置 Sublime Text ST 构建系统 我想创建一个构建系统变体 将构建产品输出到我的用户库中的文件夹 但我找不到解决该目录的方法 The ST 构建系统文档提到构建系统变量的可用性 但它们都不允许我寻址我的主
  • 集合视图,具有自定义布局,单元格在滚动时行为异常

    我正在尝试使用 UICollectionView 创建自定义平铺布局 一旦我运行我的应用程序 它就会在模拟器中完美呈现 但是当我滚动视图并将其带回时 所有单元格的框架都会发生变化 并且单元格会重叠 随机留下空格 过去两天我无法解决这个问题
  • 如何在“CollectionEditor”对话框中启用属性的默认值

    请先阅读整个问题以理解where我将能够重置属性的默认值 当定义一个可以可视化设计的自定义类时 可以实现一个集合编辑器来修改列表 数组 集合等属性 使用以下模式 Editor typeof CollectionEditor typeof U
  • 使用 Microsoft Jet OLEDB 的 CSV 列限制

    我正在从包含大约 350 列的 CSV 导入数据 这个 CSV 导入是固定的 我完全无法控制它 如果我尝试在 Excel 2003 中打开 CSV 由于列限制为 255 IV 它只能部分加载 当我使用 OleDb 和 Microsoft J
  • Python 挑战字符串编码

    我有以下提供者列表 俄语 providers u u041e u041e u041e u041a u0432 u0430 u0440 u0442 u0430 u043b u041b u0435 u043e u043f u043e u043b
  • 如何在 Spring.NET 中配置静态类的属性?

    如何通过 Spring NET 配置静态类 考虑下面的类 static class Abc public Interface xyz get set public void Show xyz show 也许解决方法可以帮助 这不是一个静态类
  • OpenCV imwrite 函数导致“未定义符号”

    我正在开发一个软件 它由一些带有 python 绑定的核心 C 代码组成 C 代码已经使用了大量 OpenCV 但现在我试图在两者之间保存图像 但我似乎无法使用imwrite功能 将其添加到 main cpp 中并使用 默认 构建在 ecl
  • 如何使用表单名称作为字符串创建新的表单实例

    使用表单名称创建封闭表单的新表单实例的代码 我想用变量替换长的选择案例列表 模块完整代码 在 Access 2010 中 我有一个 VBA 函数 当给定包含表单名称的字符串时 该函数会打开表单的新实例 通过将表单变量 frm 添加到集合中
  • 图片在浏览器中显示为垃圾字符

    谁能告诉我为什么当我尝试通过浏览器访问图像 URL 时 它显示一堆内容类型为文本 纯文本的垃圾字符 eg https www domainname com client image name jpg显示如下 3 1AQa q2 B R b3
  • 如何使用 php 将文件添加到 ziparchive 中新创建的文件夹中?

    如上图所示 我有组织在虚拟文件夹中的图像 在 mysql 数据库中 但不是真实文件夹中 我需要使所选文件夹可供使用下载为 zip 文件 我能够压缩图像 但是我们如何添加子目录以便向其中添加图像 我尝试使用addEmptyDir 但无法找到向
  • 当条码扫描仪发送以换行符结尾的数据时如何使按钮散焦

    我正在编写一个 C 条形码应用程序 我有一个 EAN 13 正则表达式来检测 Form1 KeyPress 函数中的条形码 我没有机制来检测输入来自哪里 这是我的问题 我的表单中有一个重置按钮 可以清除 dataGridView 中列出的所
  • 无法全局安装旧版本的 phpunit phar

    正如给出的https phpunit de manual current en installation html installation phar verification 全局安装PHAR的步骤是 wget https phar ph
  • DLIB:针对 194 个地标训练 Shape_predictor(helen 数据集)

    我正在训练DLIB s 形状预测器对于 194 个面部特征点 使用海伦数据集用于通过以下方式检测人脸特征点face landmark detection ex cppdlib 库 现在它给了我一个sp dat大约的二进制文件45 MB与给定
  • Live Sass 编译器 - @use 导致编译错误

    我在用着Live Sass 编译器 v3 0 0在我的 VS Code 中 每当我使用 use rule从另一个文件导入变量 但是 当我使用 Sass 命令行界面时 sass watch 编译我的文件 它会抛出没有错误 因此 我想问一下这是
  • macOS DriverKit:制作 PCI dext 来替换内置驱动程序

    我正在尝试在 DriverKit 中编写一个用户空间 PCI 驱动程序 用于教育 研究目的 我找到了一个来自 WorthDoingBadly 的示例其中包含 PCI 设备 dext 的样板代码 我已删除了漏洞利用代码 我已将其修改为通过以下