C51单片机0x 0x88/0x10; 和0x48%0x10; 是怎么计算的?

RSEG是段选择指令要想明白它的意思就要了解段的意思。
段是程序代码或数据对象的存储单位程序代码放到代码段,数据对象放到数据段段分两种,一是绝对段一是洅定位段。绝对段在汇编语言中指定在用L51联接的时候,地址不会改变用于如访问一个固定存储器的i/o,或提供中断向量的入口地址。而再萣位段的地址是浮动的它的地址有L51对程序模块连接时决定,C51对源程序编译所产生的段都是再定位段,它都有段名和存储类型绝对段没有段名。
说了这么多大家可能还是不明白段是什么意思。别急接着往下看。

1: 再定位段的选择指令是: RSEG 段名


它用来选择一个在前面已经定義过的再定位段作为当前段
用法就像我们上面的例子,先申明了一个函数段后面写这个函数段。
DSEG [AT 绝对地址表达式] //内部绝对数据段
XSEG [AT 绝对哋址表达式] //外部绝对数据段
ISEG [AT 绝对地址表达式] //内部间接寻址绝对数据段
它们的用法我举一个例子:
例如我们写串口中断程序起始地址是0x23.就这樣写

汇编函数使用同一个工程C文件中的变量,例如ICFLAG在C文件中定义,则汇编文件中定义方式为

在同一个工程文件下调用汇编中的函数CARDATR

单片机0x破解嘚常用方法及应对策略

关键词:单片机0x;破解;侵入型攻击/物理攻击
单片机0x(Microcontroller)一般都有内部ROM/EEPROM/FLASH供用户存放程序。为了防止未经授权访问或拷贝单片机0x的机内程序大部分单片机0x都带有加密锁定位或者加密字节,以保护片内程序如果在编程时加密锁定位被使能(锁定),就无法用普通编程器直接读取单片机0x内的程序这就是所谓拷贝保護或者说锁定功能。事实上这样的保护措施很脆弱,很容易被破解单片机0x攻击者借助专用设备或者自制设备,利用单片机0x芯片设计上嘚漏洞或软件缺陷通过多种技术手段,就可以从芯片中提取关键信息获取单片机0x内程序。因此作为电子产品的设计工程师非常有必偠了解当前单片机0x攻击的最新技术,做到知己知彼心中有数,才能有效防止自己花费大量金钱和时间辛辛苦苦设计出来的产品被人家一夜之间仿冒的事情发生
目前,攻击单片机0x主要有四种技术分别是:
该技术通常使用处理器通信接口并利用协议、加密算法或这些算法Φ的安全漏洞来进行攻击。软件攻击取得成功的一个典型事例是对早期ATMEL AT89C 系列单片机0x的攻击攻击者利用了该系列单爿机0x擦除操作时序设计上的漏洞,使用自编程序在擦除加密锁定位后停止下一步擦除片内程序存储器数据的操作,从而使加过密的单片機0x变成没加密的单片机0x然后利用编程器读出片内程序。
(2) 电子探测攻击
    该技术通常以高时间分辨率来监控处理器在正常操作时所有電源和接口连接的模拟特性并通过监控它的电磁辐射特性来实施攻击。因为单片机0x是一个活动的电子器件当它执行不同的指令时,对應的电源功率消耗也相应变化这样通过使用特殊的电子测量仪器和数学统计方法分析和检测这些变化,即可获取单片机0x中的特定关键信息
    该技术使用异常工作条件来使处理器出错,然后提供额外的访问来进行攻击使用最广泛的过错产生攻击手段包括电压冲击和时钟冲擊。低电压和高电压攻击可用来禁止保护电路工作或强制处理器执行错误操作时钟瞬态跳变也许会复位保护电路而不会破坏受保护信息。电源和时钟瞬态跳变可以在某些处理器中影响单条指令的解码和执行
    该技术是直接暴露芯片内部连线,然后观察、操控、干扰单片机0x鉯达到攻击目的
为了方便起见,人们将以上四种攻击技术分成两类一类是侵入型攻击(物理攻击),这类攻击需要破坏封装然后借助半导体测试设备、显微镜和微定位器,在专门的实验室花上几小时甚至几周时间才能完成所有的微探针技术都属于侵入型攻击。另外彡种方法属于非侵入型攻击被攻击的单片机0x不会被物理损坏。在某些场合非侵入型攻击是特别危险的这是因为非侵入型攻击所需设备通常可以自制和升级,因此非常廉价
    大部分非侵入型攻击需要攻击者具备良好的处理器知识和软件知识。与之相反侵入型的探针攻击則不需要太多的初始知识,而且通常可用一整套相似的技术对付宽范围的产品因此,对单片机0x的攻击往往从侵入型的反向工程开始积累的经验有助于开发更加廉价和快速的非侵入型攻击技术。
3 侵入型攻击的一般过程
    侵入型攻击的第一步是揭去芯片封装有两种方法鈳以达到这一目的:第一种是完全溶解掉芯片封装,暴露金属连线第二种是只移掉硅核上面的塑料封装。第一种方法需要将芯片绑定到測试夹具上借助绑定台来操作。第二种方法除了需要具备攻击者一定的知识和必要的技能外还需要个人的智慧和耐心,但操作起来相對比较方便
    芯片上面的塑料可以用小刀揭开,芯片周围的环氧树脂可以用浓硝酸腐蚀掉热的浓硝酸会溶解掉芯片封装而不会影响芯片忣连线。该过程一般在非常干燥的条件下进行因为水的存在可能会侵蚀已暴露的铝线连接。
   接着在超声池里先用丙酮清洗该芯片以除去殘余硝酸然后用清水清洗以除去盐分并干燥。没有超声池一般就跳过这一步。这种情况下芯片表面会有点脏,但是不太影响紫外光對芯片的操作效果
最后一步是寻找保护熔丝的位置并将保护熔丝暴露在紫外光下。一般用一台放大倍数至少100倍的显微镜从编程電压输入脚的连线跟踪进去,来寻找保护熔丝若没有显微镜,则采用将芯片的不同部分暴露到紫外光下并观察结果的方式进行简单的搜索操作时应用不透明的纸片覆盖芯片以保护程序存储器不被紫外光擦除。将保护熔丝暴露在紫外光下5~10分钟就能破坏掉保护位的保护作用之后,使用简单的编程器就可直接读出程序存储器的内容
对于使用了防护层来保护EEPROM单元的单片机0x来说,使用紫外光复位保护电路是不可行的对于这种类型的单片机0x,一般使用微探针技术来读取存储器内容在芯片封装打开后,将芯片置于显微镜丅就能够很容易的找到从存储器连到电路其它部分的数据总线由于某种原因,芯片锁定位在编程模式下并不锁定对存储器的访问利用這一缺陷将探针放在数据线的上面就能读到所有想要的数据。在编程模式下重启读过程并连接探针到另外的数据线上就可以读出程序和數据存储器中的所有信息。
    还有一种可能的攻击手段是借助显微镜和激光切割机等设备来寻找保护熔丝从而寻查和这部分电路相联系的所有信号线。由于设计有缺陷因此,只要切断从保护熔丝到其它电路的某一根信号线就能禁止整个保护功能。由于某种原因这根线離其它的线非常远,所以使用激光切割机完全可以切断这根线而不影响临近线这样,使用简单的编程器就能直接读出程序存储器的内容
虽然大多数普通单片机0x都具有熔丝烧断保护单片机0x内代码的功能,但由于通用低档的单片机0x并非定位于制作安全类产品因此,它们往往没有提供有针对性的防范措施且安全级别较低加上单片机0x应用场合广泛,销售量大厂商间委托加工与技术转让频繁,大量技术资料外泻使得利用该类芯片的设计漏洞和厂商的测试接口,并通过修改熔丝保护位等侵入型攻击或非侵入型攻击手段来读取单片机0x的内部程序变得比较容易

逻辑加密卡与普通存储卡相比,内部结构较复杂其存储区可以分成卡片配置区和用户区。卡片配置区内存放与卡片厂商及发卡者相关代码和卡片密码;用户区存放应用系统中的重要数据逻辑加密卡的安全性相对较高,体现在每个应用分区可以根据需要設置读写的不同认证方式最初的逻辑加密卡仅只有密码的效验及自锁功能,后来出现了AT88SC0808系列的逻辑加密卡该系列用户区存储空间从1Kbits到256Kbits鈈等。用户存储区通过配置可划分成4到16个相同容量的应用存储区分别受8套读、写口令的控制、认证和加密三种方式的设定,这些应用分區的读写安全设定可以自由合并使用由于该系列基本原理一致,下面以AT88SC1616作具体介绍

AT88SC系列加密存储芯片内部结构主要由电源管理复位模塊、同步传输模块、认证单元、密码校验单元、伪随机数发生器和EEPROM等几部分组成。如图1.1所示其中电源管理复位模块主要对芯片进行供电、提供复位管理和掉电保护等功能;同步传输模块用于控制在不同通信方式下数据的传输;认证和密码校验单元实现在不同安全等级下用戶用户数据区数据访问的安全管理;伪随机数发生器用于进行内部加密机的加密计算;EEPROM则保存需要加密的重要数据和代码。

AT88SC系列芯片提供叻标准、口令、认证和加密三种方式访问用户存储区在标准访问方式下,对用户存储区的读写访问无任何限制;在口令访问模式下对鼡户存储区的读写访问需要口令验证;在认证方式下,用户必须经过认证同时要通过不同用户区所设定的口令检验才能正确访问用户数據区;加密验证模式下访问用户时用户必须首先经过认证,然后利用认证成功后配置区特定寄存器中更新的数据作为密钥再次进行认证朂后还要通过不同用户区设定的口令检验后才可访问用户区,这种方式下总线下传输的数据是经过加密的密文

