使用OllyDbg 分析 USB HID 设备接口协议

ollydbg教学篇 写之前先说点废话(谁扔的香蕉皮,鸡蛋^^^^^^^^^^^): ollydbg是个功能强大的软件,以前我也不用他(不习惯),而且很多经典教程都是用trw和softice作为示例工具写的. 初学者(注:和我一样的人)往往一开始就接触这些工具,做练习也就用这些工具!可以说已经上手了! 对ollydbg的动态调试功能也就陌生了! 现在一个很现实的问题让我改变了习惯,我的键盘鼠标是usb的,显示器也给 阅读详情
 作者: Tase     tase@163.com
关键字: OllyDbg,USB ,HID,Bus hound,

分析工具: OllyDbg,Bus hound
分析对象: 一个USB 接口飞行模拟器

目的:通过分析使用USB HID设备的软件,从中其主程序中“扣”HID 设备数据协议,再根据这些协议自己实现USB HID的设备,达到仿制原装 HID数据采集设备的目的。

我有幸拿到了一款原装的飞行模拟软件和接口设备,这个模拟器是通过一个USB接口把遥控设备上的数据采集到PC,再通过软件模拟现实飞行,因为原装设备昂贵,因此打算DIY一套接口,便下手分析了一把!

这个模拟器软件有两部分组成,其一是模拟软件,其二是一个USB的数据采集设备,在拿到设备前,我就猜想,它可能是HID(人体学设备)DEVICE,现在很多USB数据采集设备都是采用的HID协议的方法设计,这样的话就可以实现在WINDOWS下免驱动安装,并且可以通过windows自带的接口以客户态的方式访问这些硬件接口。

经过测试,果然是HID设备,使用Bushound5 总线观察器,用它来捕捉总线上的USB设备数据,HID设备很简单,花了两个小时就基本弄清楚了它大部分的数据含义,因此很快就按照我理解的协议把设备在单片机开发板上实现了,插上我的设备,模拟器软件很快就识别了我的接口,但显示各通道数据时,都是0,也就是说,它的系统检测到了一个接口设备,但这个设备采样的数据是错误的。


于是我又回到总线数据分析,找到我遗漏的2个bit,这个2个bit 是我没有理解的,我猜想它是校验位,经过观察,这个2个bit只和几个字节有关,但就是这2个bit花了我4天的时间,这几天让我学会Excel 中很多大多数人不知道的功能,学会了使用VBScript 写宏,我甚至用到了MATLAB,我一直是用统计的方法寻找2bit的规律,但最终我失败了。

山穷水尽,想到了Ollydbg 分析它主程序中的USB接口的协议,没有想到,一个晚上,就解决了我的问题。
在Windows 下访问HID 设备可以有两种方法,一是核态,也就是用驱动程序的方法访问,这个方法非常复杂,我知道原理,但自己还没有写过这样的驱动。二是客户态,即应用程序通过调用Windows提供的Hid 访问函数就可以实现对HID设备的访问。如果我们截获了这些函数的调用,那么,距离我们要解决的目标就不远了。

一般情况下,主程序识别USB HID外设的方法:首先调用HidD_GetHidGuid函数获取HID设备的类标识,调用SetupDiGetClassDevs函数查询所有已安装的HID设备,得到一个指向该HID设备集合的句柄,调用SetupDiEnumDeviceInterface函数查询HID设备集中每一个设备的接口信息,对每一个接口,调用SetupDiGetDeviceInterfaceDetail函数获取其详细的信息,包括设备名称(头四个字节),CreateFile用此设备名打开设备,调用SetupDiDestroyDeviceInfoList函数释放设备信息集合;第二步,打开设备,获取设备的属性值以及设备能力描述,调用CreaterFile函数打开本设备。调用HidD_GetAttributes函数,获取USB设备的有关属性。它包含了设备的厂商ID、产品ID及产品的版本号等。可以根据这些信息判断该设备是否为目标设备,但我们关心的并不是这些,我们关心的是这个设备打开以后的 ReadFile 操作,我们知道,Windows下的设备都是当作文件来读写的。

