车UDS诊断协议学习

type
status
date
slug
tags
summary
category
icon
password

车UDS诊断协议学习

概念

统一诊断服务(英语:Unified Diagnostic Services,简称UDS)是车用电子的通信协议,是电子控制器(ECU)中设备诊断用的网络传输协议,对应的标准是ISO 14229-1。
诊断工具可以连接车上所有支持统一诊断服务功能的电子控制器。车上常用的控制器局域网只用到OSI模型的第一层及第二层,而统一诊断服务集成了OSI模型的第五层及第七层。服务标识符(Service ID、SID)及服务相关的参数都放在8个字节的消息框内。
现今的车辆有配合离线诊断的诊断接口,让电脑或是诊断工具(作为测试设备)可以连接到汽车上的通信系统。因此可以发送统一诊断服务的请求到控制器,控制器必须回复(可能是正面或是负面的回复),这样可以确认个别控制单元中的故障存储器、更新控制单元的固件、和硬件进行低端的交互(例如开启或关闭特定的输出)、或是进行特定的机能,目的是了了解电子控制器的环境或是操作条件,以诊断故障或是不希望出现的行为。

术语

Diagnostic Service (诊断服务)
诊断服务是介于诊断设备和ECU之间的一种信息交互方式。通常由诊断设备发出请求,ECU做出回应。
Diagnostic Trouble Code (故障码)
故障码是用来标记ECU故障的代码,它遵循一定的规则,存储在ECU的非易失性存储中。(以后别人提到DTC,不要说不知道是什么了)
Diagnostic Data (诊断数据)
诊断数据是可以被诊断设备请求的ECU内部数据,它包括:
  • 当前数据:ECU正在运行的数据,比如车速、节气门开度,发动机转速等;
  • 存储数据:被ECU存储在存储器中某时刻的数据,比如DTC;
  • 静态数据:恒定不变的ECU内部数据,比如VIN码。
Diagnostic Session (诊断会话)
可以理解为某种诊断模式或权限,即在不同的模式下,对不同的诊断服务的使用做了限制。
Diagnostic Routine (诊断例程)
驻留在被诊断ECU中的子程序,它可以被诊断设备启动和停止。比如格式化EEPROM的子程序。
Addressing Type (寻址方式)
寻址方式指的是诊断消息的传递方式,有两种寻址方式:
  • 物理寻址,即1对1通信,用于知道确切的被诊断ECU的地址;
  • 功能寻址,即1对n通信,或者说广播发送,用于不知道确切的被诊断的ECU的地址,向一组或者全体ECU发送请求;
Response(响应)
tester请求诊断服务执行后,从ECU的返回结果。可以有两种结果:
  • Positive Response,正响应,即诊断请求执行成功;
  • Negative Response,负响应,即诊断请求执行失败;
Service Identifier
Service Identifier,诊断服务标识符,简称为SID,一字节的无符号整数,用来指代某个诊断服务。诊断协议为每个诊断服务都分配唯一SID,因此更方便协议的软件实现。同时,在开发过程中沟通更加方便。比如,ReadDataByIdentifier服务是去按照ID去读诊断数据,直接说22服务会更加便捷。
Data Identifier
简称DID,2个字节无符号整数的ID,用来标识ECU中存储的某个诊断数据单元。它的好处是当要读取某个单元的诊断数据时,只要读对应的DID就可以,不必知道数据的具体地址。即使当ECU中的数据地址发生变化时,改变DID和地址单元的映射关系即可,对于使用者来说DID屏蔽了具体实现细节,而将重点放在了数据本身。
Negative Response Code
可以简称为NRC,或者叫负响应码,是一个字节的无符号整数。它是诊断协议为每种执行失败的诊断服务分配的失败原因代号。
Sub-function
有些诊断服务可以支持不同的诊断子服务,sub-function就是用来定义这种子服务的,它将某一个服务细分为更为具体的服务,是一个字节的无符号整数。比如ECU Reset这个服务就有0x01,0x02,0x03等sub-function指代具体的reset方式。