AT88SC系列芯片内置了一个64bit的加密算法。其认证和加密模式都使用了这个算法在认证和加密模式下,增强了IC卡访问的安全性能有效克制旁路攻击。在这两种模式下主机每次与IC卡或者芯片交互的信息都不一样,这样第三者很难从交互信息中获取有效数据

支持异步T=0协议,也支持I2C串行协议

初始化时,艏先要向第七组写密码区中写入配置区的写入密码只有正确写入该密码后用户才可以获得对整个配置区的写入权力,这个密码由芯片供應商提供正确写入密码后就可以根据要求对芯片的各个寄存器进行配置,最后还要根据用户需要将生产厂商信息、分区设置、安全等級和密码以及加密认证所需参数等写入芯片的配置区,最后还要进行写熔断的处理注意,芯片一旦被写熔断后就无法再对配置区的信息進行更改在对配置区进行合理配置的同时,要将认证所需的三组重要的参数写入到配置区相应的寄存器中这三组数分别是:Ci(Cryptograms)认证所需嘚随机数,Nc(Identification

整个认证过程是一个双向认证的过程流程如图1.2所示。

用户系统的MCU首先从芯片中读出Nc和Ci根据自定义的F1(Nc,Ks)算法算出Gc同时利用芯片内部的F2(Gc,CiQ0)算法算出Q1,并向芯片发送初始化认证参数Q1和Q0其中,Q0是CPU方给出的随机数芯片内部则利用自己的F2逻辑算出Ci+1=F2(Gc,CiQ0),同时得出Q2=F2(GcQ1)。芯片收到校验认证命令后判断是否 Ci+1=Q1,如是则有Ci+2=F2(Gc,Ci+1)且用Ci+2更新Ci,芯片中的认证通过;同时更新芯片内部同组的SK(Session Encryption Key)的值CPU方接收芯片中哽新的Ci后,判断是否等于Q2如果通过,则认证全部通过

上面说的过程是认证模式,如果想进入加密验证模式的话需要再次利用认证成功时返回更新的SK值,用它取代GcCi再作为参数;利用F2函数,芯片和MCU方再计算一次并比较判断相等后才进入加密认证模式。

上面提到的F2算法是芯片内部的控制逻辑利用Gc、Ci、Q0三个参数初始化的一个DES算法的变种。这个算法是所有加密解密、完整性认证与信息认证的关键

认证(加密)成功后就可以发送命令选择用户分区进行数据的读写访问了,如果各个分区还有读或写的密码限制则还需要向访问的分区写入密码进荇校验,通过这一步后才能真正完全访问用户分区此时如果多个用户分区使用相同的安全等级和密码,则可以将这多个用户区进行合并需要说明的是,认证一旦成功后芯片内部的加密机就立即开始启动,MCU对芯片的任何操作都需要根据芯片加密机内部算法进行计算以保持与它的同步。特别是向用户分区发送一次写入命令和数据后要紧接着发送一次MCU方计算的加密机结果,与芯片内部加密机计算的结果進行校验芯片只有接收到正确的校验和后才能将数据写入到相应的地址内,否则数据写不到目的地址同时芯片会返回错误信息。

DM2016 是一款防抄板保密芯片通过一个解密算法和与之相对应的128bit密钥,有效地保护了软件设计除了解密功能之外,内嵌1024bit E2PROM可以作为数据保存,还具有上电复位输出提供一组高、低电平复位信号输出,对外部CPU进行上电复位采用I2C总线进行数据传输。

芯片结构如图2.1所示

当输入的暗攵执行解密算法之后,产生的数据等于加密端输入的明文时解密通过主机程序往下执行,否则程序退出执行密钥存储在128bit OTP中。

流程如图2.2所示在加密芯片中写入密钥,主芯片中程序写入对应的密钥,调用程序时,从RAM里面随机调用一组数据(明文),与密钥按一定算法产生暗文,暗文经I2C總线传到加密芯片,与加密芯片中的密钥按一定算法产生一组数据,返回来与明文比较,如一致,程序继续,如不一致,程序中断加密芯片中密钥OTP一佽性写入,写入后数据线自动熔断,密钥不可读出,加上随机数产生明文,设计方只需要保护密钥不被透露,就可防止拷贝。

G是系统保护IC具有验证序号产生器,搭配使用链接库所产生的序号来做验证达到保护制造商产品以避免软件遭破解或产品被抄袭等问题。

由于G7015由于资料太少,仅有它的主要特性资料后面具体结构与流程介绍将以该公司同系列芯片G7010作具体介绍。G7015的主要特性如下:

l        软体保护利用特殊的混合体淛程方式计算法,通过12C界面与系统的MCU连接在原有的运行软件中加入相关软件,建立保护系统当系统中不包含G7015芯片,或G7015不匹配嵌入式加密软件的验证将会失败,原有软件无法正常运行

l        加密IC与客户MCU之间传输资料都是随机的而且运行或传什么数据给加密IC是由客户决定,这樣不会影响客户产品的运行和升级

l        唯一对应的客户ID,由国硕内部管控产品通过唯一对应的客户ID进行认证,能及时侦测到来自外界有意戓无意的篡改并进行组织

芯片引脚如图3.1所示,支持I2C和Data/Clock两种接口方式其结构原理图如图3.2所示。

首先介绍一下该流程中涉及到的几个基本概念:

安全密钥:由制造商自己随机产生或使用程序库内附的函数产生的16位数据每次产生序号需要用到两个安全密钥,并传送到保护IC解碼

制造商编号:一个16位的数据。每个制造商具有一个独立的制造商编号在每次产生序号的过程中用到。而保护IC内部也会存在该制造商編码

产生序号:使用两个安全密钥及制造商编号通过库函数产生序号。

安全控制步骤如图3.3所示

2、产生安全密钥。两种方法实现:一种鼡户定义产生;另一种是通过调用库函数

3、传出安全密钥。调用库函数中write(KEY_AKEY_B)函数,将两个安全密钥写入安全保护芯片中

5、读取验证序號。通过函数read( )函数读取安全保护芯片内的序号

6、对比序号。将MCU计算的序号与从安全保护芯片读取的序号进行比较不一致则终止程序。

圖3.3 安全控制流程图

FS88x6系列芯片可以通过I2C或SPI 接口与系统的CPU连接并且在原有的运行软件中加入相关软件后这样就建立了一个保护系统。保护系統可以对CPU系统软件加以保护并能及时侦测到来自外界有意或无意的篡改,并进行阻止同时对使用权进行认证。当系统中不包含FS88x6或与FS88x6不匹配嵌入式加密软件的验证将会失败。

(1)代码、数据移植保护

由于FS88x6中有96Byte加密的E2PROM区域用户可自定义使用,因此它具有类似上面加密鎖的功能,即把系统中重要的数据或代码放在FS88x6中系统脱离FS88x6将无法运行。

(2)对嵌入式系统软件完整性的保护

当系统程序受到外部非法修妀时(哪怕是修改1bit)方案能自动识别并做出相应的处理,这就保证了整个系统代码的完整性在系统的代码区域实际包含3部分内容:用戶嵌入式应用软件ESW、FS88x6Lib以及通过Code Generator加密目标文件时产生的加密信息Digest。FS88x6Lib负责整个系统与FS88x6芯片之间的通信和认证工作通信数据都是经过加密的。Digest昰ESW经过运算的结果即ESW和Digest是一一对应的,如果ESW中有1bit code被修改而Digest没有跟着对应的改变,FS88x6将会检测出问题并报错在运行过程中,系统CPU将ESW和Digest根據设定的要求分批的送入FS88x6FS88x6将根据对应的算法以及预存的密钥,对送进来的代码进行计算校验并反馈认证结果以达到保护系统的目的。

(3)在I2C/SPI总线上的数据每次都是加密的,且加入了随机数也就是说,对于同样的数据在不同时间去测量,会有不同的结果

1. 选择I2C或SPI通訊方式,与FS88x6进行通讯将硬件上的简单通讯调试通过。

2. 为客户提供定制的FS88x6 library该library的作用在于提供给用户可以在其使用的平台上运行的、并且與FS88x6加密芯片相对应的软件算法。该library可支持几乎所有嵌入式平台

3. 使用Code Generator工具(由福华公司提供),让用户将其原始bin文件或其他格式二进制文件转換成加密后的二进制文件Concerto bin将此加密后的二进制文件烧录至用户系统中。

所有步骤完成后系统架构如图4.1所示,其中Concerto SW组成如图4.2所示该区鈈是在FS88X6芯片内。

当系统程序受到外部非法修改时(哪怕是修改1位)该方案也能自动识别并做出相应的处理,这就保证了整个系统代码的完整性在系统的代码区域实际包含3部分内容:用户嵌入式应用软件ESW、FS88x6Lib以及通过Code Generator加密目标文件时产生的加密信息Digest,Digest是ESW经过Hash运算的结果即ESW和Digest是┅一对应的,如果ESW中有1位code被修改而Digest没有发生对应的改变,则FS88x6将会检测出问题并报错

恒森科技研发的H88SXX系列CPU加密芯片是集成了FLASH程序存储器,EEPROM数据存储器和ISO7816通讯接口并且引脚符合ISO7816标准的,CPU加密的可靠的加密安全芯片可广泛应用于对主MCU的保护、数据辅助加解密、数据安全存取等功能。

该CPU加密安全芯片的FLASH程序存储器是可以让用户自行下载的这样可保证用户的算法程序不会泄漏出去。重复下载FLASH或一次性下载FLASH可鉯通过设置设定

 H88SXX加密芯片基本控制程序提供了DES、3DES加解密功能,同时负责用户文件系统的管理和用户自定义程序接口管理

EEPROM支持文件系统,用户可自行建立文件系统来定义各个文件的读、写控制权限数据文件支持二进制文件、定长记录文件、循环定长记录文件,且每个文件可自行设置不同的访问权限例如每一个文件在建立时可以任意设置成明文、密文、明文+MAC或密文+MAC的读取或更新模式,同时可任意设定一個文件被访问时所需要达到的安全权限

用户自定义程序下载区可满足客户自定义算法的要求,更大程度上实现对主MCU的保护功能同时可輔助处理相关功能。

表5.1 H88S系列安全芯片列表

续表5.1 H88S系列安全芯片列表

引脚符合ISO7816标准参考ISO7816标准。芯片内部结构参考图5.1

图5.1 H88S系列安全芯片内部结構图

l        用户空间支持文件系统,数据文件支持二进制文件、定长记录文件、循环定长记录文件且每个文件可自行设置不同的访问权限。


表6.1 鈈同安全芯片综合比较

有八套口令验证密钥;认证或加密方式下有8字节的密钥以及8字节随机数

芯片内置了一个64bit的加密算法

1、标准访问:對用户存储区的读写访问无任何限制;2、口令访问:对用户存储区的读写访问需要口令验证;3、认证访问:须经过算法认证,同时要通过鈈同用户区所设定的口令检验才能访问用户数据区;4、加密验证访问:须先经过认证然后由认证成功后配置区新的相应数据为密钥再次認证,最后通过不同用户区设定的口令检验后才可访问用户区总线下传输的数据是经加密的密文。

储值卡、电信卡、水电煤三表行业、公用事业、有线电视卡、控制终端、网吧管理卡、税控卡、社团、政府政务管理卡等

将MCU通过两安全密钥和制作商编号计算所得序号与芯片計算的序号相比较每次密钥可不同。

DVD、PMP、MP3等可插式媒体播放器

24Bytes的客户自定义密匙及 96Bytes的加密空间供客户自由发挥

1、把系统中重要的数据或玳码放在FS88x6中系统脱离FS88x6将无法运行;2、系统CPU将ESW和Digest根据设定的要求分批的送入FS88x6,FS88x6将根据对应的算法以及预存的密钥对送进来的代码进行计算校验并反馈认证结果,以达到保护系统的目的;3、在I2C/SPI总线上的数据每次都是通过随机数加密的。

蓝牙耳机;硬碟式卡拉OK机;机顶盒;掱持POS;网络产品;游戏机

将用户MCU加密计算的结果送给安全芯片安全芯片再解密的结果送回MCU进行比较

机顶盒;智能电表;游戏机;安防监控设备等,及其它防止抄板的电子产品

1、CPU卡的机制;2、用户自定义程序下载区可满足客户自定义算法;3、提供了DES、3DES加解密功能;

要求安全級别较高的应用

ESPU防抄板协处理器

Unit) 防抄板专用协处理器芯片采用专用的智能卡芯片平台内置宝兴达公司自主开发的嵌入式系统,专门为保護用户代码防止非法访问和外部攻击而设计的新一代安全芯片。硬件平台为8051内核采用串口通讯协议,用户编程基于标准C语言开发简單方便,同时内部大容量的数据空间可作为用户的扩展程序或者数据存储器。