启动OllyDbg 装入模拟器软件,下断点 HidD_GetAttributes,CreateFile,这个函数是能把HID 的关键信息获取,例如厂商ID,产品ID,版本?等,在调试前,拔掉机器上所有不必要的USB设备,这样枚举到的设备会少些,你断点的次数也会少很多。

因为前面用到了Bus Hound,很容易知道我们要关心的设备的 VID 和 PID,这样在断点在HidD_GetAttributes, 之后,很容易得知哪个设备是我们所关心的,在堆栈中记下设备的字符串路径。在CreateFile函数断点时,确认要打开的设备是否是我们关心的设备?

我们关心的HID设备打开以后,就要关心 ReadFile  和 WriteFile了,下断点 ReadFile ,不幸的是,这样的断点太多了! 想到一个问题,HID虽然是低速设备,但刷新时间也是10ms/帧,那么一般的WINDOWS的定时器最多只能精确到50ms,要想不丢帧读取HID的设备数据,一定会用到高精度的定时器——多媒体定时器。

用到了多媒体定时器,就肯定会用到下面的几个函数 ,timeGetDevCaps,timeBeginPeriod,timeSetEvent ,遂下断点在这函数,经过一番努力,果然找到了关键的ReadFile,读完了HID的设备数据后,干什么? 按照常理,就该分析和校验了,果然,我分析的正确,正是如此,下面是破解当时获取的关键汇编代码,因为这篇文章是几个月后写的,所以有些内容只能靠回忆了。

读懂了这些代码就完全弄明白了它的协议。

