从哪里开始在 Windows 上对 USB 视频设备进行逆向工程?

逆向工程 视窗 linux USB
2021-06-13 22:50:59

我有一块专有硬件,我正在尝试对其进行逆向工程并为其编写跨平台开源驱动程序。这个设备上有一个红外摄像头,它似乎在使用 UVC 协议。在 linux 上,de 设备作为 /dev/video0 摄像头公开,虽然它没有出现在任何基于网络摄像头的应用程序中,但我可以使用 OpenCV 从中提取帧。

在 Windows 上,它有点模糊。相机不会出现在任何应用程序中,只有设备的仅限 Windows 的专有驱动程序才能与其交互。在设备管理器中,设备显示在“成像设备”下,它使用ksthunk.sysusbvideo.sys驱动程序。

我已经尝试了所有我能想到的从相机上取下框架的方法,但每次尝试都失败了。首先,我尝试使用 OpenCV 连接到它,但我找不到正确的设备 ID。我什至尝试通过尝试在一个巨大的间隔内连接到每个可能的数字来强制设备 ID,但没有运气。

我还尝试使用 Windows SDK(GraphEdit 和 KsStudio)中的一些低级 uvc 调试工具,但它们都无法连接到相机。

我注意到的一件事是实际的网络摄像头有注册表项FilterDataMSCameraFlagsin HKLM\CurrentControlSet\Control\DeviceClasses\{e5323777-f976-4f5b-9b55-b94699c46e44}\##?#USB#VID_045E&PID_0766&MI_00#6&1d047af0&0&0000#{e5323777-f976-4f5b-9b55-b94699c46e44}\#global\Device Parameters,而这个设备没有。该值FilterData似乎包含有关分辨率和图像压缩的值,因此我的设备注册表中缺少此键可能与 Windows 未将其视为网络摄像头有关。

显然,该设备的开发人员做了一些事情来确保相机不会显示为常规网络摄像头,因为它不应该被这样使用。

我的最终目标是能够在我自己的软件中使用来自 OpenCV 的红外摄像头,但我不知道如何开始对设备进行适当的逆向工程。

2个回答

首先,尝试识别设备的组件。如果它便宜,买第二个并打开它。

查找规格并找到具有相同规格的类似设备。这款设备并不是地球上唯一一款配备该成像传感器的设备。这可能会帮助您找到一个兼容的驱动程序或规范来开始您的实现。

听起来该设备并未将自己呈现为相机。没有什么说 USB 相机必须声明自己是一个。我的 USB 键盘可以声称不是 USB 键盘。

您可以编写一个充当代理的虚拟网络摄像头驱动程序吗?直接将虚假/近似注册表项和代理数据设置到设备?

只创建一个近似于它应该是什么的注册表项怎么样?您可能知道 OpenCV 的参数。

我从你的帖子中得到它,你需要在 Windows 上使用这个设备吗?

  1. 首先,我会从设备管理器中找到硬件设备 ID。即 USB\VID_045E&PID_0766。在某些情况下,您可以找到用于紧密匹配设备 ID 的现有开源驱动程序,并让它们以最少的修改工作。
  1. 该应用程序是否实际安装了 3rd 方驱动程序,您提到的两个驱动程序 ksthunk.sys 和 usbvideo.sys 是 Windows 内置的 Microsoft 驱动程序。

使用 USBVIDEO.sys 的驱动程序遵循此处列出的规范:

https://docs.microsoft.com/en-us/windows-hardware/drivers/stream/usb-video-class-driver-overview

作为Windows 驱动程序工具包一部分的工具USBView可以提取有关 USB 设备的更多信息。

  1. USB 跟踪可以帮助锻炼更多有关通信的详细信息,使用诸如WireShark 之类的工具

  2. 对驱动程序设置程序的分析可以得出更多信息。这是一个相当复杂的话题,但一些方法可能包括:

a) 使用 ProcMon 等工具监控驱动程序安装 ( http://live.sysinternals.com/ProcMon.exe ) 通常,如果未安装驱动程序和应用程序,此方法效果最佳,您开始监控,然后运行安装程序并在此期间连接设备痕迹。

b) 使用UniExtractOrca(如果是 MSI)等工具静态分析安装程序,然后使用GhidraIDA Pro等逆向工程工具分析可执行内容