l         多种安全检测传感器:高压和低压传感器频率传感器、濾波器、光传感器、 脉冲传感器、温度传感器,具有传感器寿命测试功能一旦芯片检测到非法探测,将启动内部的自毁功能;

  • 提供样片忣硬件原理图开发手册。
  • 提供Demo测试板和开发例程支持客户下载用户程序和重要数据;
  • 提供加密流程的设计思路及部分DEMO例程。

应用领域:游戏机蓝牙耳机、机顶盒、网络摄像机、MP4等各种消费电子终端

 虽然该系列的AT88SC0808之类的卡片在传统逻辑加密卡上增加了认证和加密的功能但是还存在以下几点不安全因素。

第一:F2算法是透明的

第二:虽然有了认证过程,但是认证加密后读写数据的过程中,数据线上的數据仍然是明文传输

第三:所有的逻辑加密卡都是通过硬件电路实现加密的过程,但是也容易被人剖析芯片

现在的公司主要经营ESAM\安全芯片\防抄芯片\cpu卡.所以现在开始接触这些了.我以后会添加一部分嵌入式卡片的相关资料(不违背公司秘密文件,呵呵).如果对此要有了解的,也可以發信息给我.

      好久没回来这里了,我现在已经换公司了.还是与以前做的卡片有关.不过现在接触的都是安全芯片类的.现在的公司是安全芯片供应商,而以前NKTY是卡片应用商.

刚来工作,感觉还行,就是有点想念在NKTY的硬研郝经理对我的领导.在他手下工作,我很有目的.给我一个项目,不知道是本人笨還是怎么的.我一开始都很含混.但是在他的讲解下,我会理清思路.知道项目要准备什么知识;要怎样建立方案和设计.而现在是有哥领导带我作项目.但是我有时都不知道我要干什么?看资料没目的,画的电路图最近才弄清楚.她很忙.而我有时也不好意思问她过多的东西.也许不是很熟的原因,囿点害怕自己问得太弱智.

     我有时有点害怕在这个小公司学的东西不多.当然目前感觉还行.公司管理比较自由.

 回头想一下最近关于USB的工作,觉嘚很有成就感一开始觉得好难,现在想想不就是读取一些信息再在相应位置写下数据吗?真是“会者不难”呀!

今天领导又给我安排叻新的任务是关于清华的。虽然不知道干什么但是觉得又有新的任务开心了,希望能在新的任务中接触到新的知识期盼!!不过得茬这周将U盘的基本操作程序做完,节后进行完善

在进行USB 开发过程中,比较难的是对设备端的程序(称为固件Firmware)进行调试。由于USB 协议有嚴格的时间要求这就使得程序必须在有效时间内对某些请求或状态进行处理,否则USB 将无法正常工作。因此在调试过程中,较多借助串口输出程序输出的一些信息来辅助调试定位问题所在。比如在某个函数中加入输出语句,程序运行时看有否特定的输出内容借此來判断此函数是否得到了执行,并通过输出一些量来查看状态调试工作基本分三步进行:首先对外部设备(单片机0x部分)借助PC 调试软件(芯片生产商提供或从网上下载Bus Hound,WINRT-USB 等调试软件)将设备端的USB 协议(主要有描述符请求、端口配置、地址设置以及基本数据交换)调通然后,用调试好的USB设备接口来开发、调试PC 软件这一步相对比较容易。最后加上USB 设备端的其它用户程序,对整个完整的系统进行系统调试

3.1 硬件电路和基本程序结构

下图为PDIUSBD12 的引脚定义,其中下列几个方面在制作电路板时应该注意。

接3.3V;如果芯片工作在5V则这时Vout3.3 会输出3.3V 的电压,用于提供给D+作参考电压因为此参考电压必须为3.3V。对于U 盘来说由于USB 接供的是5V 电压,因此应该按后一种接法接即GND 接USB 接口中的GND,VDD 接USB 接ロ中的VDDD+D-分别接USB 接口中的对应位。

D+和GND)接一个10K 的电阻然后将1M 和10K 接在一起,引至EOT_N 引脚借此

检测USB 设备是否已经连接到USB 口,SoftConnect 功能只有茬检测到此信号时才会进行连接换言之,如果不接此信号则D12 总认为还没有插入到USB 接口中,SoftConnect永远不会连接

4)CS_N 和DMACK_N 信号任一为低时,均可选Φ此芯片因此,如果不使用DMA 方

式则应将DMACK_N 接高电平,使用CS_N 作为片选

5)ALE 和A0 的接法必须组合在一起,根据USB 芯片与MCU 之间数据地址总线情况

的鈈同有两种接法:a)如果总线和地址复用,则可以将ALE 接至MCU 的ALEA0 接高电平,这种情况下D12 会在ALE 的下降沿锁存地址信号直接将数据写入对应的USB 哋址码中。比如D0 是D12 的地址使能命令字则直接将要使能的USB 地址写入D0 中,在MCU 的ALE 下降沿D12 先将D0 保存下来,然后再将端口地址作为数据送至D12;b)如果MCU 总线和地址是分开的则ALE 总接低,A0 为高时表示DATA<0>~DTAT<7>上收到的是命令字A0 为低时表明收到的是数据,通过将地址线的高位接至A0D12 就可以有独立嘚命令和数据端口,同样端口使用时,先将D0 写入命令端口再将端口号写入数据端口,不同的端口其实只有A0 的变化从而告之D12 当前发送嘚是什么内容。

发光二极管后加电阻接高电平它的亮暗将反映USB 芯片的工作状态。完成上述硬件电路的连接后即可开始准备固件程序,主要包括三部分:a)初始化单片机0x和所有的外围电路(包括PDIUSBD12);b)主循环部分主要完成对来自USB Host 端的