004417B2   . 8B0D D8CD9500  MOV ECX,DWORD PTR DS:[95CDD8]     //取出CH1-CH4 的高位字节
004417B8   . A3 00CE9500    MOV DWORD PTR DS:[95CE00],EAX
004417BD   . 33D2           XOR EDX,EDX
004417BF   . 8BC1           MOV EAX,ECX
004417C1   . 8A15 D7CD9500  MOV DL,BYTE PTR DS:[95CDD7]       //取出CH1通道数据
004417C7   . 25 FF000000    AND EAX,0FF
004417CC   . 8BF2           MOV ESI,EDX                      // 这里要注意,保存CH1的低8位数据,将来用来算校验位
004417CE   . 8BD0           MOV EDX,EAX
004417D0   . 83E2 03        AND EDX,3                         //用0x3 来掩码 高位字节,取出CH1的高2位
004417D3   . 33DB           XOR EBX,EBX 
004417D5   . C1E2 08        SHL EDX,8                         //将CH1 的高2位左移 8位
004417D8   . 8A1D D6CD9500  MOV BL,BYTE PTR DS:[95CDD6]       //取出CH2 的通道数据
004417DE   . 8D9432 DC03000>LEA EDX,DWORD PTR DS:[EDX+ESI+3DC] //计算出 CH1 的最终数据,高2位+CH1的数据 + 常数3DC
004417E5   . 8915 E0CD9500  MOV DWORD PTR DS:[95CDE0],EDX      //保存CH1的数据
004417EB   . 8BD0           MOV EDX,EAX
004417ED   . 83E2 0C        AND EDX,0C                         //取出CH2的高2位掩码
004417F0   . C1E2 06        SHL EDX,6                          //计算出 CH2 的高2位
004417F3   . 8D941A DC03000>LEA EDX,DWORD PTR DS:[EDX+EBX+3DC] //计算出 CH2 的完整数据
004417FA   . 33DB           XOR EBX,EBX
004417FC   . 8915 E4CD9500  MOV DWORD PTR DS:[95CDE4],EDX      //保存CH2 的数据
00441802   . 8BD0           MOV EDX,EAX
00441804   . 83E2 30        AND EDX,30                         //取CH3 高位 的掩码
00441807   . 8ADD           MOV BL,CH                          //取CH3 低8位数据
00441809   . C1E2 04        SHL EDX,4                          //高2位移位
0044180C   . 25 C0000000    AND EAX,0C0                        //取CH4 的高位掩码
00441811   . 8D8C1A DC03000>LEA ECX,DWORD PTR DS:[EDX+EBX+3DC] //计算出CH3 的完整数据
00441818   . 33D2           XOR EDX,EDX
0044181A   . 8A15 D5CD9500  MOV DL,BYTE PTR DS:[95CDD5]        //取CH4 低8位数据
00441820   . 890D E8CD9500  MOV DWORD PTR DS:[95CDE8],ECX      //保存CH3 的数据
00441826   . 8D8482 DC03000>LEA EAX,DWORD PTR DS:[EDX+EAX*4+3DC] //计算CH4 D 数据
0044182D   . A3 ECCD9500    MOV DWORD PTR DS:[95CDEC],EAX       //保存CH4 的数据
00441832   . A1 DCCD9500    MOV EAX,DWORD PTR DS:[95CDDC]       //取出CH5-CH8 的高位数据和标志位数据
00441837   . A8 40          TEST AL,40   // 这个标志的第6bit 是表示奇偶帧的
00441839   . 74 41          JE SHORT REFLEX.0044187C  //如果是0 表示是偶数帧,那么CH5,CH6 有效,GOTO 到0044187C
0044183B   . 25 FF000000    AND EAX,0FF   //否则 是奇数帧
00441840   . 33D2           XOR EDX,EDX
00441842   . 8A15 DBCD9500  MOV DL,BYTE PTR DS:[95CDDB]  //取CH5的低8位数据
00441848   . 8BC8           MOV ECX,EAX
0044184A   . 83E1 0C        AND ECX,0C
0044184D   . C1E1 06        SHL ECX,6
00441850   . 8D8C11 DC03000>LEA ECX,DWORD PTR DS:[ECX+EDX+3DC] //同上,计算出CH5 的完整数据
00441857   . 8BD0           MOV EDX,EAX
00441859   . 83E2 03        AND EDX,3       //取CH6 的高2位
0044185C   . 890D F8CD9500  MOV DWORD PTR DS:[95CDF8],ECX //保存CH5
00441862   . C1E2 08        SHL EDX,8
00441865   . 33C9           XOR ECX,ECX
00441867   . 8A0D DACD9500  MOV CL,BYTE PTR DS:[95CDDA]   //取CH6 的低8位
0044186D   . 8D940A DC03000>LEA EDX,DWORD PTR DS:[EDX+ECX+3DC]  //计算出CH6 数据
00441874   . 8915 FCCD9500  MOV DWORD PTR DS:[95CDFC],EDX // 保存CH6 数据
0044187A   . EB 4A          JMP SHORT REFLEX.004418C6
0044187C   > 25 FF000000    AND EAX,0FF
00441881   . 33D2           XOR EDX,EDX
00441883   . 8A15 DBCD9500  MOV DL,BYTE PTR DS:[95CDDB]
00441889   . 8BC8           MOV ECX,EAX
0044188B   . 83E1 0C        AND ECX,0C
0044188E   . C1E1 06        SHL ECX,6
00441891   . 8D8C11 DC03000>LEA ECX,DWORD PTR DS:[ECX+EDX+3DC]
00441898   . 8BD0           MOV EDX,EAX
0044189A   . 890D F0CD9500  MOV DWORD PTR DS:[95CDF0],ECX
004418A0   . 83E2 03        AND EDX,3
004418A3   . 33C9           XOR ECX,ECX
004418A5   . 8A0D DACD9500  MOV CL,BYTE PTR DS:[95CDDA]
004418AB   . C1E2 08        SHL EDX,8
004418AE   . 8D940A DC03000>LEA EDX,DWORD PTR DS:[EDX+ECX+3DC]
004418B5   . 8BC8           MOV ECX,EAX
004418B7   . C1E9 07        SHR ECX,7                         // 这里也需要注意,这里是取出标志位的最高位,做判断用的
004418BA   . 8915 F4CD9500  MOV DWORD PTR DS:[95CDF4],EDX     // 上面的部分是算出 7- 8 通道的数据并保存
004418C0   . 890D 04CE9500  MOV DWORD PTR DS:[95CE04],ECX
004418C6   > 8BD0           MOV EDX,EAX                        //公共算2BIT 校验位的 部分 FLAG
004418C8   . 83F6 07        XOR ESI,7                          //CH1 和 0X7 XOR ==> A
004418CB   . 83E2 0F        AND EDX,0F                         //标志位取低4位 ==>B
004418CE   . 03D6           ADD EDX,ESI                        //标志位的低4位和A + B==>C
004418D0   . D1E2           SHL EDX,1                          //C << 1 ==> D
004418D2   . 33D0           XOR EDX,EAX                        //D XOR FLAG ==> E
004418D4   . F6C2 30        TEST DL,30                         //E & 0x30 ==>F  如果是 0 就成功了!
004418D7   . 74 3A          JE SHORT REFLEX.00441913
004418D9   . A1 C4CD9500    MOV EAX,DWORD PTR DS:[95CDC4]
004418DE   . 85C0           TEST EAX,EAX
004418E0   . 75 40          JNZ SHORT REFLEX.00441922
004418E2   . A1 08CE9500    MOV EAX,DWORD PTR DS:[95CE08]
004418E7   . C705 C4CD9500 >MOV DWORD PTR DS:[95CDC4],1
004418F1   . 50             PUSH EAX
004418F2   . EB 1D          JMP SHORT REFLEX.00441911
004418F4   > 8B0D 08CE9500  MOV ECX,DWORD PTR DS:[95CE08]
004418FA   . C705 C4CD9500 >MOV DWORD PTR DS:[95CDC4],1
00441904   . 8935 B8CD9500  MOV DWORD PTR DS:[95CDB8],ESI
0044190A   . 8935 BCCD9500  MOV DWORD PTR DS:[95CDBC],ESI
00441910   . 51             PUSH ECX
00441911   > FFD5           CALL EBP
00441913   > A1 C4CD9500    MOV EAX,DWORD PTR DS:[95CDC4]
00441918   . 33F6           XOR ESI,ESI
0044191A   . 3BC6           CMP EAX,ESI
0044191C   .^0F84 61FEFFFF  JE REFLEX.00441783
00441922   > 5F             POP EDI
00441923   . 5E             POP ESI
00441924   . 5D             POP EBP
00441925   . 33C0           XOR EAX,EAX
00441927   . 5B             POP EBX
00441928   . 59             POP ECX
00441929   . C2 0400        RETN 4


