我们正在考虑使用 USB 设备的供应商和产品 ID(通过 IOKit 获得)来解锁应用程序的某些功能。我知道这些值可以被欺骗,但我不确定在 OSX 上可以轻松地完成它。欺骗供应商和产品 ID 涉及什么?非程序员可以很容易地做到这一点吗?
5 回答
我怀疑(对于程序员来说)创建一个在内核空间中创建一个相当逼真的 IOUSBDevice 对象的 kext 会相当容易。但是,一旦完成,任何人都可以加载它。
也可以使用 AppleUSBMergeNub 构建一个无代码的 kext 来将一个设备伪装成另一个设备(尽管我没有对此进行测试,但它看起来可能有效,假设您只尝试匹配 IOUSBDevice 而不实际使用它)。
在用户空间中劫持您的 API 调用并为您的软件提供预期的答案可能会更容易。
非程序员无法做到这一点。你可以做的是为设备编写一个内核扩展(一个 IOKit 驱动程序),它有一个匹配的字典匹配真实的设备的vendor-/product-ID,这会导致系统在此设备连接时自动加载内核扩展并传递对设备对象的引用。驱动程序现在负责初始化设备并创建 IOKit 框架(用户空间库)与设备通信所需的所有必要用户空间信息。通常 Apple 为大多数 USB 设备类提供默认的 IOKit 驱动程序(这就是为什么您不需要为每个 USB 鼠标或键盘添加额外的驱动程序),但如果找到更具体的驱动程序,则将使用此驱动程序。而在创建用户空间数据时,当然驱动程序可能会撒谎关于供应商/产品ID,导致用户空间程序看到错误值。由于 IOKit 是用 C++ 编写的,并且严重依赖对象和对象继承,因此甚至不需要从头编写驱动程序,而是可以从 Apple 的默认驱动程序继承,只需覆盖一些方法,否则依赖于超级实现。然而,编写 IOKit 内核驱动程序并不是那么容易,即使是开发 Mac 软件多年的人也可能不知道如何做到这一点,而 IOKit 文档是 Apple 提供的最糟糕的文档之一。
所以回答你的问题:有可能吗?是的。这很容易吗?不,非程序员可以做到吗?当然不是,除非其他人已经为他们编写了一个随时可用的扩展,否则他们只需要安装。
这实际上很简单,而且我绝对不是程序员!
谢谢,罗兰德!
我能够更改我在 eBay 上购买的 USB 以太网适配器的 ID,以便在 Mac OS X 10.8 上使用另一个驱动程序。
由于到目前为止没有人回答,我偶然发现了一个页面,该页面基本上说您可以获得一个 Arduino 并对其进行编程以返回您想要的任何 VID/PID/序列。我仍然找不到任何仅软件的方法来做到这一点。
我可以在 Delphi 代码中创建一个 OCX 来做到这一点,并提供信息以向 USB 发送/接收数据,其他状态如下:- 它是否仍然连接。
当然,如果同一个芯片是从另一个产品连接的,我需要更多的细节。例如友好名称,设备描述......