【问题标题】:debugging USB read调试 USB 读取
【发布时间】:2014-05-25 12:36:22
【问题描述】:

我正在调试一些使用第 3 方 64 位 DLL 访问自定义 USB 设备的代码。我的环境是 Windows 8.1 x64 上的 Microsoft Visual Studio 2012。

根据不完整且不可靠的文档,DLL 应该发出 USBDEVFS_CONTROL ioctl 以从连接的 USB 设备读取 1 个字节。定义涉及

ctrl.bRequestType = bmRequestType;
ctrl.bRequest     = bRequest;
ctrl.wValue       = wValue;
ctrl.wIndex       = wIndex;
ctrl.data         = ByteArray;
ctrl.wLength      = 64;
ctrl.timeout      = 1000;

这里bmRequestTypebRequestwValuewIndex是设备制造商提供的常量,ByteArray是一个包含特定命令的uint8_t[64]缓冲区。

DLL 接受特定于应用程序的参数,将它们打包到ByteArray 中,并调用ksproxy.ax->Kernelbase.dll->ntdll.dll。我在用户模式下看到的最后一个反汇编是

mov     r10,rcx
mov     eax,47h
syscall
ret

根据文档,使用分步调试器,我可以很容易地看到ByteArray 的构造完全符合它的预期。但是我找不到 usbdevfs_ctrltransfer 结构,或者它的 Windows 等效结构。

具体来说,我们怀疑文档中指定的 wIndex 的值适用于旧版本的硬件,并且 Windows DLL 实际上使用 0x0400 而不是 0x0402 .

任何提示(包括硬件或软件 USB 嗅探器、模拟器等)我们如何尝试验证此 unsigned short 将不胜感激。

更新

阅读https://reverseengineering.stackexchange.com/questions/2416/how-to-reverse-engineer-simple-usb-device-windows-linuxhttps://reverseengineering.stackexchange.com/questions/1786/usb-dongle-traffic-monitoring。这些工具似乎与 Windows 8.1 x64 不兼容。

【问题讨论】:

  • 我更喜欢这个用于嗅探数据包的 USB 硬件分析器,Ellisys USB Explorer 200,加上解码,你就拥有了一个很好的工具,可以轻松地进行逆向工程和调试 USB。
  • 我喜欢Beagle 12
  • USB 设备文件系统 (USBDEVFS) 是一个 Linux 的东西,所以我不明白你为什么要谈论它作为一个 Windows 软件。如果您拥有的此设备使用 winusb.sys 作为驱动程序,则第 3 方 DLL 应该调用 setupapi.dll 和 winusb.dll。
  • @DavidGrayson:我在调试器中没有看到对setupapi.dllwinusb.dll 的调用;相反,我可以追踪ksproxy.ax->Kernelbase.dll->ntdll.dll。你说得对,USBEVFS 不适用于 Windows。但我希望有一个 Windows 等价于 Linux USBDEVFS_CONTROL ioctl (0xC0185500)。
  • 如果您在设备管理器中查看这个东西的属性,您会在列表中看到哪些驱动程序?它是说 winusb.sys 还是别的什么?

标签: winapi usb ntdll deviceiocontrol


【解决方案1】:

在开发 Xbox 操作系统和外围设备时,我们始终使用CATC Chief USB 捕获硬件,它作为中间人设备工作(看起来它已被Teledyne LeCroy 协议分析器取代)。

流量捕获功能对于诊断硬件和软件错误(批量、HID、isoch)是必不可少的。

示例捕获视图(来自手册):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多