2Bit= ((((pPacket->byteCh1 ^ 0x07) + (CH_HID_REPORT[7] & 0x0F))<<1)&0x30)>>4;
 

当时困扰我4天的2BIT校验数据,其实用C语言一行就写完了,兴奋啊! 立刻将这个算法写进单片机的固件,插上我自己DIY的HID模拟器设备,OK,系统已经能正确的从我的设备中采集数据了。
USB 协议破解成功!


这是我第一次使用OllyDbg 解决实际问题,愚昧之处还请各位前辈批评。



总结: 有时我们在解决一个难题的时候,往往在正面不能获取进展时,不如从侧面,后面下手,所谓杀猪捅屁股,各有各的杀法!
嵌入式软件授权实战:从中科蓝讯芯片到云端双模架构设计 软件授权管理是保护知识产权和实现商业价值的关键技术。其核心原理是通过密码学手段,如非对称加密和数字签名,对软件的使用权限进行验证与控制。在嵌入式系统和软件分发领域,一套健壮的授权方案能有效防止盗版,保障开发者权益,并为订阅制、按需付费等商业模式提供支撑。常见的实现方式包括基于硬件的加密狗授权和基于网络的云端授权,两者各有优劣。硬件加密狗提供离线安全信任根,而云端授权则便于动态管理与策略下发。本文将两者结合,以中科蓝讯芯片的安全特性为硬件锚点,构建了一套“本地加密狗+云端服务”的双模授权体系。该方案深度整合了 阅读详情

相关推荐

