【发布时间】: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;
这里bmRequestType、bRequest、wValue和wIndex是设备制造商提供的常量,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-linux 和https://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.dll和winusb.dll的调用;相反,我可以追踪ksproxy.ax->Kernelbase.dll->ntdll.dll。你说得对,USBEVFS 不适用于 Windows。但我希望有一个 Windows 等价于 LinuxUSBDEVFS_CONTROLioctl (0xC0185500)。 -
如果您在设备管理器中查看这个东西的属性,您会在列表中看到哪些驱动程序?它是说 winusb.sys 还是别的什么?
标签: winapi usb ntdll deviceiocontrol