【文章标题】: 一个无驱型加密锁的HID通信分析
【文章作者】: zailaiyp
【作者邮箱】: 70306682@qq.com
【操作系统】: Windows 2003
【使用工具】: OD+Bus Hound+UsbView
【作者声明】: 只是感兴趣,没有其他目的。错漏之处还请各位
高手指点
楼层说明:
一楼 HID设备 描述符 加密狗的枚举
二楼 USB设备标准11条命令 HID描述符 分析狗的思路
三楼 重要的HID及SETUPDIxxxxx函数 共19个。原型及简单说明
四楼 应用程序枚举HID设备进行找狗
六楼 确定本加密狗的内置控制命令码 及详细分析过程
待添加
【讨论说明】
前段时间从朋友处得来一套他做生意淘汰下来的软件,带有2个加
密狗,上周末就仔细学习研究了一下,深感资料匮乏。。。整整
两天时间都贡献给这个狗了。本文主要从HID通信的角度来书写,
没有任何技术含量,目的是做为学习总结记录之用,毕竟这花了
我一个周末整整两天的时间,总要写点什么出来。内容浅陋,不
值打狗高手们一提。。。。。。
我之前对加密狗了解很少,这篇帖子仅以我手中的这种狗为例。
实际上,HID设备的分析基本上都差不多,而HID加密狗算是很
简单的了 起码从报告描述符这方面来讲,比HID鼠标什么的还简
单。
=========================================
另外,本文虽然标题为加密锁云云,但实际上大部分内容为HID相关,
加密锁只是作为一个具体例子来讲。对其他的HID设备,都是适用的。
以学习交流为主。
我是一只菜菜鸟,基本上什么都不会,文章写的更是差劲,还请各位
朋友多多关照 多多指点。
=========================================
USB协议中有个HID(人机接口设备)类,符合HID规范的就叫HID
设备,无驱型加密锁就是HID设备,HID库中提供了很多函数,用
做应用程序和HID设备进行通信。
当把HID设备 比如这个加密狗插进主机,系统就会进行枚举等操
作,下面先讲一下枚举。
Bus Hound是分析USB设备的不可少工具,使用很简单,就不多说
了。先插入狗,打开Bus Hound,打开设备项,挂勾设备,返回
主显示界面,运行右下角的RUN,再把狗拔下, 再插进去,信息
就出来了。
Device Phase Data Description
------ ----- ------------------------ ---------------- ------------------
//80表示要求数据输入 06是获取描述符 00表示语言ID 03表示获取字符串描述符
CTL 80 06 00 03 00 00 ff 00 GET DESCRIPTOR
//设备回答:
IN 04 03 09 04 ....
CTL 80 06 01 03 09 04 ff 00 GET DESCRIPTOR
IN 0e 03 55 00 53 00 42 00 ..U.S.B.
4b 00 65 00 79 00 K.e.y.
CTL 80 06 00 01 00 00 12 00 GET DESCRIPTOR
IN 12 01 00 02 00 00 00 08 ........
89 36 62 87 00 02 01 01 .6b.....
00 01 ..
CTL 80 06 00 02 00 00 09 00 GET DESCRIPTOR
IN 09 02 22 00 01 01 01 80 ..".....
19 .
CTL 80 06 00 02 00 00 22 00 GET DESCRIPTOR
IN 09 02 22 00 01 01 01 80 ..".....
19 09 04 00 00 01 03 01 ........
00 00 09 21 11 01 00 01 ...!....
22 20 00 07 05 81 03 08 " ......
CTL 00 09 01 00 00 00 00 00 SET CONFIG
CTL 21 0a 00 00 00 00 00 00 SET IDLE
CTL 81 06 00 22 00 00 60 00 GET DESCRIPTOR
IN 06 00 ff 09 01 a1 01 85 ........
01 09 01 15 00 26 ff 00 .....&..
75 08 95 08 b1 06 85 02 u.......
09 03 96 14 00 b1 06 c0 ........
以上就是主机和加密狗的部分通信内容,简单说明一下:
信息从获取描述符开始,之前还有些步骤,没显示出来,有兴趣
的朋友可以自行了解。
主机通过默认的控制通道使用标准的USB设备请求命令发送到HID
设备,这样的命令基本上所有的USB设备都支持, 每条命令8字节,共有11条命令。
上面的大部分做了注释,很容易理解。如有需要 可以去查看USB
的官方文档。后面还会具体讲到。
HID设备要被主机识别,就要提供足够多的信息给主机。而HID设
备本身不会主动发消息给主机。HID设备插入后,依靠的是主机
使用控制传输来从设备获取信息。
Descriptor就是描述符,是一个存储在USB设备的固件中的数据
结构,用于描述该设备的属性,主机就是通过使用控制传输来
要求设备提供这些信息的。让主机知道设备具有哪些功能、属
于具体哪类设备、使用哪些传输方式 等等。
刚开始我参照官方文档,一个字节一个字节的把上面的几个描
述符给扣了出来,再然后 悲剧的发现,使用UsbView直接就能
显示出来了。
以下是直接显示的结果
Device Descriptor:
bcdUSB: 0x0200
bDeviceClass: 0x00
bDeviceSubClass: 0x00
bDeviceProtocol: 0x00
bMaxPacketSize0: 0x08 (8)
idVendor: 0x3689
idProduct: 0x8762
bcdDevice: 0x0200
iManufacturer: 0x01
0x0409: "USBKey"
0x0409: "USBKey"
0x0409: "USBKey"
iProduct: 0x01
0x0409: "USBKey"
0x0409: "USBKey"
0x0409: "USBKey"
iSerialNumber: 0x00
bNumConfigurations: 0x01
ConnectionStatus: DeviceConnected
Current Config Value: 0x01
Device Bus Speed: Low
Device Address: 0x01
Open Pipes: 1
Endpoint Descriptor:
bEndpointAddress: 0x81
Transfer Type: Interrupt
wMaxPacketSize: 0x0008 (8)
bInterval: 0x0A
Configuration Descriptor:
wTotalLength: 0x0022
bNumInterfaces: 0x01
bConfigurationValue: 0x01
iConfiguration: 0x01
0x0409: "USBKey"
0x0409: "USBKey"
0x0409: "USBKey"
bmAttributes: 0x80 (Bus Powered )
MaxPower: 0x19 (50 Ma)
Interface Descriptor:
bInterfaceNumber: 0x00
bAlternateSetting: 0x00
bNumEndpoints: 0x01
bInterfaceClass: 0x03 (HID)
bInterfaceSubClass: 0x01
bInterfaceProtocol: 0x00
iInterface: 0x00
HID Descriptor:
bcdHID: 0x0111
bCountryCode: 0x00
bNumDescriptors: 0x01
bDescriptorType: 0x22
wDescriptorLength: 0x0020
Endpoint Descriptor:
bEndpointAddress: 0x81
Transfer Type: Interrupt
wMaxPacketSize: 0x0008 (8)
bInterval: 0x0A
单词基本上可以望文生义,具体的值请参考USB官方文档-------
尽管不愿意总说 但是没办法 资料少的可怜,两天时间,我一直
开着金山词霸。
特别的对于HID设备,还有一个最重要的描述符----报告描述符。
这是个复杂的东东,没有什么工具可以直接显示,只能使用手工。
81 06 00 22 00 00 60 00 这个命令就是获取设备的报告描述
符了。
主机和HID设备使用“报告”来传输信息,比如无驱的USB键盘
鼠标 等等,他们都是HID设备 都是依靠 报告 来和主机交换信
息,对于报告,主机就需要使用该设备的报告描述符来解析具
体的内容,否则,对于设备传来的数据,主机是根本无法知道
表示什么内容的。
对于一些符合HID规范的设备,比如键盘鼠标游戏杆等等,他们
的报告描述符也符合规范,插上就能用,对于自定义的HID设备,
则不一定需要具体的描述“报告”中的数据所表示的意义,因为
应用程序提取到数据后,可以按照需要自己进行解析使用。
这个加密狗的报告描述符就很简单,下面是我反出来的。
USAGE_PAGE (Vendor Defined Page 1) 06 00 FF
USAGE (Vendor Usage 1) 09 01
COLLECTION (Application) A1 01
REPORT_ID (1) 85 01
USAGE (Vendor Usage 1) 09 01
LOGICAL_MINIMUM (0) 15 00
LOGICAL_MAXIMUM (255) 26 FF 00
REPORT_SIZE (8) 75 08
REPORT_COUNT (8) 95 08
FEATURE (Data,Var,Rel) B1 06
REPORT_ID (2) 85 02
USAGE (Undefined) 09 03
REPORT_COUNT (276) 96 14 01
FEATURE (Data,Var,Rel) B1 06
END_COLLECTION C0
简单说下 这个加密狗是自定义HID设备,报告数据的用法由设备
商自定义(也就是在在程序里自己处理吧)
这个狗有2种报告,第一种是特征报告,ID为1,数据表示范围
在0-255之间,报告大小为8位,有8个,也就是共8个字节的数据。第二种也是特征报告,ID为2,数据大小也为8位,有276个,也就是共有276个字节。
这里我有点没搞明白,报告2里的计数为96 14 00 ,但是我怎么
也想不出96怎么可以得出14 00的?只能得出96 14 01 即276个
字节。
实际上,对于这种简单的自定义HID设备来说,取得它的报告描
述符的意义似乎并不大,如果是一些复杂的自定义HID设备,通
过分析报告描述符,是可以取得很多有用信息的。
具体到这只狗。。。只知道会有2个报告,第一个8字节,第二个
276字节(这里有疑问 因为实际报告大小似乎都是21字节)
===========================================
以上是狗的插入枚举部分。这时候狗已经可以正常使用了。下
面就开始运行软件。
-------原来整理记录也是很累人的
稍后待续
- 标 题:一个无驱型USB加密锁的HID通信分析 4楼部分更新应用程序枚举HID设备进行找狗
- 作 者:zailaiyp
- 时 间:2011-03-14 14:11:23
- 链 接:http://bbs.pediy.com/showthread.php?t=130803