CTF实战攻略:从Web渗透到逆向分析的全方位解题思路与工具链

网络安全竞赛(CTF)是检验安全技能的综合平台,其核心在于对漏洞原理的深入理解与工程化利用。在Web安全领域,SQL注入、文件上传等经典漏洞常作为突破口,通过手工测试与自动化工具(如sqlmap、Burp Suite)结合,实现从信息搜集到命令执行的完整攻击链。密码学题目则考验对编码、古典密码及现代加密算法的识别与逆向能力,而逆向工程需借助IDA Pro等工具进行静态分析与动态调试,以还原程序逻辑。这些技术不仅在竞赛中至关重要,更是渗透测试、漏洞研究等实际安全工作的基础。本文以典型CTF赛题为例,系统梳理了

weixin_30383279的博客 415

利用Winhex,OllyDbg和W32Dasm破解USB监控器

1.破解原理

llsnb666的博客 1858

C++游戏逆向:从内存读写到远程线程调用的自动化辅助开发

在软件开发和系统编程领域,进程间通信与交互是一项基础且关键的技术,它允许不同程序在运行时进行数据交换和指令控制。其核心原理在于操作系统提供的API,使得一个进程能够访问和操作另一个进程的内存空间与执行流程。这项技术的工程价值在于实现自动化、集成化以及深度系统监控,广泛应用于软件调试、安全分析、自动化测试等场景。例如,在游戏开发与安全研究领域,通过读取游戏进程内存数据并分析其结构,可以构建自动化脚本或工具。这涉及到使用C++进行底层内存操作,并利用远程线程技术安全地注入和执行代码,从而实现模拟玩家操作的功能。

weixin_34401479的博客 384

运用OllyDbg进行加密狗复制

加密狗(Dongle)是硬件版权保护设备,通过USB连接验证软件授权。使用OllyDbg逆向分析时,需定位验证代码、调试通信数据(如API调用、密钥交换),并提取算法逻辑。破解方法包括修改内存返回值、复制硬件芯片或编写虚拟驱动模拟响应。注意法律风险及技术难点(如动态密钥、反调试),可借助IDAPro、逻辑分析仪等工具辅助分析。

Greer82 加密狗复制模拟等 530

全面认识USB技术的精髓(二)

本文介绍USB总线的数据传输模式、USB数据包的格式,以及USB外设的组成与结构等内容。一、USB数据包的格式  在USB系统中,有四种形式的数据包--标记数据包(Token Packets)、DATA数据包(DATA Packets)、帧开始数据包(SOF Packets)和握手数据包(Handshake Packets)。  1.标记数据包由PID、ADDR、ENDP和CRC5四个

小伟 1万+

ET199加密锁客户号与ATR修改技术解析与实现

在信息安全与软件版权保护领域,硬件加密锁(加密狗)是防止未授权访问的核心设备。其工作原理基于内置安全芯片与特定通信协议,通过唯一标识(如客户号)和复位应答(ATR)机制实现身份认证。从技术原理看,加密锁本质是一个具备独立运算能力的嵌入式安全系统,涉及USB通信协议、智能卡文件系统和密钥管理体系。理解其通信协议与存储结构,对于进行安全评估、授权迁移或兼容性开发具有重要价值。本文聚焦于ET199这款经典加密锁,深入探讨其客户号修改与ATR模拟的具体技术路径,涵盖硬件逆向、协议分析、驱动开发等工程实践,为相关领域

weixin_33795743的博客 452

048_逆向工程实战进阶:OllyDbg动态调试高级技巧与复杂程序分析深度解析

高级条件断点不仅仅是简单的寄存器比较,还可以设计复杂的表达式来精确定位程序行为

欢迎来到智能安全前线!这里是AI与信息安全交汇之地。我们以代码为武器,深入大模型攻防实战,破解系统漏洞。追踪OpenAI、Meta前沿动态,用红蓝对抗思维,锻造智能时代的坚盾与利矛。 1530

从基础知识到PCB设计,打造全能硬件工程师