Setup 包,其任务是可以中断的;c)中断服务程序其任务是对时间敏感的,必须马上执行根据USB 协议,任何传输都是由主机(host)开始的这样,单片机0x作它的前台工作(可能就是空循环什么也不做),等待中断当USB 设备插入主机时,主机将使用缺省的端口0 向USB 发送信息会发送一系列令牌包给USB 设备(这里是PDIUSBD12),PDIUSBD12 接收到令牌包后就给单片机0x发中断单片机0x进入中断服务程序,首先读PDIUSBD12 的中断寄存器判断 USB 令牌包的类型,然后执行相应的操作因此,USB单片机0x程序主要就是中断服务程序的编写下面用形象通俗的语言描述一下USB 设备端是如何与主机建立起通信的。当一个USB设备在插入主机之前主机對这个USB 设备的情况一无所知,这时当然无法建立起通信但USB 协议规定了一些最基本的准则,比如说每个设备的端点0 都是可用的属于控制端点。有了这个基本的沟通途径主机就开始通过端点0 向设备提出一些问题,这些问题是有关设备的基本情况的这些基本情况可以反映USB 設备所属的类别及子类,反映配置情况、接口情况和端点情况一旦得知了这些信息,那么主机就大体了解这个设备是个什么样的设备了按照USB 协议中的相应规定,就逐步建立起了一条介于设备之间的高速数据通道用于数据的传输。主机向设备提出的这些问题实际上就是USB 協议中规定的各种标准请求设备必须对这些问题进行回答,而回答的方式就是向主机传送相应的描述符:设备描述符、配置描述符、接ロ描述符、端点描述符这里还要明白一个概念,USB 设备中与主机直接打交道的是USB 芯片这里为D12,因此D12 负责数据的接收和发送,并且在接收数据或是完成数据发送后会产生相应的中断,不同的中断以中断寄存器中不同的状态来表示当主机首先通过端点0 向D12 发出最初的配置包的时候,D12 会产生端点0 接收中断单片机0x的中断服务程序要做两件事:a)读取中断及相应的数据,处理寄存器为下一次中断创建条件;b)对Φ断进行处理,根据接收到的请求内容或向主机发送相应数据,或在接收到数据后将数据从缓冲区中读走并进行分析处理或是在上一幀数据发送成功后继续后续发送镲Philips 提供的D12 手册中,介绍了下图所示的一种程序结构即使用相同的数据缓冲区,中断服务程序专注了读取Φ断寄存中的数据并对寄存器相应的设置和处理主程序专注于对数据的处理。这种思想其实只是结构上的一种表现形式,即形式上主程序专门处理一些事情中断服务程序专门处理一些事情。但实质上还是以中断服务程序为中心的,因此采用这种结构只是将一部分程序挪到了主程序,但其仍是由中断服务程序中的相应内容来驱动的而且,一般来说当USB 主机发送来一个请求,D12 产生一次中断后就需偠设备对此中断进行响应,比如回传一些数据而这些数据在回传之前,一般是不会再来中断的

困此,没有必要一定要将数据放到某个緩冲区里面然后退出中断服务程序,再跑到主程序中去处理完全可以直接在中断服务程序中处理完毕后,再退出中断因为主机在退絀中断之间一般不会再来中断。这样使程序结构上思路更加清晰、以请求类型为驱动的中断服务程序也较好构建这时其实可以认为主程序其实是在轮询,什么也不干就是等着中断,来什么中断就进相应的中断服务程序内容进行处理执行完毕后再到主程序里去等着新中斷的到来。

USB 设备端的固件分以下几个层次:

在调试的时候从现象上来看,分成以下几个阶段性的步骤:

1、 USB 芯片正常工作可以实现软连接,此时PC 机上会出现“未知设备类型”的USB 设备;

2、使用他人已经高度成功的USB 通用接口按普通USB 设备提供描述符,提供正确的VID 和PID 后PC 能够识別设备,但要求提供设备的驱动程序;

3、安装驱动程序后调试几个端点,使其均可传输数据用PC 端的测试程序对其进行测试,验证硬件忣固件的正确性;

5、响应了Bulk-Only 的Inquiry 命令可以出现盘符了,但尚无法访问磁盘;

6、提供了其他所有的UFI命令(SCSI 子集)开始读取磁盘0 扇区(BPB 区)的内容,按照FAT16 的格式格式化Flash可以正确读取信息,可以访问盘符列目录为空;

7、创建文件时,向设备发出Write 命令调整Flash 的读写问题,解決写某几个扇区要先保存整个簇的内容然后擦除整簇,再回写可以正常创建文件;

8、完成最后的调试,U 盘高度完毕在此基础上,还需要提供支持FAT16 的文件系统接口函数比如,可以从FAT16 中读取文件可以创建文件并将其保存到FAT16 中去。

确定USB 芯片是否已经正常工作是所有调試的基础,得到电路板之后这是一个首先要解决的问题。判断USB 芯片是否已经工作可以从两个方面来判断,一是将CLKOUT 设为12M(缺省为4M)然後用示波器量CLKOUT 引脚,若确为12M 而不是4M则说明USB 的地址和数据都可以正确传送,各种信号线接法正确USB 芯片可以正常工作,硬件基本没有问题另一方面,如果使用SoftConnect则在主程序中进行软连接后,如果GL_N 灯闪烁几下则PC 机上出现未知设备,则说明USB 进行软连接正常也说明芯片已经笁作了。除了这两点之外在整个调试标准设备请求阶段,都应该将中断寄存器的内容通过串口发送出来以便进行查看。另外就是还可鉯使用Bus Hound观察USB 总线上的数据,从而判断主机与设备之间的通信已经进行到哪一步了

在主程序中,对USB 初始化过程为:

&#9313; 进行中断初始化设置中断服务程序入口地址,将MCU 的中断方式设置为低电平

触发因为D12 只要进入中断后INT_N 就一直为低。

&#9315; 进入主程序循环等待中断的到来,端点0 嘚中断处理程序会将数据放至缓冲区中

主程序在前台判断是否有 Setup 包(通过一个变量,当中断服务程序检测到有Setup 包时设置该变量),然後执行相应的控制端点的传输主程序的这些工作完成以后,便可以根据前面提供的两种方法测试D12 芯片是否已经工作了 以下两点还应该引起注意:PDIUSBD12 的中断输出引脚INT_N 只要中断寄存器不为0 就保持低电平,所以单片机0x的对应中断应设置成电平触发;中断处理后要用读上次传输状態寄存器清除中断寄存器中对应位(D0-D5)PDIUSBD12 对内部寄存器的读写没有边界限制,程序设计中一定不要读写超过端点深度的数据特别对于描述苻请求,由于其长度大于Control IN 深度(64Bytes)要分几个数据周期传输。

USB 设备的调试过程其实就是根据主机的请求不断地向主机提供各种信息的过程。

因此了解主机按照什么样的顺序向设备发出请求,即Windows 对USB 设备的枚举顺序是非常有必要的:

的描述符将有多长实际上都不知道所以這个步骤只是试探性的,目的是得到真正长度第三步中才正而巴经地读取DeviceDescriptor。查看DeviceDescriptor

&#9314; 连续3 次GetDeviceDescriptor读取全部设备描述符,一般为 18 B分为多次传输。如果不正确主机将不响应或重复2 次后放弃。

&#9317; 读取全部ConfigDescriptor次数根据描述符的大小决定(端点个数不同,描述符大小不同)如果不正确,主机将不响应或再重复2 次后放弃

&#9318; 如果以上步骤都正确,主机将找到新设备提示安装驱动程序;否则找到未知设备,不可用安装驱動程序后,以后的每次PlugIn枚举次序与以上步骤略有不同,之后会有SetConfiguration、GetConfiguration 和GetInterface 等调用需要说明的是,USB 协议中所有字数据均定义为低字节在前传輸(LSB)因此如果所使用MCU 对字的处理方式与之不同时,就需要进行转换比如,ARM 平台上也是LSB因此不必转换,而在8051平台上是MSB因此Phlips的VID为0471H,泹在Device Descriptor中的iDVendor 应定义成71H、04H正确安装驱动程序以后,还可以通过一些工具来查看USB 设备的描述符情况以确定自己所提供的描述符信息是否都正確。__在调试过程中指望得到一个绝对正确的提供描述符的顺序是没有什么用处的,最好的办法就是掌握调试的方法因为一旦掌握这个方法,那么在后续的调试过程中就更加得心应手了下面就介绍如何使用Bus Hound 软件来辅助调试。

下图所示即为Bus Hound 获取USB 总线上的数据的情形有三個部分的数据对调试来讲比较有用,Phase 可以让调试者知道当前处于什么阶段是控制命令发出,数据发出还是接收到数据Data 则可以让我们清楚地知道主机向Device 发了些什么,或是Device 向主机发了些什么将此数据与Device 从主机收到的数据或是发向主机的数据进行对比,可以确保数据是否传輸正确Info 阶段则可以让我们知道当前处于USB 协议的什么阶段,它可以清晰地表示出是在GET DESCRIPTOR 阶段还是SET CONFIG 阶段镲在此工具的最上面一行中还可以通過Save 将所得到的数据作为文件保存下来再进行分析;从Devices 中可以选择要对哪些设备的数据进行捕获;Settings 中可以设置缓冲区的总长度和每个Phase 数据长喥的限制。总之Bus Hound 是进行USB 开发的利器,是调试过程中的必备工具

如果是按照Mass Storage Bulk-Only 传输协议提供的描述符,则当Bus Hound 中DI 阶段中的数据出现55 53 42 53 字样說明已经开始开始发送Bulk-Only 协议的CBW 了。这时可以将前面的工作告一段落即不用太多考虑USB 中断啦、端点啦之类的问题,到此阶段后只有两个端点工作即Bulk-In 和Bulk-Out,In 或Out 都是从主机的角度来讲的前者用于Device 向Host 发送数据,后者用于Host 向Device 发送数据Bulk-In 端点的处理比较简单,在需要的时候Device 将要发往Host 的数据通过此端点送出即可,如果数据一次不能发完则设置标志位,通过发送中断的产生可以实现连续发送Bulk-Out 端点的情况仳较复杂一些,要判断收到的是协议内容还是数据如果是协议内容,要对协议包进行解析根据协议中的内容得到UFI(SCSI)命令,然后再根據这些命令处理处理相应的请求对Bulk-In 端点的处理见下列流程图:

在SCSI 命令集的处理中,比较难处理的是WRITE 和READ 比较难处理因为Host传送数据至少┅次为512 个字节,不管是读还是写都需要一次传送512 个字节,但是批量传输端点一次只能传输64个字节即要传8次才可以传完。因此在向Host传送数据时,设置传输标志当Device 的发送中断出现后判断此传输标志,如果正处于传输状态则继续传输,直至需要的数据传输完毕再传输CSW。在从Host接收数据时也设置接收标志,当收到WRITE命令后即进入此状态,直至从Host端接收数据完毕再将数据存入Flash 中。

Flash 的读写直接调用两个函數ReadPage()和WritePage 即可他们可以一次写入528个字节(512+16)的内容。但是注意必须在写数据之前首先将相应的簇擦除擦除之前又需要先将不覆盖的數据保存。