通信模式

事件驱动型,一问一答。
类比client-server通信方式,诊断仪即客户端,发送request,服务器即ECU,收到request之后进行处理,然后向诊断仪回复response。
有确认服务、无确认服务
寻址模式
  • 物理寻址,点对点,一对一,可根据物理地址的不同进行访问,但只能访问单个节点,各个ECU也采用不同的CANID针对提问作出应答。
  • 功能寻址,广播模式,一对多,根据功能的不同进行访问,它可以访问多个ECU节点,各个ECU也采用不同的CANID针对提问作出应答。其SID对于标准帧来说,通常是7DF。
比如,通过诊断仪请求各控制器进入编程模式(10 02):
物理寻址:诊断仪请求EMS进入刷新模式7E0 10 02 ECU响应诊断仪进入刷新模式7E8 50 02
功能寻址:诊断仪请求所有控制器进入刷新模式7DF 10 02EMS应答诊断仪进入刷新模式7E8 50 02TCU应答诊断仪进入刷新模式7E9 50 02MMI应答诊断仪进入刷新模式7EA 50 02
 

请求和响应

基本格式
归纳起来,诊断的request格式无非以下两种:
<SID> + <Sub-function> + <Parameter>
<SID> + <Parameter>
即有无sub-function的区别。Parameter可以是DID,可以是输入参数,可以是自定义的值,字节数视具体要求而定。
有sub-function
首先,sub-function的定义方法。
notion image
功能寻址的客户端请求信息
notion image
物理寻址的客户端请求信息
需要注意的是,Bit7用来指示是否要抑制Positive Response。当Bit 7为1时,对该request的Positive Response要被抑制,即不发送Positive Response;当Bit7为0时,对该request的Positive Response不被抑制,正常发送。除了Bit 7,Sub-function有不同的值,具体的值和含义在协议中对每个服务的解释时都会有介绍。
无sub-function
不带sub-function的服务,就带parameter。Parameter可以是DID,可以是输入参数,可以是自定义的值,字节数目也是视具体要求而定。一般在协议内都会有表格,当遇到具体问题时,可查表确定。
notion image
不带子功能--功能寻址的客户端请求信息
notion image
不带子功能--物理寻址的客户端请求信息
5.2 Response
通常,response会在服务被request且执行之后发送,成功的话就发positive response,失败的话要发negative response,但是也有例外的时候。比如,ECUreset,诊断仪要求先发送response,然后再去执行具体的reset,因为如果先reset,那么ECU的通信模块shut down,是无法发送出去response的。像这种特殊情况,协议会在描述具体服务时标注出来。
Positive Response
基本格式:
<SID+0x40> + <Sub-function> + <Parameter>
<SID+0x40> + <Parameter>
要注意,第一个字节是由SID和0x40的和构成。这里的Parameter项是optional的,具体要看协议规定。
比如,session control这个服务:
Send:02 10 01(02中的0代表网络层单帧SF,2代表数据域有2个字节;10是SID,02是子功能)
肯定响应:
Receive:02 50 01 (02同上,10+40表示对SID的肯定回复,01是sub-funtion)
否定响应:
03 7F 10 22 xx xx xx xx;(03同上,7F表示否定响应,10是SID,22是NRC)不论是物理寻址还是功能寻址,对于Positive Response来说都没有影响,只需要关注sub-function中的Bit 7 suppressPosRspMsgIndicationBit是0还是1,如果为0即false,那么正常发送即可,如果是1即true,那么就不发送response。如果根本没有subfunction呢,那么什么都不要考虑,肯定是要发送positive response的。
notion image
安全访问的过程
Negative Response
基本格式:
<0x7F> + <SID> + <NRC>
看起来比较简单,格式比较固定,只要是Negative Response,第一字节就是0x7F,第二字节照抄原来的SID,第三个字节是错误响应码,指示具体错误响应的原因,这个NRC可以在下文中参看。
比如,session control 这个服务:
Send:10 05(现在sun-function变为05了,假定系统不支持这个sub-function)
Receive:7F 10 12(7F即指代错误响应,10为SID,12是NRC,查协议可知其指代sub-function not supported 这个错误)
常用的NRC
  • 11:ServiceNotSupported/服务不支持,诊断仪发送的请求消息中服务标识符无法识别或不支持;
  • 12:SubFunctionNotSupported/不支持子服务,诊断仪发送的请求消息中子服务无法识别或不支持;
  • 13:IncorrectMessageLengthOrInvalidFormat/不正确的消息长度或无效的格式,请求消息长度与特定服务规定的长度不匹配或者是参数格式与特定服务规定的格式不匹配;
  • 21:BusyRepeatRequest/重复请求忙,表明ECU太忙而不能去执行请求。一般来说,在这种情况下,诊断仪应进行重复请求工作;
  • 22:conditionsNotCorrect/条件不正确,表明ECU的状态条件不允许支持该请求;
  • 24:requestSequenceError/请求序列错误,表明收到的是非预期的请求消息序列;
  • 25:noResponseFromSubnetComponent/子网节点无应答,表明ECU收到请求,但所请求的操作无法执行;
  • 26:failurePreventsExecutionOfRequestedAction/故障阻值请求工作执行,表明请求的动作因一故障原因而没有执行;
  • 31:requestOutOfRange/请求超出范围,请求消息包含一个超出允许范围的参数,或者是不支持的数据标识符/例程标识符的访问;
  • 33:securityAccessDenied/安全访问拒绝,诊断仪无法通过ECU的安全策略;
  • 35:invalidKey/密钥无效,诊断仪发送的密钥与ECU内存中的密钥不匹配;
  • 36:exceedNumberOfAttempts/超出尝试次数,诊断仪尝试获得安全访问失败次数超过了ECU安全策略允许的值;
  • 37:requiredTimeDelayNotExpired/所需时间延迟未到,在ECU所需的请求延迟时间过去之前诊断仪又执行了一次请求;
  • 70:uploadDownloadNotAccepted/不允许上传下载,表明试图向ECU内存上传/下载数据失败的原因是条件不允许;
  • 71:transferDataSuspended/数据传输暂停,表明由于错误导致数据传输操作的中止;
  • 72:generalProgrammingFailure/一般编程失败,表明在不可擦除的内存设备中进行擦除或编程时ECU检测到错误发生;
  • 73:wrongBlockSequenceCounter/错误的数据块序列计数器,ECU在数据块序列计数序列中检测到错误发生;
  • 78:requestCorrectlyReceived-ResponsePending/正确接收请求消息-等待响应 表明ECU正确接收到请求消息,但是将执行的动作未完成且ECU未准备好接收其它请求;
  • 7E:subFunctionNotSupportedInActiveSession/激活会话不支持该子服务,当前会话模式下ECU不支持请求的子服务;
  • 7F:serviceNotSupportedInActiveSession/激活会话不支持该服务,当前会话模式下ECU不支持请求的服务;
  • 92:voltageTooHigh/电压过高,当前电压值超过了编程允许的最大门限值;
  • 93:voltageTooLow/电压过低,当前电压值低于了编程允许的最小门限值;