成为一名出色的硬件工程师需要在多个领域建立坚实的基础。从硬件基础知识、元器件学习、模拟电子电路到PCB设计,以及数字电子电路与通信,每个方面都是构建全面硬件工程师技能集的重要组成部分。通过深入学习和实践这些领域,你将能够在硬件工程领域中取得更多的成就。

weixin_46969363的博客 2726

软件破解简单上手 OllyDbg调试器应用

现在破解者们可能都在用OllyDbg调试器对软件进行动态的分析,因为目前多数的软件都工作在WINDOWS XP的平台上,并且OllyDbg调试器结合了动态和静态调试的特性,简单易用。          针对这次要破解的小程序,熟悉一下OllyDbg调试器的用法。 工作前的准备          OllyDbg调试器的下载:         http://www.pediy.com/tool

zhangyanquen的技术专栏 1411

HFSS仿真的后处理结果,如何根据天线表面的电流密度分布对天线进行优化?

在HFSS仿真中,天线表面的Jsurf​是最直观、最有价值的诊断工具之一。它不仅告诉你天线“能不能工作”,还能告诉你“为什么工作”以及“哪里出了问题”。

degogmy的博客 1163

51单片机-点亮LED和蜂鸣器

ULN2003是高耐压、大电流达林顿陈列,由七个硅NPN达林顿管组成。ULN2003是大电流驱动陈列,多用于单片机、只能仪表、PLC、数字量输出卡等控制电路中。可直接驱动蜂鸣器、继电器等负载。void delay(u16 i) // i等于1大约10uswhile(i--);//取反,高低电平不断变化,产生脉冲delay(10);// 周期200us。

三日沐水 1130

破解USB HID 设备接口协议

分析 USB HID 设备接口协议 工具: OllyDbg,Bus hound 程序识别USB HID外设的方法:调用HidD_GetHidGuid函数获取HID设备的类标识,调用SetupDiGetClassDevs函数查询所有已安装的HID设备,得到一个指向该HID设备集合的句柄,调用SetupDiEnumDeviceInterface函数查询HID设备集中每一个设备的接口信息,对每一个接口,...

weixin_33778778的博客 1136

【git】git: ‘interpret-trailers’ is not a git command. See ‘git --help’

cents 7.6系统. yum源安装git最新版本是1.8.3 报错: git: 'interpret-trailers' is not a git command. See 'git --help'. cannot insert change-id line in .git/COMMIT_EDITMSG 解决: git add xxx git commit -m "xxx" 然后修改 vim .git/hooks/commit-msg #if test -n "${reviewurl}" ; th

machh的专栏 4760

OllyDbg下载及安装一文说清:32位调试器安装全流程

手把手带你完成OllyDbg下载及安装全过程,覆盖环境适配、依赖配置与常见报错处理,专为Windows 32位逆向调试场景优化。全程无需复杂工具链,小白也能快速上手调试实战。

weixin_36483050的博客 865

数学工具箱:Clarke与Park变换

本文详细解析了FOC(磁场定向控制)中的核心数学工具——Clarke变换与Park变换。首先阐述了坐标变换的必要性:将复杂的三相交流系统简化为直流系统,便于精确控制。Clarke变换将三相静止坐标系转换为两相静止坐标系,减少变量数量;Park变换进一步将两相静止坐标系转换为两相旋转坐标系,实现交流量到直流量的转换。文章提供了两种变换的数学公式、物理意义图解及C语言实现代码,并简要介绍了逆变换过程。这些变换为电机控制提供了关键的数学基础,后续将结合GD32F303的FPU特性进行优化实现。

汽车电子软件领域知识分享 182

YOLOv8改进:基于EfficientNetV2均衡缩放网络的特征提取层优化【YOLOv8】

YOLO(You Only Look Once)系列模型以其高效的实时目标检测能力而闻名。YOLOv8作为该系列的最新版本,通过引入改进的网络结构和算法优化,进一步提升了目标检测的性能。然而,YOLOv8在特征提取阶段的网络结构仍有改进的空间。EfficientNetV2是一种基于均衡缩放的卷积神经网络,它通过优化网络的宽度、深度和分辨率来实现高效的特征提取。与之前的EfficientNet版本相比,EfficientNetV2在速度和精度上都有显著提升,尤其在处理复杂目标检测任务时表现尤为突出。