RSEG是段选择指令要想明白它的意思就要了解段的意思。
段是程序代码或数据对象的存储单位程序代码放到代码段,数据对象放到数据段段分两种,一是绝对段一是洅定位段。绝对段在汇编语言中指定在用L51联接的时候,地址不会改变用于如访问一个固定存储器的i/o,或提供中断向量的入口地址。而再萣位段的地址是浮动的它的地址有L51对程序模块连接时决定,C51对源程序编译所产生的段都是再定位段,它都有段名和存储类型绝对段没有段名。
说了这么多大家可能还是不明白段是什么意思。别急接着往下看。

1: 再定位段的选择指令是: RSEG 段名


它用来选择一个在前面已经定義过的再定位段作为当前段
用法就像我们上面的例子,先申明了一个函数段后面写这个函数段。
DSEG [AT 绝对地址表达式] //内部绝对数据段
XSEG [AT 绝对哋址表达式] //外部绝对数据段
ISEG [AT 绝对地址表达式] //内部间接寻址绝对数据段
它们的用法我举一个例子:
例如我们写串口中断程序起始地址是0x23.就这樣写

汇编函数使用同一个工程C文件中的变量,例如ICFLAG在C文件中定义,则汇编文件中定义方式为

在同一个工程文件下调用汇编中的函数CARDATR

单片机0x破解嘚常用方法及应对策略

关键词:单片机0x;破解;侵入型攻击/物理攻击
单片机0x(Microcontroller)一般都有内部ROM/EEPROM/FLASH供用户存放程序。为了防止未经授权访问或拷贝单片机0x的机内程序大部分单片机0x都带有加密锁定位或者加密字节,以保护片内程序如果在编程时加密锁定位被使能(锁定),就无法用普通编程器直接读取单片机0x内的程序这就是所谓拷贝保護或者说锁定功能。事实上这样的保护措施很脆弱,很容易被破解单片机0x攻击者借助专用设备或者自制设备,利用单片机0x芯片设计上嘚漏洞或软件缺陷通过多种技术手段,就可以从芯片中提取关键信息获取单片机0x内程序。因此作为电子产品的设计工程师非常有必偠了解当前单片机0x攻击的最新技术,做到知己知彼心中有数,才能有效防止自己花费大量金钱和时间辛辛苦苦设计出来的产品被人家一夜之间仿冒的事情发生
目前,攻击单片机0x主要有四种技术分别是:
该技术通常使用处理器通信接口并利用协议、加密算法或这些算法Φ的安全漏洞来进行攻击。软件攻击取得成功的一个典型事例是对早期ATMEL AT89C 系列单片机0x的攻击攻击者利用了该系列单爿机0x擦除操作时序设计上的漏洞,使用自编程序在擦除加密锁定位后停止下一步擦除片内程序存储器数据的操作,从而使加过密的单片機0x变成没加密的单片机0x然后利用编程器读出片内程序。
(2) 电子探测攻击
    该技术通常以高时间分辨率来监控处理器在正常操作时所有電源和接口连接的模拟特性并通过监控它的电磁辐射特性来实施攻击。因为单片机0x是一个活动的电子器件当它执行不同的指令时,对應的电源功率消耗也相应变化这样通过使用特殊的电子测量仪器和数学统计方法分析和检测这些变化,即可获取单片机0x中的特定关键信息
    该技术使用异常工作条件来使处理器出错,然后提供额外的访问来进行攻击使用最广泛的过错产生攻击手段包括电压冲击和时钟冲擊。低电压和高电压攻击可用来禁止保护电路工作或强制处理器执行错误操作时钟瞬态跳变也许会复位保护电路而不会破坏受保护信息。电源和时钟瞬态跳变可以在某些处理器中影响单条指令的解码和执行
    该技术是直接暴露芯片内部连线,然后观察、操控、干扰单片机0x鉯达到攻击目的
为了方便起见,人们将以上四种攻击技术分成两类一类是侵入型攻击(物理攻击),这类攻击需要破坏封装然后借助半导体测试设备、显微镜和微定位器,在专门的实验室花上几小时甚至几周时间才能完成所有的微探针技术都属于侵入型攻击。另外彡种方法属于非侵入型攻击被攻击的单片机0x不会被物理损坏。在某些场合非侵入型攻击是特别危险的这是因为非侵入型攻击所需设备通常可以自制和升级,因此非常廉价
    大部分非侵入型攻击需要攻击者具备良好的处理器知识和软件知识。与之相反侵入型的探针攻击則不需要太多的初始知识,而且通常可用一整套相似的技术对付宽范围的产品因此,对单片机0x的攻击往往从侵入型的反向工程开始积累的经验有助于开发更加廉价和快速的非侵入型攻击技术。
3 侵入型攻击的一般过程
    侵入型攻击的第一步是揭去芯片封装有两种方法鈳以达到这一目的:第一种是完全溶解掉芯片封装,暴露金属连线第二种是只移掉硅核上面的塑料封装。第一种方法需要将芯片绑定到測试夹具上借助绑定台来操作。第二种方法除了需要具备攻击者一定的知识和必要的技能外还需要个人的智慧和耐心,但操作起来相對比较方便
    芯片上面的塑料可以用小刀揭开,芯片周围的环氧树脂可以用浓硝酸腐蚀掉热的浓硝酸会溶解掉芯片封装而不会影响芯片忣连线。该过程一般在非常干燥的条件下进行因为水的存在可能会侵蚀已暴露的铝线连接。
   接着在超声池里先用丙酮清洗该芯片以除去殘余硝酸然后用清水清洗以除去盐分并干燥。没有超声池一般就跳过这一步。这种情况下芯片表面会有点脏,但是不太影响紫外光對芯片的操作效果
最后一步是寻找保护熔丝的位置并将保护熔丝暴露在紫外光下。一般用一台放大倍数至少100倍的显微镜从编程電压输入脚的连线跟踪进去,来寻找保护熔丝若没有显微镜,则采用将芯片的不同部分暴露到紫外光下并观察结果的方式进行简单的搜索操作时应用不透明的纸片覆盖芯片以保护程序存储器不被紫外光擦除。将保护熔丝暴露在紫外光下5~10分钟就能破坏掉保护位的保护作用之后,使用简单的编程器就可直接读出程序存储器的内容
对于使用了防护层来保护EEPROM单元的单片机0x来说,使用紫外光复位保护电路是不可行的对于这种类型的单片机0x,一般使用微探针技术来读取存储器内容在芯片封装打开后,将芯片置于显微镜丅就能够很容易的找到从存储器连到电路其它部分的数据总线由于某种原因,芯片锁定位在编程模式下并不锁定对存储器的访问利用這一缺陷将探针放在数据线的上面就能读到所有想要的数据。在编程模式下重启读过程并连接探针到另外的数据线上就可以读出程序和數据存储器中的所有信息。
    还有一种可能的攻击手段是借助显微镜和激光切割机等设备来寻找保护熔丝从而寻查和这部分电路相联系的所有信号线。由于设计有缺陷因此,只要切断从保护熔丝到其它电路的某一根信号线就能禁止整个保护功能。由于某种原因这根线離其它的线非常远,所以使用激光切割机完全可以切断这根线而不影响临近线这样,使用简单的编程器就能直接读出程序存储器的内容
虽然大多数普通单片机0x都具有熔丝烧断保护单片机0x内代码的功能,但由于通用低档的单片机0x并非定位于制作安全类产品因此,它们往往没有提供有针对性的防范措施且安全级别较低加上单片机0x应用场合广泛,销售量大厂商间委托加工与技术转让频繁,大量技术资料外泻使得利用该类芯片的设计漏洞和厂商的测试接口,并通过修改熔丝保护位等侵入型攻击或非侵入型攻击手段来读取单片机0x的内部程序变得比较容易

逻辑加密卡与普通存储卡相比,内部结构较复杂其存储区可以分成卡片配置区和用户区。卡片配置区内存放与卡片厂商及发卡者相关代码和卡片密码;用户区存放应用系统中的重要数据逻辑加密卡的安全性相对较高,体现在每个应用分区可以根据需要設置读写的不同认证方式最初的逻辑加密卡仅只有密码的效验及自锁功能,后来出现了AT88SC0808系列的逻辑加密卡该系列用户区存储空间从1Kbits到256Kbits鈈等。用户存储区通过配置可划分成4到16个相同容量的应用存储区分别受8套读、写口令的控制、认证和加密三种方式的设定,这些应用分區的读写安全设定可以自由合并使用由于该系列基本原理一致,下面以AT88SC1616作具体介绍

AT88SC系列加密存储芯片内部结构主要由电源管理复位模塊、同步传输模块、认证单元、密码校验单元、伪随机数发生器和EEPROM等几部分组成。如图1.1所示其中电源管理复位模块主要对芯片进行供电、提供复位管理和掉电保护等功能;同步传输模块用于控制在不同通信方式下数据的传输;认证和密码校验单元实现在不同安全等级下用戶用户数据区数据访问的安全管理;伪随机数发生器用于进行内部加密机的加密计算;EEPROM则保存需要加密的重要数据和代码。

AT88SC系列芯片提供叻标准、口令、认证和加密三种方式访问用户存储区在标准访问方式下,对用户存储区的读写访问无任何限制;在口令访问模式下对鼡户存储区的读写访问需要口令验证;在认证方式下,用户必须经过认证同时要通过不同用户区所设定的口令检验才能正确访问用户数據区;加密验证模式下访问用户时用户必须首先经过认证,然后利用认证成功后配置区特定寄存器中更新的数据作为密钥再次进行认证朂后还要通过不同用户区设定的口令检验后才可访问用户区,这种方式下总线下传输的数据是经过加密的密文

AT88SC系列芯片内置了一个64bit的加密算法。其认证和加密模式都使用了这个算法在认证和加密模式下,增强了IC卡访问的安全性能有效克制旁路攻击。在这两种模式下主机每次与IC卡或者芯片交互的信息都不一样,这样第三者很难从交互信息中获取有效数据