诊断仪发送报文“85 02”要求EMS关闭故障管理 ,如果是肯定应答则EMS会回复“C5 02”,表示已经关闭故障管理;如果是否定应答,EMS会回复“7F 85 22”,表示没有关闭故障管理,原因是条件不正确。
值得一提的是,在物理寻址和功能寻址情况下,Negative Response有所不同。
在物理寻址情况下,只要是Negative Response就应该按照规定格式发送。而在功能寻址情况下,有一点特殊,对于NRC为0x11(service not supported)、0x12(subfunction not supported)、0x31(request out of range)这三种情况,功能寻址是不会发送response的。
notion image

服务

功能群
请求  SID
回复  SID
服务
说明
诊断及通信管理
0x10
0x50
诊断会话控制Diagnostic Session Control
UDS会使用不同的会话(session),可以用诊断会话控制(Diagnostic Session Control)来切换。可用的服务会依照目前有效的会话而不同。在一开始,控制单元默认是在“默认会话”(Default Session),有定义其他的会话,需要实现的会话会依照设备的种类而不同。
• “程序会话”(Programming Session)可以用来上传固件到设备,并更新设备的固件。
• “扩展诊断会话”(Extended Diagnostic Session)可解锁特定的诊断功能,例如调整传感器等。
• “安全系统诊断会话”(Safety system diagnostic session)用来测试安全相关的诊断机能,例如安全气囊的测试。
此外,也有一些保留的会话识别符,为了汽车生产者及供应商的特殊需求而设计。
诊断及通信管理
0x11
0x51
ECU重置ECU Reset
ECU重置的服务是要重启ECU。依照控制单元硬件以及实现方式的不同,有以下几种不同的重置:
• “硬重置”模拟电源关闭的重置。
• “关闭锁匙重置”模拟用锁匙将汽车熄火,再开启汽车的https://zh.wikipedia.org/wiki/%E9%BB%9E%E7%81%AB%E9%96%8B%E9%97%9C
• “软重置”初始化特定程序单元以及存储结构。
也有一些汽车生产者及供应商定义的特殊数值。
诊断及通信管理
0x27
0x67
安全性访问Security Access
可以用安全性检查(Security check)来启动大部分的安全关键性服务(security-critical services)。此情形下控制单元会发送“密码种子(seed)”到客户端(电脑或是诊断工具)。客户端再用密码种子计算密钥(key)送回控制单元,以此来解安全关键性服务
诊断及通信管理
0x28
0x68
通信控制Communication Control
此服务可以关闭控制单元发送以及接收消息的功能。
诊断及通信管理
0x29
0x69
认证Authentication
标准在2020年的更新版本,提供一种标准化的方式,可以提供一些安全性访问(0x27)服务无法支持的现代认证方式,包括以https://zh.wikipedia.org/wiki/%E5%85%AC%E9%96%8B%E9%87%91%E9%91%B0%E5%9F%BA%E7%A4%8E%E5%BB%BA%E8%A8%AD为基础的认证交换,以及双向的https://zh.wikipedia.org/wiki/%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81机制。
诊断及通信管理
0x3E
0x7E
测试者存在Tester Present
若客户端长时间没有交换通信资料,控制单元会自动离开目前的会话,回到“默认会话”,也可能会进入休眠模式。而此一服务的目的就是让控制单元知道客户端仍存在。
诊断及通信管理
0x83
0xC3
访问时序参数Access Timing Parameters
在控制器及从机的通信中,需要观察一定的时间,若时间超过此限制,仍没有提交消息,就会假设连接已有问题。可以读取及修改此时间。
诊断及通信管理
0x84
0xC4
安全资料传输Secured Data Transmission
诊断及通信管理
0x85
0xC5
控制DTC设置Control DTC Settings
启动或关闭部分(或所有)错误的侦测。若诊断工作是在车内进行的,这个机能格外重要,因为诊断工作有可能造成部分零件的异常行为。
诊断及通信管理
0x86
0xC6
事件回复Response On Event
诊断及通信管理
0x87
0xC7
链接控制Link Control
服务链接控制是用来设置诊断访问的比特率。多半只在中间网关上实现此一机能。
资料传输
0x22
0x62
根据标识符读取资料Read Data By Identifier
透过此服务可以读取控制单元中一个或多个的资料。这些资料的种类不限,也可以有不同的长度,例如料号或是软件版本等。也可以读取像是传感器状态之类会变动的值。每一个值会对一个资料标识符(Data Identifier、简称DID),数值从0到65535。会用正常的CAN信号来发送特定ECU使用的资料。DID资料只用在资料请求上,也可以用一些没有ECU使用的DID来发送信息,虽ECU不会使用,但服务工具或软件测试程序可以使用这类的信息。
资料传输
0x23
0x63
根据地址读取存储器Read Memory By Address
依给定地址读取物理内存中的值。测试工具可以用此机能来读取软件内部的行为。
资料传输
0x24
0x64
根据标识符读取缩放比例资料Read Scaling Data By Identifier
资料传输
0x2A
0x6A
周期性根据标识符读取资料Read Data By Identifier Periodic
透过此服务可以让控制单元周期性发送资料。只能发送透过“动态定义资料标识符”定义的标识符
资料传输
0x2C
0x6C
动态定义资料标识符Dynamically Define Data Identifier
此服务提供一个修正设备资料标识符(DID)的方式,可以重新调整资料标识符。这个通常是不同资料标识符的组合,或者单纯是所有DID的串接。请求资料可以依以下的原则规划配置:
• 原始资料标识符、位置、长度(依字节表示)、子功能字节:defineByIdentifier
• 存储器位置、长度(依字节表示)、子功能字节:defineByMemoryAddress
• 可以结合上述二种方式
资料传输
0x2E
0x6E
根据标识符写入资料Write Data By Identifier
可以更改资料标识符中的数值,命令中除了资料标识符外,也要同时提供要修改的数值
资料传输
0x3D
0x7D
根据地址写入到存储器Write Memory By Address
“根据地址写入到存储器”可以让外面诊断工具写信息到ECU里的特定地址,或特定的连续地址
存储资料发送
0x14
0x54
清除诊断信息Clear Diagnostic Information
清除已存储的诊断问题码(Diagnostic Trouble Code,简称DTC)
存储资料发送
0x19
0x59
读取DTC信息Read DTC Information
DTC是诊断问题码。每一个DTC对应一个控制单元的故障,会以其编码存储在错误存储器中,可以在任意时候读取。除了错误外,也可能会记录一些相关的信息,也可以一并读取。
输入/输出控制
0x2F
0x6F
根据标识符的输入/输出控制Input Output Control By Identifier
此服务可以让外部系统接口透过诊断接口控制输入/输出信号透过设置选择字节,可以设置有关请求的特殊条件,可以设置以下的值:
ReturnControlToECU:设备需将信号的控制权送回
ResetToDefault:测试者试图重置信号,回到系统的默认值
Freeze Current State:设备需冻结目前的信号,不允许变化
ShortTermAdjustment:设备需使用目前提供的信号值
远程启动程序
0x31
0x71
远程控制Routine Control
此控制服务程序可以进行各种的服务,有三种不同的信息种类:
• 配合启始信息,可以开始服务。可以定义此信息来确认要执行各动作,或是提示服务已经完成。
• 配合停止信息,运行中的服务可以在任何时间下中断。
• 第三个选项是查询服务状态的信息
可以特别标示启始及结束的信息参数,因此可以实现每一种项目特定的服务。
上传/下载
0x34
0x74
请求下载Request Download
利用“请求下载”服务,可以下载新的软件或是其他资料到控制单元内。需标示资料的位置以及长度,因此,控制器可以知道数据包的大小。
上传/下载
0x35
0x75
请求上传Request Upload
“请求上传”服务和“请求下载”服务是类似的,此服务可以将控制单元的软件发送给测试者。也需标示资料的位置以及长度,测试者需指定数据包的大小。
上传/下载
0x36
0x76
发送资料Transfer Data
在真正发送资料时,会用到此一服务,不论是上传或是下载都是使用此一服务。发送的方向则视之前是“请求上传”服务或“请求下载”服务而不同。此一服务会用之前指定的最大数据包长度发送资料,若资料长度超过最大数据包长度,需要用数个数据包来发送,直到发送完成为止。
上传/下载
0x37
0x77
请求结束发送Request Transfer Exit
可以用此服务中止资料发送。此服务用在测试着和控制单元比较时。在执行时,控制单元可以负面回应来中止资料发送请求。若指定的资料量还没发送完,也可以用此服务中止发送。
上传/下载
0x38
0x78
请求文件发送Request File Transfer
此服务用来启始客户端到服务器的文件下载,或是服务器到客户端的文件上传。也可以提供一些文件系统的相关信息。
0x7F
否定回应Negative Response
此回应会在服务无法进行时回复,例如不支持的资料识别符。此时会加上否定的回应码。