博客 1582

破解加密狗时间限制介绍

破解加密狗的时间限制涉及法律和道德问题,以下内容仅供技术研究和教育目的。实际操作需获得合法授权切遵守相关法律法规。加密狗是一种硬件设备,用于软件版权保护。它通过存储密钥或算法,与软件交互验证合法性。时间限制通常通过内部时钟或服务器验证实现。

Greer82 加密狗复制模拟等 232

基于深度学习的野生菌菇检测识别分类系统(YOLOv8 + UI界面 + 数据集)

随着深度学习技术的迅猛发展,计算机视觉领域的应用得到了广泛的关注。野生菌菇的检测与识别是一个复杂而又有趣的问题,涉及到物体检测、图像分类以及自然语言处理等技术。本文将介绍如何基于YOLOv8模型,结合自定义UI界面与数据集,构建一个高效且精确的野生菌菇检测识别分类系统。首先,我们将介绍YOLOv8的原理与特点,然后详细描述如何构建和训练野生菌菇识别模型,并介绍如何为该系统设计UI界面,最终形成一个完整的系统。本文内容包括代码实现、模型训练及数据集准备等,旨在为有类似需求的开发者提供参考和帮助。目录摘要目录。

YOLO 1549

USB学习笔记——通信协议

USB学习笔记——通讯数据分析 USB的重要关键字 端点:位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有唯一确定的地址,有不同的传输特性(如输入端点、输出端、配置端点、批量传输端点) 帧:时间概念,在USB通信中,一帧就是1ms,它是一个独立的单元,包含一系列总线动作,USB将一帧分为好几份,每一份就是一个USB传输动作。 上行、下行:设备到主机为上行,主机到设备为下行。 USB 的基础知识 USB的数据格式是由二进制串构成,首先是 二进制串 构成 字段(有7种),

s151140124的博客 828

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

USB协议详解第7讲(补充-USB帧和微帧剖析)

目录 1.概念 2.全速USB传输(帧) 3.高速USB传输(微帧) 上一篇讲解端点描述符的时候提到了帧和微帧的概念,可能很多人会晕,这节课先做下补充,避免大家放弃学习。 1.概念 (1)USB2.0帧和微帧属于物理层时间基准的概念,低速和全速下每个帧时长为1ms,高速下每个帧又分为8个微帧,即每个微帧时长为125us。 (2)USB主机和设备控制器同步后,每个微帧起始点开始传输数据,如果没有数据,则SOF包发送完毕之后,总线进入空闲状态,一会下面看解析图图。 (3)每一个帧(微帧)起始点会

一个早起的程序员 1万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

USB HID类设备开发中用CreateFile无法得到设备句柄

Mouse和Keyboard这类HID类设备是被系统独占的,若想用CreateFile得到句柄需把第二个参数为0; CString strShow; int flag=0; int vid = 0x046D; int pid = 0xC040;  //获得GUID GUID guidHID; HidD_GetHidGuid(&guidHID); strShow=_T("HID类

seth1104的专栏 6901

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

USB GUID查找

<br />  <br /> <br /> <br />//*****************************************************************************<br />作者:Eragon<br />Bg:http://hi.baidu.com/nirvana68/                      <br />//****************************************************************

个人开发记录 8948

SetupDiGetDeviceInterfaceDetail 函数

SetupDiGetDeviceInterfaceDetail 该函数返回设备接口的详细信息。 WINSETUPAPI BOOL WINAPI SetupDiGetDeviceInterfaceDetail( IN HDEVINFO DeviceInfoSet, IN PSP_DEVICE_INTERFACE_DATA DeviceInterfaceD...

weixin_34121304的博客 619
上一篇: usb监视等相关开发材料
下一篇: 基于消息方式的usb监测完整基础代码
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值