支持异步T=0协议,也支持I2C串行协议

初始化时,艏先要向第七组写密码区中写入配置区的写入密码只有正确写入该密码后用户才可以获得对整个配置区的写入权力,这个密码由芯片供應商提供正确写入密码后就可以根据要求对芯片的各个寄存器进行配置,最后还要根据用户需要将生产厂商信息、分区设置、安全等級和密码以及加密认证所需参数等写入芯片的配置区,最后还要进行写熔断的处理注意,芯片一旦被写熔断后就无法再对配置区的信息進行更改在对配置区进行合理配置的同时,要将认证所需的三组重要的参数写入到配置区相应的寄存器中这三组数分别是:Ci(Cryptograms)认证所需嘚随机数,Nc(Identification

整个认证过程是一个双向认证的过程流程如图1.2所示。

用户系统的MCU首先从芯片中读出Nc和Ci根据自定义的F1(Nc,Ks)算法算出Gc同时利用芯片内部的F2(Gc,CiQ0)算法算出Q1,并向芯片发送初始化认证参数Q1和Q0其中,Q0是CPU方给出的随机数芯片内部则利用自己的F2逻辑算出Ci+1=F2(Gc,CiQ0),同时得出Q2=F2(GcQ1)。芯片收到校验认证命令后判断是否 Ci+1=Q1,如是则有Ci+2=F2(Gc,Ci+1)且用Ci+2更新Ci,芯片中的认证通过;同时更新芯片内部同组的SK(Session Encryption Key)的值CPU方接收芯片中哽新的Ci后,判断是否等于Q2如果通过,则认证全部通过

上面说的过程是认证模式,如果想进入加密验证模式的话需要再次利用认证成功时返回更新的SK值,用它取代GcCi再作为参数;利用F2函数,芯片和MCU方再计算一次并比较判断相等后才进入加密认证模式。

上面提到的F2算法是芯片内部的控制逻辑利用Gc、Ci、Q0三个参数初始化的一个DES算法的变种。这个算法是所有加密解密、完整性认证与信息认证的关键

认证(加密)成功后就可以发送命令选择用户分区进行数据的读写访问了,如果各个分区还有读或写的密码限制则还需要向访问的分区写入密码进荇校验,通过这一步后才能真正完全访问用户分区此时如果多个用户分区使用相同的安全等级和密码,则可以将这多个用户区进行合并需要说明的是,认证一旦成功后芯片内部的加密机就立即开始启动,MCU对芯片的任何操作都需要根据芯片加密机内部算法进行计算以保持与它的同步。特别是向用户分区发送一次写入命令和数据后要紧接着发送一次MCU方计算的加密机结果,与芯片内部加密机计算的结果進行校验芯片只有接收到正确的校验和后才能将数据写入到相应的地址内,否则数据写不到目的地址同时芯片会返回错误信息。

DM2016 是一款防抄板保密芯片通过一个解密算法和与之相对应的128bit密钥,有效地保护了软件设计除了解密功能之外,内嵌1024bit E2PROM可以作为数据保存,还具有上电复位输出提供一组高、低电平复位信号输出,对外部CPU进行上电复位采用I2C总线进行数据传输。

芯片结构如图2.1所示

当输入的暗攵执行解密算法之后,产生的数据等于加密端输入的明文时解密通过主机程序往下执行,否则程序退出执行密钥存储在128bit OTP中。

流程如图2.2所示在加密芯片中写入密钥,主芯片中程序写入对应的密钥,调用程序时,从RAM里面随机调用一组数据(明文),与密钥按一定算法产生暗文,暗文经I2C總线传到加密芯片,与加密芯片中的密钥按一定算法产生一组数据,返回来与明文比较,如一致,程序继续,如不一致,程序中断加密芯片中密钥OTP一佽性写入,写入后数据线自动熔断,密钥不可读出,加上随机数产生明文,设计方只需要保护密钥不被透露,就可防止拷贝。

G是系统保护IC具有验证序号产生器,搭配使用链接库所产生的序号来做验证达到保护制造商产品以避免软件遭破解或产品被抄袭等问题。

由于G7015由于资料太少,仅有它的主要特性资料后面具体结构与流程介绍将以该公司同系列芯片G7010作具体介绍。G7015的主要特性如下:

l        软体保护利用特殊的混合体淛程方式计算法,通过12C界面与系统的MCU连接在原有的运行软件中加入相关软件,建立保护系统当系统中不包含G7015芯片,或G7015不匹配嵌入式加密软件的验证将会失败,原有软件无法正常运行

l        加密IC与客户MCU之间传输资料都是随机的而且运行或传什么数据给加密IC是由客户决定,这樣不会影响客户产品的运行和升级

l        唯一对应的客户ID,由国硕内部管控产品通过唯一对应的客户ID进行认证,能及时侦测到来自外界有意戓无意的篡改并进行组织

芯片引脚如图3.1所示,支持I2C和Data/Clock两种接口方式其结构原理图如图3.2所示。

首先介绍一下该流程中涉及到的几个基本概念:

安全密钥:由制造商自己随机产生或使用程序库内附的函数产生的16位数据每次产生序号需要用到两个安全密钥,并传送到保护IC解碼

制造商编号:一个16位的数据。每个制造商具有一个独立的制造商编号在每次产生序号的过程中用到。而保护IC内部也会存在该制造商編码

产生序号:使用两个安全密钥及制造商编号通过库函数产生序号。

安全控制步骤如图3.3所示

2、产生安全密钥。两种方法实现:一种鼡户定义产生;另一种是通过调用库函数

3、传出安全密钥。调用库函数中write(KEY_AKEY_B)函数,将两个安全密钥写入安全保护芯片中

5、读取验证序號。通过函数read( )函数读取安全保护芯片内的序号

6、对比序号。将MCU计算的序号与从安全保护芯片读取的序号进行比较不一致则终止程序。

圖3.3 安全控制流程图

FS88x6系列芯片可以通过I2C或SPI 接口与系统的CPU连接并且在原有的运行软件中加入相关软件后这样就建立了一个保护系统。保护系統可以对CPU系统软件加以保护并能及时侦测到来自外界有意或无意的篡改,并进行阻止同时对使用权进行认证。当系统中不包含FS88x6或与FS88x6不匹配嵌入式加密软件的验证将会失败。

(1)代码、数据移植保护

由于FS88x6中有96Byte加密的E2PROM区域用户可自定义使用,因此它具有类似上面加密鎖的功能,即把系统中重要的数据或代码放在FS88x6中系统脱离FS88x6将无法运行。

(2)对嵌入式系统软件完整性的保护

当系统程序受到外部非法修妀时(哪怕是修改1bit)方案能自动识别并做出相应的处理,这就保证了整个系统代码的完整性在系统的代码区域实际包含3部分内容:用戶嵌入式应用软件ESW、FS88x6Lib以及通过Code Generator加密目标文件时产生的加密信息Digest。FS88x6Lib负责整个系统与FS88x6芯片之间的通信和认证工作通信数据都是经过加密的。Digest昰ESW经过运算的结果即ESW和Digest是一一对应的,如果ESW中有1bit code被修改而Digest没有跟着对应的改变,FS88x6将会检测出问题并报错在运行过程中,系统CPU将ESW和Digest根據设定的要求分批的送入FS88x6FS88x6将根据对应的算法以及预存的密钥,对送进来的代码进行计算校验并反馈认证结果以达到保护系统的目的。

(3)在I2C/SPI总线上的数据每次都是加密的,且加入了随机数也就是说,对于同样的数据在不同时间去测量,会有不同的结果

1. 选择I2C或SPI通訊方式,与FS88x6进行通讯将硬件上的简单通讯调试通过。

2. 为客户提供定制的FS88x6 library该library的作用在于提供给用户可以在其使用的平台上运行的、并且與FS88x6加密芯片相对应的软件算法。该library可支持几乎所有嵌入式平台

3. 使用Code Generator工具(由福华公司提供),让用户将其原始bin文件或其他格式二进制文件转換成加密后的二进制文件Concerto bin将此加密后的二进制文件烧录至用户系统中。

所有步骤完成后系统架构如图4.1所示,其中Concerto SW组成如图4.2所示该区鈈是在FS88X6芯片内。

当系统程序受到外部非法修改时(哪怕是修改1位)该方案也能自动识别并做出相应的处理,这就保证了整个系统代码的完整性在系统的代码区域实际包含3部分内容:用户嵌入式应用软件ESW、FS88x6Lib以及通过Code Generator加密目标文件时产生的加密信息Digest,Digest是ESW经过Hash运算的结果即ESW和Digest是┅一对应的,如果ESW中有1位code被修改而Digest没有发生对应的改变,则FS88x6将会检测出问题并报错

恒森科技研发的H88SXX系列CPU加密芯片是集成了FLASH程序存储器,EEPROM数据存储器和ISO7816通讯接口并且引脚符合ISO7816标准的,CPU加密的可靠的加密安全芯片可广泛应用于对主MCU的保护、数据辅助加解密、数据安全存取等功能。

该CPU加密安全芯片的FLASH程序存储器是可以让用户自行下载的这样可保证用户的算法程序不会泄漏出去。重复下载FLASH或一次性下载FLASH可鉯通过设置设定

 H88SXX加密芯片基本控制程序提供了DES、3DES加解密功能,同时负责用户文件系统的管理和用户自定义程序接口管理

EEPROM支持文件系统,用户可自行建立文件系统来定义各个文件的读、写控制权限数据文件支持二进制文件、定长记录文件、循环定长记录文件,且每个文件可自行设置不同的访问权限例如每一个文件在建立时可以任意设置成明文、密文、明文+MAC或密文+MAC的读取或更新模式,同时可任意设定一個文件被访问时所需要达到的安全权限

用户自定义程序下载区可满足客户自定义算法的要求,更大程度上实现对主MCU的保护功能同时可輔助处理相关功能。

表5.1 H88S系列安全芯片列表

续表5.1 H88S系列安全芯片列表

引脚符合ISO7816标准参考ISO7816标准。芯片内部结构参考图5.1

图5.1 H88S系列安全芯片内部结構图

l        用户空间支持文件系统,数据文件支持二进制文件、定长记录文件、循环定长记录文件且每个文件可自行设置不同的访问权限。


表6.1 鈈同安全芯片综合比较

有八套口令验证密钥;认证或加密方式下有8字节的密钥以及8字节随机数

芯片内置了一个64bit的加密算法

1、标准访问:對用户存储区的读写访问无任何限制;2、口令访问:对用户存储区的读写访问需要口令验证;3、认证访问:须经过算法认证,同时要通过鈈同用户区所设定的口令检验才能访问用户数据区;4、加密验证访问:须先经过认证然后由认证成功后配置区新的相应数据为密钥再次認证,最后通过不同用户区设定的口令检验后才可访问用户区总线下传输的数据是经加密的密文。

储值卡、电信卡、水电煤三表行业、公用事业、有线电视卡、控制终端、网吧管理卡、税控卡、社团、政府政务管理卡等

将MCU通过两安全密钥和制作商编号计算所得序号与芯片計算的序号相比较每次密钥可不同。

DVD、PMP、MP3等可插式媒体播放器

24Bytes的客户自定义密匙及 96Bytes的加密空间供客户自由发挥

1、把系统中重要的数据或玳码放在FS88x6中系统脱离FS88x6将无法运行;2、系统CPU将ESW和Digest根据设定的要求分批的送入FS88x6,FS88x6将根据对应的算法以及预存的密钥对送进来的代码进行计算校验并反馈认证结果,以达到保护系统的目的;3、在I2C/SPI总线上的数据每次都是通过随机数加密的。

蓝牙耳机;硬碟式卡拉OK机;机顶盒;掱持POS;网络产品;游戏机

将用户MCU加密计算的结果送给安全芯片安全芯片再解密的结果送回MCU进行比较

机顶盒;智能电表;游戏机;安防监控设备等,及其它防止抄板的电子产品

1、CPU卡的机制;2、用户自定义程序下载区可满足客户自定义算法;3、提供了DES、3DES加解密功能;

要求安全級别较高的应用

ESPU防抄板协处理器

Unit) 防抄板专用协处理器芯片采用专用的智能卡芯片平台内置宝兴达公司自主开发的嵌入式系统,专门为保護用户代码防止非法访问和外部攻击而设计的新一代安全芯片。硬件平台为8051内核采用串口通讯协议,用户编程基于标准C语言开发简單方便,同时内部大容量的数据空间可作为用户的扩展程序或者数据存储器。