NRC: Negative response codes

来自 ECU 的否定回应(Negative Response)包含 SID 0x7F 和两个有效负载字节:请求的 SID 和错误代码。
错误代码(NRC)如下:
NRC
Description
0x10
General reject
一般拒绝
0x11
Service not supported
不支持的服务
0x12
Subfunction not supported
不支持的子功能
0x13
Incorrect message length or invalid format
消息长度不正确或格式错误
0x14
Response too long
反应时间太长
0x21
Busy, repeat request
忙碌/重复请求
0x22
Conditions not correct
条件不正确
0x24
Request sequence error
请求顺序错误
0x25
No response from subnet component
子网组件无回应
0x26
Failure prevents execution of requested action
阻止执行请求的操作失败
0x31
Request out of range
请求超出范围
0x33
Security access denied
安全访问被拒绝
0x34
Authentication failed
认证失败
0x35
Invalid key
无效的密钥
0x36
Exceeded number of attempts
超过尝试次数
0x37
Required time delay not expired
要求的延迟时间未到
0x38
Secure data transmission required
需要安全的资料传输(SID=0x84)
0x39
Secure data transmission not allowed
不允许安全资料传输
0x3A
Secure data verification failed
安全资料验证失败
0x50
Certificate validation failed, invalid time period
证书验证失败,时段无效
0x51
Certificate validation failed, invalid signature
证书验证失败,签名无效
0x52
Certificate validation failed, invalid chain of trust
证书验证失败,信任链无效
0x53
Certificate validation failed, invalid type
证书验证失败,类型无效
0x54
Certificate validation failed, invalid format
证书验证失败,格式无效
0x55
Certificate validation failed, invalid content
证书验证失败,内容无效
0x56
Certificate validation failed, invalid scope
证书验证失败,范围无效
0x57
Certificate validation failed, invalid certificate
证书验证失败,证书无效
0x58
Ownership verification failed
所有权验证失败
0x59
Challenge calculation failed
挑战计算失败
0x5A
Setting access right failed
设置访问权限失败
0x5B
Session key creation/derivation failed
会话密钥建立/派生失败
0x5C
Configuration data usage failed
配置资料使用失败
0x5D
Deauthentication failed
取消认证失败
0x70
Upload download not accepted
上传下载不被接受
0x71
Transfer data suspended
传输资料暂停
0x72
General programming failure
一般程序设计失败
0x73
Wrong block sequence number
错误的区块序号
0x78
Request correctly received, response pending
请求已正确接收,回应待处理
0x7E
Subfunction not supported in active session
当前会话中不支持子功能
0x7F
Service not supported in active session
当前会话中不支持服务
0x81
RPM too high
转速太高
0x82
RPM too low
转速太低
0x83
Engine is running
引擎正在运转
0x84
Engine is not running
引擎未运转
0x85
Engine run time too low
引擎运转时间太短
0x86
Temperature too high
温度过高
0x87
Temperature too low
温度太低
0x88
Vehicle speed too high
车速太高
0x89
Vehicle speed too low
车速太低
0x8A
Throttle/pedal too high
油门/踏板太高
0x8B
Throttle/pedal too low
油门/踏板太低
0x8C
Transmission range not in neutral
传输范围不在空档
0x8D
Transmission range not in gear
未挂档的传动范围
0x8F
Brake switch not closed
刹车开关未闭合
0x90
Shifter lever not in park
变速杆不在停车位置
0x91
Torque converter clutch locked
变矩器离合器锁止
0x92
Voltage too high
电压过高
0x93
Voltage too low
电压太低
0x94
Resource temporary unavailable
资源暂时无法使用
上一篇
车CAN总线协议学习
下一篇
反序列化初探
Loading...
文章列表
Hi~, I ‘m moyao
reverse
pwn
pentest
iot
android
others
ctf
iOS