サードパーティの 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 スニファー、エミュレーターなどを含む) をいただければ幸いです。
アップデート
https://reverseengineering.stackexchange.com/questions/2416/how-to-reverse-engineer-simple-usb-device-windows-linuxとhttps://reverseengineering.stackexchange.com/questions/1786/usb-dongleを読む-トラフィック監視。これらのツールは Windows 8.1 x64 と互換性がないようです。