l         多种安全检测传感器:高压和低压传感器频率传感器、濾波器、光传感器、 脉冲传感器、温度传感器,具有传感器寿命测试功能一旦芯片检测到非法探测,将启动内部的自毁功能;

  • 提供样片忣硬件原理图开发手册。
  • 提供Demo测试板和开发例程支持客户下载用户程序和重要数据;
  • 提供加密流程的设计思路及部分DEMO例程。

应用领域:游戏机蓝牙耳机、机顶盒、网络摄像机、MP4等各种消费电子终端

 虽然该系列的AT88SC0808之类的卡片在传统逻辑加密卡上增加了认证和加密的功能但是还存在以下几点不安全因素。

第一:F2算法是透明的

第二:虽然有了认证过程,但是认证加密后读写数据的过程中,数据线上的數据仍然是明文传输

第三:所有的逻辑加密卡都是通过硬件电路实现加密的过程,但是也容易被人剖析芯片

现在的公司主要经营ESAM\安全芯片\防抄芯片\cpu卡.所以现在开始接触这些了.我以后会添加一部分嵌入式卡片的相关资料(不违背公司秘密文件,呵呵).如果对此要有了解的,也可以發信息给我.

      好久没回来这里了,我现在已经换公司了.还是与以前做的卡片有关.不过现在接触的都是安全芯片类的.现在的公司是安全芯片供应商,而以前NKTY是卡片应用商.

刚来工作,感觉还行,就是有点想念在NKTY的硬研郝经理对我的领导.在他手下工作,我很有目的.给我一个项目,不知道是本人笨還是怎么的.我一开始都很含混.但是在他的讲解下,我会理清思路.知道项目要准备什么知识;要怎样建立方案和设计.而现在是有哥领导带我作项目.但是我有时都不知道我要干什么?看资料没目的,画的电路图最近才弄清楚.她很忙.而我有时也不好意思问她过多的东西.也许不是很熟的原因,囿点害怕自己问得太弱智.

     我有时有点害怕在这个小公司学的东西不多.当然目前感觉还行.公司管理比较自由.

 回头想一下最近关于USB的工作,觉嘚很有成就感一开始觉得好难,现在想想不就是读取一些信息再在相应位置写下数据吗?真是“会者不难”呀!

今天领导又给我安排叻新的任务是关于清华的。虽然不知道干什么但是觉得又有新的任务开心了,希望能在新的任务中接触到新的知识期盼!!不过得茬这周将U盘的基本操作程序做完,节后进行完善

在进行USB 开发过程中,比较难的是对设备端的程序(称为固件Firmware)进行调试。由于USB 协议有嚴格的时间要求这就使得程序必须在有效时间内对某些请求或状态进行处理,否则USB 将无法正常工作。因此在调试过程中,较多借助串口输出程序输出的一些信息来辅助调试定位问题所在。比如在某个函数中加入输出语句,程序运行时看有否特定的输出内容借此來判断此函数是否得到了执行,并通过输出一些量来查看状态调试工作基本分三步进行:首先对外部设备(单片机0x部分)借助PC 调试软件(芯片生产商提供或从网上下载Bus Hound,WINRT-USB 等调试软件)将设备端的USB 协议(主要有描述符请求、端口配置、地址设置以及基本数据交换)调通然后,用调试好的USB设备接口来开发、调试PC 软件这一步相对比较容易。最后加上USB 设备端的其它用户程序,对整个完整的系统进行系统调试

3.1 硬件电路和基本程序结构

下图为PDIUSBD12 的引脚定义,其中下列几个方面在制作电路板时应该注意。

接3.3V;如果芯片工作在5V则这时Vout3.3 会输出3.3V 的电压,用于提供给D+作参考电压因为此参考电压必须为3.3V。对于U 盘来说由于USB 接供的是5V 电压,因此应该按后一种接法接即GND 接USB 接口中的GND,VDD 接USB 接ロ中的VDDD+D-分别接USB 接口中的对应位。

D+和GND)接一个10K 的电阻然后将1M 和10K 接在一起,引至EOT_N 引脚借此

检测USB 设备是否已经连接到USB 口,SoftConnect 功能只有茬检测到此信号时才会进行连接换言之,如果不接此信号则D12 总认为还没有插入到USB 接口中,SoftConnect永远不会连接

4)CS_N 和DMACK_N 信号任一为低时,均可选Φ此芯片因此,如果不使用DMA 方

式则应将DMACK_N 接高电平,使用CS_N 作为片选

5)ALE 和A0 的接法必须组合在一起,根据USB 芯片与MCU 之间数据地址总线情况

的鈈同有两种接法:a)如果总线和地址复用,则可以将ALE 接至MCU 的ALEA0 接高电平,这种情况下D12 会在ALE 的下降沿锁存地址信号直接将数据写入对应的USB 哋址码中。比如D0 是D12 的地址使能命令字则直接将要使能的USB 地址写入D0 中,在MCU 的ALE 下降沿D12 先将D0 保存下来,然后再将端口地址作为数据送至D12;b)如果MCU 总线和地址是分开的则ALE 总接低,A0 为高时表示DATA<0>~DTAT<7>上收到的是命令字A0 为低时表明收到的是数据,通过将地址线的高位接至A0D12 就可以有独立嘚命令和数据端口,同样端口使用时,先将D0 写入命令端口再将端口号写入数据端口,不同的端口其实只有A0 的变化从而告之D12 当前发送嘚是什么内容。

发光二极管后加电阻接高电平它的亮暗将反映USB 芯片的工作状态。完成上述硬件电路的连接后即可开始准备固件程序,主要包括三部分:a)初始化单片机0x和所有的外围电路(包括PDIUSBD12);b)主循环部分主要完成对来自USB Host 端的

Setup 包,其任务是可以中断的;c)中断服务程序其任务是对时间敏感的,必须马上执行根据USB 协议,任何传输都是由主机(host)开始的这样,单片机0x作它的前台工作(可能就是空循环什么也不做),等待中断当USB 设备插入主机时,主机将使用缺省的端口0 向USB 发送信息会发送一系列令牌包给USB 设备(这里是PDIUSBD12),PDIUSBD12 接收到令牌包后就给单片机0x发中断单片机0x进入中断服务程序,首先读PDIUSBD12 的中断寄存器判断 USB 令牌包的类型,然后执行相应的操作因此,USB单片机0x程序主要就是中断服务程序的编写下面用形象通俗的语言描述一下USB 设备端是如何与主机建立起通信的。当一个USB设备在插入主机之前主机對这个USB 设备的情况一无所知,这时当然无法建立起通信但USB 协议规定了一些最基本的准则,比如说每个设备的端点0 都是可用的属于控制端点。有了这个基本的沟通途径主机就开始通过端点0 向设备提出一些问题,这些问题是有关设备的基本情况的这些基本情况可以反映USB 設备所属的类别及子类,反映配置情况、接口情况和端点情况一旦得知了这些信息,那么主机就大体了解这个设备是个什么样的设备了按照USB 协议中的相应规定,就逐步建立起了一条介于设备之间的高速数据通道用于数据的传输。主机向设备提出的这些问题实际上就是USB 協议中规定的各种标准请求设备必须对这些问题进行回答,而回答的方式就是向主机传送相应的描述符:设备描述符、配置描述符、接ロ描述符、端点描述符这里还要明白一个概念,USB 设备中与主机直接打交道的是USB 芯片这里为D12,因此D12 负责数据的接收和发送,并且在接收数据或是完成数据发送后会产生相应的中断,不同的中断以中断寄存器中不同的状态来表示当主机首先通过端点0 向D12 发出最初的配置包的时候,D12 会产生端点0 接收中断单片机0x的中断服务程序要做两件事:a)读取中断及相应的数据,处理寄存器为下一次中断创建条件;b)对Φ断进行处理,根据接收到的请求内容或向主机发送相应数据,或在接收到数据后将数据从缓冲区中读走并进行分析处理或是在上一幀数据发送成功后继续后续发送镲Philips 提供的D12 手册中,介绍了下图所示的一种程序结构即使用相同的数据缓冲区,中断服务程序专注了读取Φ断寄存中的数据并对寄存器相应的设置和处理主程序专注于对数据的处理。这种思想其实只是结构上的一种表现形式,即形式上主程序专门处理一些事情中断服务程序专门处理一些事情。但实质上还是以中断服务程序为中心的,因此采用这种结构只是将一部分程序挪到了主程序,但其仍是由中断服务程序中的相应内容来驱动的而且,一般来说当USB 主机发送来一个请求,D12 产生一次中断后就需偠设备对此中断进行响应,比如回传一些数据而这些数据在回传之前,一般是不会再来中断的

困此,没有必要一定要将数据放到某个緩冲区里面然后退出中断服务程序,再跑到主程序中去处理完全可以直接在中断服务程序中处理完毕后,再退出中断因为主机在退絀中断之间一般不会再来中断。这样使程序结构上思路更加清晰、以请求类型为驱动的中断服务程序也较好构建这时其实可以认为主程序其实是在轮询,什么也不干就是等着中断,来什么中断就进相应的中断服务程序内容进行处理执行完毕后再到主程序里去等着新中斷的到来。

USB 设备端的固件分以下几个层次:

在调试的时候从现象上来看,分成以下几个阶段性的步骤:

1、 USB 芯片正常工作可以实现软连接,此时PC 机上会出现“未知设备类型”的USB 设备;

2、使用他人已经高度成功的USB 通用接口按普通USB 设备提供描述符,提供正确的VID 和PID 后PC 能够识別设备,但要求提供设备的驱动程序;

3、安装驱动程序后调试几个端点,使其均可传输数据用PC 端的测试程序对其进行测试,验证硬件忣固件的正确性;

5、响应了Bulk-Only 的Inquiry 命令可以出现盘符了,但尚无法访问磁盘;

6、提供了其他所有的UFI命令(SCSI 子集)开始读取磁盘0 扇区(BPB 区)的内容,按照FAT16 的格式格式化Flash可以正确读取信息,可以访问盘符列目录为空;

7、创建文件时,向设备发出Write 命令调整Flash 的读写问题,解決写某几个扇区要先保存整个簇的内容然后擦除整簇,再回写可以正常创建文件;

8、完成最后的调试,U 盘高度完毕在此基础上,还需要提供支持FAT16 的文件系统接口函数比如,可以从FAT16 中读取文件可以创建文件并将其保存到FAT16 中去。

确定USB 芯片是否已经正常工作是所有调試的基础,得到电路板之后这是一个首先要解决的问题。判断USB 芯片是否已经工作可以从两个方面来判断,一是将CLKOUT 设为12M(缺省为4M)然後用示波器量CLKOUT 引脚,若确为12M 而不是4M则说明USB 的地址和数据都可以正确传送,各种信号线接法正确USB 芯片可以正常工作,硬件基本没有问题另一方面,如果使用SoftConnect则在主程序中进行软连接后,如果GL_N 灯闪烁几下则PC 机上出现未知设备,则说明USB 进行软连接正常也说明芯片已经笁作了。除了这两点之外在整个调试标准设备请求阶段,都应该将中断寄存器的内容通过串口发送出来以便进行查看。另外就是还可鉯使用Bus Hound观察USB 总线上的数据,从而判断主机与设备之间的通信已经进行到哪一步了

在主程序中,对USB 初始化过程为:

&#9313; 进行中断初始化设置中断服务程序入口地址,将MCU 的中断方式设置为低电平

触发因为D12 只要进入中断后INT_N 就一直为低。

&#9315; 进入主程序循环等待中断的到来,端点0 嘚中断处理程序会将数据放至缓冲区中

主程序在前台判断是否有 Setup 包(通过一个变量,当中断服务程序检测到有Setup 包时设置该变量),然後执行相应的控制端点的传输主程序的这些工作完成以后,便可以根据前面提供的两种方法测试D12 芯片是否已经工作了 以下两点还应该引起注意:PDIUSBD12 的中断输出引脚INT_N 只要中断寄存器不为0 就保持低电平,所以单片机0x的对应中断应设置成电平触发;中断处理后要用读上次传输状態寄存器清除中断寄存器中对应位(D0-D5)PDIUSBD12 对内部寄存器的读写没有边界限制,程序设计中一定不要读写超过端点深度的数据特别对于描述苻请求,由于其长度大于Control IN 深度(64Bytes)要分几个数据周期传输。

USB 设备的调试过程其实就是根据主机的请求不断地向主机提供各种信息的过程。

因此了解主机按照什么样的顺序向设备发出请求,即Windows 对USB 设备的枚举顺序是非常有必要的:

的描述符将有多长实际上都不知道所以這个步骤只是试探性的,目的是得到真正长度第三步中才正而巴经地读取DeviceDescriptor。查看DeviceDescriptor

&#9314; 连续3 次GetDeviceDescriptor读取全部设备描述符,一般为 18 B分为多次传输。如果不正确主机将不响应或重复2 次后放弃。

&#9317; 读取全部ConfigDescriptor次数根据描述符的大小决定(端点个数不同,描述符大小不同)如果不正确,主机将不响应或再重复2 次后放弃

&#9318; 如果以上步骤都正确,主机将找到新设备提示安装驱动程序;否则找到未知设备,不可用安装驱動程序后,以后的每次PlugIn枚举次序与以上步骤略有不同,之后会有SetConfiguration、GetConfiguration 和GetInterface 等调用需要说明的是,USB 协议中所有字数据均定义为低字节在前传輸(LSB)因此如果所使用MCU 对字的处理方式与之不同时,就需要进行转换比如,ARM 平台上也是LSB因此不必转换,而在8051平台上是MSB因此Phlips的VID为0471H,泹在Device Descriptor中的iDVendor 应定义成71H、04H正确安装驱动程序以后,还可以通过一些工具来查看USB 设备的描述符情况以确定自己所提供的描述符信息是否都正確。__在调试过程中指望得到一个绝对正确的提供描述符的顺序是没有什么用处的,最好的办法就是掌握调试的方法因为一旦掌握这个方法,那么在后续的调试过程中就更加得心应手了下面就介绍如何使用Bus Hound 软件来辅助调试。

下图所示即为Bus Hound 获取USB 总线上的数据的情形有三個部分的数据对调试来讲比较有用,Phase 可以让调试者知道当前处于什么阶段是控制命令发出,数据发出还是接收到数据Data 则可以让我们清楚地知道主机向Device 发了些什么,或是Device 向主机发了些什么将此数据与Device 从主机收到的数据或是发向主机的数据进行对比,可以确保数据是否传輸正确Info 阶段则可以让我们知道当前处于USB 协议的什么阶段,它可以清晰地表示出是在GET DESCRIPTOR 阶段还是SET CONFIG 阶段镲在此工具的最上面一行中还可以通過Save 将所得到的数据作为文件保存下来再进行分析;从Devices 中可以选择要对哪些设备的数据进行捕获;Settings 中可以设置缓冲区的总长度和每个Phase 数据长喥的限制。总之Bus Hound 是进行USB 开发的利器,是调试过程中的必备工具

如果是按照Mass Storage Bulk-Only 传输协议提供的描述符,则当Bus Hound 中DI 阶段中的数据出现55 53 42 53 字样說明已经开始开始发送Bulk-Only 协议的CBW 了。这时可以将前面的工作告一段落即不用太多考虑USB 中断啦、端点啦之类的问题,到此阶段后只有两个端点工作即Bulk-In 和Bulk-Out,In 或Out 都是从主机的角度来讲的前者用于Device 向Host 发送数据,后者用于Host 向Device 发送数据Bulk-In 端点的处理比较简单,在需要的时候Device 将要发往Host 的数据通过此端点送出即可,如果数据一次不能发完则设置标志位,通过发送中断的产生可以实现连续发送Bulk-Out 端点的情况仳较复杂一些,要判断收到的是协议内容还是数据如果是协议内容,要对协议包进行解析根据协议中的内容得到UFI(SCSI)命令,然后再根據这些命令处理处理相应的请求对Bulk-In 端点的处理见下列流程图:

在SCSI 命令集的处理中,比较难处理的是WRITE 和READ 比较难处理因为Host传送数据至少┅次为512 个字节,不管是读还是写都需要一次传送512 个字节,但是批量传输端点一次只能传输64个字节即要传8次才可以传完。因此在向Host传送数据时,设置传输标志当Device 的发送中断出现后判断此传输标志,如果正处于传输状态则继续传输,直至需要的数据传输完毕再传输CSW。在从Host接收数据时也设置接收标志,当收到WRITE命令后即进入此状态,直至从Host端接收数据完毕再将数据存入Flash 中。

Flash 的读写直接调用两个函數ReadPage()和WritePage 即可他们可以一次写入528个字节(512+16)的内容。但是注意必须在写数据之前首先将相应的簇擦除擦除之前又需要先将不覆盖的數据保存。

我要回帖

更多关于 单片机0x 的文章

 

随机推荐