具体实施方式
为使本发明的目的、技术方案、及优点更加清楚明白,以下参照附图并举实施例,对本发明进一步详细说明。
CAN总线协议标准是公开的,但是CAN总线协议的细节,不同的厂商有各自的实现方式,且对外保密。如果我们盲目地构造模糊测试数据并输入到CAN总线中,观察数据引发的ECU响应并确定引发响应的数据会更加困难。比如,构造某一ID为帧标识符的模糊测试数据集,每一条报文数据,选取某一数据位填充随机值,其他位全部填充0。这种数据构造,在未对车辆总线数据进行采集和分析的情况下,有可能ID是未在总线中出现过的,甚至没有ECU使用这一ID,使得这一模糊数据集是无用的;当观察到某一ECU出现响应,也无法确定响应是由填充的随机值还是0值引起的。CAN协议中存在者部分ECU,以固定的周期和ID向总线中发送数据,发送周期和ID,数据部分一样都是CAN报文的重要特征,错误的发送周期和部分周期报文的丢失也有可能引起ECU的异常。
因此,对目标总线数据进行采集,分析数据多种特征并基于此有针对性地构造模糊测试数据对于ECU安全性、健壮性测试具有重要意义。报文ID、发送周期Δt和总线数据都是CAN总线报文的重要特征。本发明根据CAN总线数据特征,将CAN总线数据划分为三类:单值数据字段、多值数据字段、全值数据字段。其中全值数据字段可以进一步细分为状态值字段、计数器值字段、校验值字段三类。
单值数据字段,就是至始至终都为同一个数值的数据,这样的数据往往是用作填充,没有推断功能的必要。
多值数据字段,就是只可能在某几个数值中变化的数据,这样的数据往往是用作控制,状态显示等表示某些状态离散的车辆信息。比如车门的开和关;比如雨刷的状态:静止、慢刷、快刷等。
全值数据字段,就是能够遍历一个范围数值的数据,这样的数据往往是表示某些状态连续的车辆信息,比如车速、燃油量等;或者是计数器,比如用作心跳数据;又或者只是用作校验值。
在CAN总线数据字段类别中,单值数据字段和多值数据字段很好判断。难点主要在于区分出全值数据字段中的状态值字段、计数器值字段和校验值字段这三类。
而全值数据字段中,计数器值字段和校验值字段的特征相对明显,所以使用排除法的方式来区分出状态值字段,即如果数据不属于计数器值字段,也不属于校验值字段,则认为是状态值字段。下面详细介绍计数器值字段与校验值字段的特征。
计数器值字段的特征:随时间递增或递减,最低有效位的比特反转率(bit从0变为1,或者从1变为0的概率)为1,并且低有效位的比特反转率是更高一级有效位的两倍。下面举例解释,比如使用两个字节来表示计数器值,即一共使用了16个bit。这个数值将从0x0000累加到0xFFFF,然后进入下一次循环。假设我们拿到了一个循环的数据,共65536条,则第16个bit值(最低有效位)一共反转了65535次,比特反转率为1;第15个bit值一共反转了32767次,比特反转率为0.5;第14个bit的反转率为0.25,以此类推。当然,我们不一定能获取一整个循环的数据;但是没有关系,只要数据出现了计数器的特征,就能够分割出计数器的边界。右边界(最低有效位)在比特反转率为1的位置,标定右边界之后再往左推断左边界,只要高bit的反转率是低bit反转率的一半,则说明高bit还在计数器数据的边界内,还能继续往左推断左边界。迭代执行,逐bit往左推断,直到高bit的反转率不再是低bit的一半,此时的低bit则作为计数器字段的左边界(最高有效位)。
校验值字段的特征:与反应车辆状态信息的数据,还有计数器字段相比,校验值字段具有明显的随机数特征。理论上,校验值字段的每个bit,都具有0.5的比特反转率。在数据足量的情况下,校验值字段所有bit的比特反转率分布应该呈现以0.5为期望的正态分布。
如上所述,多值数据字段就是只可能在某几个数值中变化的数据,这样的数据往往是用作控制,状态显示等表示某些状态离散的车辆信息。因此有可能选取某一较小区间中的几个值作为标识。选取已知数据值的邻近值,有可能更改ECU对应的控制量或状态量。负载全值数据字段的报文很可能具有时间周期,某ECU向另一ECU定期传送某一变量或参数的值,因此相邻报文数据的变化量波动幅度不会很大,构造模糊测试数据可以尝试允许范围内的最大值(全F)、最小值(全0)、已知数据所属区间内未出现过的值以及区间外的值。此外,可以改变报文的发送周期将接收到的正常CAN流量进行重放,测试ECU是否有异常的响应。
实施例一
基于上述分析,本发明实施例提出的一种车辆ECU安全测试方法,其流程示意图如图1所示,该方法包括:
步骤11、获取车辆CAN总线数据,将相同帧ID的CAN总线数据划分为同一数据集作为原始数据集;其中,不同帧ID对应不同ECU。
一可选实施例中,一个车辆有多个电控元件,不同帧ID表示不同电控元件的数据特征。假设样本CAN总线数据有10000条,以其中的20条CAN总线数据进行示例,如表1所示。
|
帧ID |
数据 |
1 |
488 |
6A 5C 64 04 1E 5C FF 43 |
2 |
3C9 |
32 47 F0 E6 21 71 00 00 |
3 |
3B8 |
E6 DF CB FF CB CC 90 00 |
4 |
608 |
03 AC 0C 00 09 00 50 00 |
5 |
3C9 |
32 46 F0 C5 21 75 00 00 |
6 |
552 |
01 F8 DB CB 00 03 74 30 |
7 |
608 |
03 60 0C 00 09 00 50 00 |
8 |
3C9 |
32 44 F0 8C 21 74 00 00 |
9 |
3C9 |
32 43 F0 57 21 7D 00 00 |
10 |
488 |
87 FB 64 04 1E 81 FF 47 |
11 |
592 |
44 68 00 2F 9C 11 50 1D |
12 |
208 |
19 20 33 00 4C 34 35 35 |
13 |
208 |
19 10 36 00 4C 35 36 36 |
14 |
208 |
19 80 34 00 4C 36 35 35 |
15 |
3B8 |
E6 C7 CB FF CB CB 00 00 |
16 |
552 |
01 F8 C9 83 00 03 74 30 |
17 |
208 |
18 F0 35 00 4C 34 33 33 |
18 |
3B8 |
E7 1F CA FF CA CB E0 00 |
… |
… |
… |
9999 |
3B8 |
E6 B7 CC FF CB CB 00 00 |
10000 |
3B8 |
E6 EF C9 FF CA C9 F0 00 |
表1
上述表1数据为16进制表示法。为解析CAN总线数据,根据帧ID对CAN总线数据进行分类,将相同帧ID的数据划分到同一数据集,以便进行后续解析。例如,在表1的10000条数据中,帧ID为666的数据有1000条,因此,将帧ID为666,表示车灯的数据特征的1000条CAN总线数据划分到同一数据集。显然,样本数据越多,数据字段划分的越准确。
步骤12、确定每个原始数据集所属单值数据集、多值数据集或全值数据集。
一可选实施例中,本步骤具体包括:
确定每个原始数据集中,每个字节所属单值数据、多值数据或全值数据字段;
如果该原始数据集中包含全值数据字段,且为状态值字段,则所述原始数据集为全值数据集;
如果该原始数据集中不包含全值数据字段的状态值字段,包含多值数据字段,则所述原始数据集为多值数据集;
如果该原始数据集中只包含单值数据字段,则所述原始数据集为单值数据集。
步骤13、根据每个原始数据集特征构造相应模糊测试数据集。
一可选实施例中,本步骤具体包括:
如果所述原始数据集为全值数据集,且为状态值字段,则确定发送周期Δt、数据值所在区间A、相邻报文数据差值的最大值M;选取预定数量的值填充状态值字段,其他字段数值保持不变,以构造模糊测试数据集;其中,预定数量的值包括表示范围最小值、最大值、第一预定数量的区间A内未出现的值、以及第二预定数量的区间A外的值,其中,区间A外的各个数值间隔大于M;
如果所述原始数据集为多值数据集,则选取与多值数据集中多值数据字段数值邻近的值填充多值数据字段,其他字段数值保持不变,以构造模糊测试数据集。
步骤14、分别将每个模糊测试数据集中的数据向CAN总线发送,以确定车辆各ECU的安全性。
一可选实施例中,全值数据集具有发送周期Δt,则选择不同发送周期将全值数据集对应的模糊测试数据集中的数据向CAN总线发送。
一可选实施例中,所述分别将每个模糊测试数据集中的数据向CAN总线发送,以确定车辆各ECU的安全性,具体包括:
将一帧ID对应的模糊测试数据集中的数据向CAN总线发送时,
根据车辆的状态是否出现改变,如果发生改变,则确定该帧ID对应的ECU处于非安全状态;
或者,监听CAN总线数据,与该帧ID对应的原始数据集以及模糊测试数据集进行比较,判断是否出现新的数据,如果是,则确定该帧ID对应的ECU处于非安全状态。
至此,完成了本发明的车辆ECU安全测试方法。首先,接入CAN总线获取CAN总线上传输的报文,按照帧ID进行报文分组,不同的分组对应不同ECU,也具有不同的数据特征;然后根据不同的数据特征构造相应模糊测试数据集;最后,分别将每个模糊测试数据集中的数据向CAN总线发送,确定每个模糊测试数据集中的数据攻击是否对各ECU产生异常,如果,没有异常,说明各ECU是安全的。如此,本发明针对性的测试,耗时时间短,能够对引发ECU响应的报文数据精准定位,而且,本发明还能够将报文各类特征结合起来考虑,以确定车辆各ECU的安全性。
由于有的ECU故障不能直接从外面看出来,优选地,将一帧ID对应的模糊测试数据集中的数据向CAN总线发送后,该方法进一步包括:向CAN总线发送诊断报文,以确定对应ECU的安全性。
一可选实施例中,步骤12确定每个字节所属全值数据字段,具体包括:
以字节为单位,遍历同一数据集的CAN总线数据,统计每个字节存在不同数值的个数,当字节存在不同数值的个数大于预定个数时,确定每个字节所属全值数据字段;
以比特为单位,遍历同一数据集的CAN总线数据,获取以字节为单位的各个全值数据字段对应每个比特的比特翻转率;将相邻字节的全值数据字段进行合并后,计算各合并后的全值数据字段对应每个比特的比特翻转率权重;根据所述权重对各合并后的全值数据字段进行子字段切割,以确定每个全值数据子字段的边界;根据切割后各个全值数据子字段对应每个比特的比特翻转率特征,对各个全值数据子字段进行分类;
其中,根据所述权重对各合并后的全值数据字段进行子字段切割,以确定每个全值数据子字段的边界,具体包括:
当前一比特的比特翻转率权重小于后一比特的比特翻转率权重,则确定所述前一比特和后一比特属于不同的全值数据子字段;
当前一比特的比特翻转率权重不小于后一比特的比特翻转率权重,则确定所述前一比特和后一比特属于同一全值数据子字段;
其中,根据切割后各个全值数据子字段对应每个比特的比特翻转率特征,对各个全值数据子字段进行分类,具体包括:
根据低有效位的比特翻转率是高有效位比特翻转率的两倍,确定所述全值数据子字段为计数器值字段;
或者,根据全值数据子字段每个比特的比特翻转率分布呈现以0.5为期望的正态分布,确定所述全值数据子字段为校验值字段;
或者,如果所述全值数据子字段既不属于计数器值字段,也不属于校验值字段,则确定所述全值数据子字段为状态值字段。
一可选实施例中,步骤12确定每个字节所属多值数据字段,具体包括:
以字节为单位,遍历同一数据集的CAN总线数据,统计每个字节存在不同数值的个数,当字节存在不同数值的个数不大于预定个数时,确定该字节为多值数据字段。
一可选实施例中,步骤12确定每个字节所属单值数据字段,具体包括:
以字节为单位,遍历同一数据集的CAN总线数据,统计每个字节存在不同数值的个数,当字节存在不同数值的个数为1时,确定该字节为单值数据字段。
实施例二为清楚说明本发明,下面列举具体数据进行说明。
一、接收一段时间内CAN总线传输的正常数据。
收集被测车辆CAN总线数据,并添加时间戳,获得原始数据如表2所示:
表2
二、按CAN协议数据的帧ID分组,构造原始数据集如下:
帧ID |
数据 |
时间戳 |
02E |
1A 23 13 2D 24 21 00 10 |
2020/10/2115:30:01 |
02E |
1A 23 13 FD A4 21 00 10 |
2020/10/2115:30:11 |
02E |
1A 23 13 2D 64 21 00 10 |
2020/10/2115:31:01 |
表3
表4
帧ID |
数据 |
时间戳 |
23A |
1A 03 46 22 00 00 00 00 |
2020/10/21 15:30:05 |
23A |
2A 05 46 22 00 00 00 00 |
2020/10/21 15:30:10 |
23A |
3A 13 46 22 00 00 00 00 |
2020/10/21 15:30:15 |
23A |
4A 17 46 22 00 00 00 00 |
2020/10/21 15:30:20 |
23A |
5A 26 46 22 00 00 00 00 |
2020/10/21 15:30:25 |
23A |
6A 30 46 22 00 00 00 00 |
2020/10/21 15:30:30 |
23A |
7A 39 46 22 00 00 00 00 |
2020/10/21 15:30:35 |
23A |
8A 42 46 22 00 00 00 00 |
2020/10/21 15:30:40 |
23A |
9A 4A 46 22 00 00 00 00 |
2020/10/21 15:30:45 |
23A |
AA 4E 46 22 00 00 00 00 |
2020/10/21 15:30:50 |
23A |
BA 56 46 22 00 00 00 00 |
2020/10/21 15:30:55 |
23A |
CA 5A 46 22 00 00 00 00 |
2020/10/21 15:31:00 |
23A |
DA 60 46 22 00 00 00 00 |
2020/10/21 15:31:05 |
23A |
EA 62 46 22 00 00 00 00 |
2020/10/21 15:31:10 |
23A |
FA 63 46 22 00 00 00 00 |
2020/10/21 15:31:15 |
23A |
0A 63 46 22 00 00 00 00 |
2020/10/21 15:31:20 |
表5
如上,划分为三个原始数据集,帧ID为02E原始数据集如表3所示,帧ID为05E原始数据集如表4所示,帧ID为23A原始数据集如表5所示。
三、按字节构造数据组:
将接收到报文的各个字节数值按照帧ID和字节填入数据结构:
{
02E:{
1:[1A],
2:[23],
3:[13],
4:[2D,FD],
5:[24,64,A4],
6:[21],
7:[00],
8:[10]
},
05E:{
1:[1A],
2:[23],
3:[03,13],
4:[2D],
6:[21],
7:[00],
8:[10]
},
23A:{
2:[03,05,13,17,26,30,39,42,4A,4E,56,5A,60,62,63],
3:[46],
4:[22],
5:[00],
6:[00],
7:[00],
8:[00]
}
}
四、判定数据特征类型:
统计每个字节存在不同数值的个数,当字节存在不同数值的个数大于预定个数时,确定该字节为全值数据字段;当字节存在不同数值的个数不大于预定个数时,确定该字节为多值数据字段;当字节存在不同数值的个数为1时,确定该字节为单值数据字段。本实施例中设定数据值个数阈值为8。
由三中内容可知,
对于帧ID为02E原始数据集,第4、5字节中出现数据值个数非1且小于8,为多值数据字段,数据集为多值数据集;
对于帧ID为05E原始数据集,第3、4字节中出现数据值个数非1且小于8,为多值数据字段,数据集为多值数据集;
对于帧ID为23A原始数据集,第2字节中出现数据值个数大于8且数据值递增,为全值数据字段,且为状态值字段,数据集为全值数据集。
五、构造模糊测试数据集:
对23A全值原始数据集,确定发送周期5s,数据值所在区间[03,63],相邻报文数据差值的最大值为9。选取表示范围最小值00,最大值FF及区间内部分未出现过的值,区间外差值大于原始相邻报文数据差值的值。
其中,帧ID为23A的第二字节,根据表5可知:
第1,2条报文距离为2,
第2,3条报文距离为8,
第3,4条报文距离为4,
第4,5条报文距离为9,
第5,6条报文距离为4,
第6,7条报文距离为9,
第7,8条报文距离为3,
第8,9条报文距离为8,
第8,9条报文距离为8,
第9,10条报文距离为4,
第10,11条报文距离为8,
第11,12条报文距离为4,
第12,13条报文距离为6,
第13,14条报文距离为2,
第14,15条报文距离为1,
第15,16条报文距离为0,
由此可以确定,相邻报文数据差值的最大值为9。
因此,选取00,04,21,3C,46,5F,7D,90,9F,AB,C2,FF填充帧ID为23A的模糊测试数据报文的第二字节,第一字节的计数器值字段选取原始数据中出现的数据值填充,其余单值数据字段保持不变,构造模糊测试数据集,如表6所示:
帧ID |
数据 |
23A |
1A 00 46 22 00 00 00 00 |
23A |
2A 04 46 22 00 00 00 00 |
23A |
3A 21 46 22 00 00 00 00 |
23A |
4A 3C 46 22 00 00 00 00 |
23A |
5A 46 46 22 00 00 00 00 |
23A |
6A 5F 46 22 00 00 00 00 |
23A |
7A 7D 46 22 00 00 00 00 |
23A |
8A 90 46 22 00 00 00 00 |
23A |
9A 9F 46 22 00 00 00 00 |
23A |
AA AB 46 22 00 00 00 00 |
23A |
BA C2 46 22 00 00 00 00 |
23A |
CA FF 46 22 00 00 00 00 |
表6
对于02E多值原始数据集,选取报文中多值数据值的多个邻近值。选取1D,2A,2B,2C,2E,2F,3D,ED,FA,FB,FC,FE,FF填充帧ID为02E的模糊测试数据报文的第四字节,第五字节的多值数据字段选取原始数据中出现的数据值填充,其余单值数据字段保持不变;选取14,22,23,25,26,34,54,62,63,65,66,74,94,A2,A3,A5,A6,C4填充帧ID为02E的模糊测试数据报文的第五字节,第四字节的多值数据字段选取原始数据中出现的数据值填充,其余单值数据字段保持不变,构造模糊测试数据集,如表7所示:
表7
对05E多值原始数据集,选取报文中多值数据值的多个邻近值。选取00,01,02,04,05,11,12,14,15,23填充帧ID为02E的模糊测试数据报文的第三字节,第五字节的计数器数据字段选取原始数据中出现的数据值填充,其余单值数据字段保持不变,构造模糊测试数据集,如表8所示:
表8
需要说明的是,所构造的每个模糊测试数据集中数据的条数并不限定,可以根据具体应用灵活设置。
六、分别将每个模糊测试数据集中的数据向CAN总线中发送,以确定车辆各ECU的安全性。
1)将帧ID为02E对应的模糊测试数据集中的数据向CAN总线发送时,
根据车辆的状态是否出现改变,如果发生改变,例如,车窗状态改变,或者车门状态改变等,说明进行攻击时所构造的模糊测试报文对ECU产生了异常,则确定该帧ID对应的ECU处于非安全状态;
或者,同时监听CAN总线数据,与该帧ID对应的原始数据集以及模糊测试数据集进行比较,判断是否出现新的数据,如果是,说明该帧ID对应的ECU异常,则确定该帧ID对应的ECU处于非安全状态。
由于有的故障表面无法看到,所以在该组模糊测试数据发送完毕后,将向被测车辆CAN总线中发送UDS诊断报文,查看对应ECU的工作状态或故障代码。也就是说,如果在向被测车辆CAN总线中发送UDS诊断报文之前,已经确定该帧ID对应的ECU处于非安全状态,则发送UDS诊断报文后就可以明确显示哪个ECU出现故障;如果在向被测车辆CAN总线中发送UDS诊断报文之前,确定该帧ID对应的ECU处于安全状态,说明该ECU或者是安全的或者是有故障未检出,此时发送UDS诊断报文就可以进一步明确该ECU安全的真实性。
2)将帧ID为05E对应的模糊测试数据集中的数据向CAN总线发送时,
根据车辆的状态是否出现改变,如果发生改变,例如,车窗状态改变,或者车门状态改变等,说明进行攻击时所构造的模糊测试报文对ECU产生了异常,则确定该帧ID对应的ECU处于非安全状态;
或者,同时监听CAN总线数据,与该帧ID对应的原始数据集以及模糊测试数据集进行比较,判断是否出现新的数据,如果是,说明该帧ID对应的ECU异常,则确定该帧ID对应的ECU处于非安全状态。
由于有的故障表面无法看到,所以在该组模糊测试数据发送完毕后,将向被测车辆CAN总线中发送UDS诊断报文,查看对应ECU的工作状态或故障代码。也就是说,如果在向被测车辆CAN总线中发送UDS诊断报文之前,已经确定该帧ID对应的ECU处于非安全状态,则发送UDS诊断报文后就可以明确显示哪个ECU出现故障;如果在向被测车辆CAN总线中发送UDS诊断报文之前,确定该帧ID对应的ECU处于安全状态,说明该ECU或者是安全的或者是有故障未检出,此时发送UDS诊断报文就可以进一步明确该ECU安全的真实性。
3)将帧ID为23A对应的模糊测试数据集中的数据向CAN总线发送时,首先以发送周期为5s,然后改变发送周期为2.5s,10s,共计进行三次发送。
需要说明的是,根据全值数据集构造的模糊测试数据集,在发送数据时具有发送周期,可以改变不同的周期进行发送,不限定于2.5s,10s,只要是周期发送即可达到目的。
在以一定的周期向CAN总线发送时,
根据车辆的状态是否出现改变,如果发生改变,例如,车窗状态改变,或者车门状态改变等,说明进行攻击时所构造的模糊测试报文对ECU产生了异常,则确定该帧ID对应的ECU处于非安全状态;
或者,同时监听CAN总线数据,与该帧ID对应的原始数据集以及模糊测试数据集进行比较,判断是否出现新的数据,如果是,说明该帧ID对应的ECU异常,则确定该帧ID对应的ECU处于非安全状态。
由于有的故障表面无法看到,所以在该组模糊测试数据发送完毕后,将向被测车辆CAN总线中发送UDS诊断报文,查看对应ECU的工作状态或故障代码。也就是说,如果在向被测车辆CAN总线中发送UDS诊断报文之前,已经确定该帧ID对应的ECU处于非安全状态,则发送UDS诊断报文后就可以明确显示哪个ECU出现故障;如果在向被测车辆CAN总线中发送UDS诊断报文之前,确定该帧ID对应的ECU处于安全状态,说明该ECU或者是安全的或者是有故障未检出,此时发送UDS诊断报文就可以进一步明确该ECU安全的真实性。
实施例三
本实施例具体说明如何区分数据特征。
图2为本发明另一实施例提供的车辆CAN总线数据分类方法流程图,其具体步骤如下:
步骤21、将样本CAN总线数据中相同帧ID的CAN总线数据划分为同一数据集。
本实施例中,将帧ID为666,表示车灯的数据特征的j条CAN总线数据划分到同一数据集。每条CAN总线数据包含n个字节。
例如,同一数据集的CAN总线数据为1000条,每条CAN总线数据包含8个字节,如表9所示。
表9
步骤22、以字节为单位,遍历同一数据集的CAN总线数据,统计每个字节存在不同数值的个数,以确定每个字节所属单值数据、多值数据或全值数据字段。
在相同数据集中,遍历j条CAN总线数据,统计每个字节存在不同数值的个数,每条CAN总线数据包含n个字节,
当数组arr[n]=1时,表示第n个字节至始至终都为同一个数值,则将其划分为单值数据字段;
当数组arr[n]≤25时,表示第n个字节不同数值的个数不到字节范围的10%,则将其划分为多值数据字段;
当数组arr[n]>25时,将其划分为全值数据字段。
其中,一个字节=8bit,8个bit表示的范围为0-255,共256个数值。由于多值数据字段,就是只可能在某几个数值中变化的数据,这样的数据往往是用作控制,或者是表示某些状态离散的车辆信息。比如车门的开和关;比如雨刷的状态:静止、慢刷、快刷等。所以本实施例中,根据经验将本字节数值变化的个数不到256个数值的10%的字节定义为多值数据字段。具体的,也可以根据实际应用调整预定个数的限定。例如,在实施例二中,数据值个数阈值为8。
例如,对于每条CAN总线数据包含8个字节,第一字节存在不同数值的个数为1,属于单值数据字段;第二字节存在不同数值的个数为1,属于单值数据字段;第5字节存在不同数值的个数为20,属于多值数据字段。第三、四字节存在不同数值的个数分别为100和120,则第三、四字节属于全值数据字段;第六、七、八字节存在不同数值的个数分别为120、130和140,则第六、七、八字节属于全值数据字段。
在一条CAN总线数据中,数据部分最多有8个字节(64个bit)。本步骤将同一数据集的CAN总线数据以字节为单位进行第一次切割,可以确定出每个字节所属单值数据、多值数据或全值数据字段。需要注意的是,可能全值数据字段有的功能会被划分在了多个数据字段中,所以需要对全值数据字段进行进一步地合并和切割。
步骤23、以比特为单位,遍历同一数据集的CAN总线数据,获取以字节为单位的各个全值数据字段对应每个比特的比特翻转率。
本实施例中,遍历相同数据集中,j条CAN总线数据,将步骤22确定出的全值数据字段,计算全值数据字段每个bit的比特翻转率。这里,全值数据字段以字节为单位,但是可能全值数据字段有的功能会被划分在了多个字节中,所以需要对全值数据字段进行进一步地合并和切割,以准确定义全值数据字段的字节数。
对于以字节为单位的全值数据字段中的任一第i个比特,遍历j条CAN总线数据,如果第j条CAN总线数据第i个比特的值不同于第j-1条CAN总线数据,则将比特翻转次数+1,在遍历j条CAN总线数据结束后,所得的比特反转次数除以总条数j,则得到第i个比特的比特翻转率。
例如,第三字节对应第17至24比特,每个比特对应的比特翻转率分别为0、0、0.002、0.013、0.086、0.155、0.296、0.612。其中,以第19比特的比特翻转率0.002为例,遍历1000条CAN总线数据后,比特翻转次数为2,比特翻转率=2/1000=0.002。
第四字节对应第25至32比特,每个比特对应的比特翻转率分别为0、0、0.004、0.025、0.082、0.178、0.332、0.69。
第六字节对应第41至48比特,每个比特对应的比特翻转率分别为0.007、0.015、0.031、0.062、0.125、0.25、0.5、1。
第七字节对应第49至56比特,每个比特对应的比特翻转率分别为0.494、0.513、0.493、0.513、0.501、0.495、0.49、0.484。
第八字节对应第57至64比特,每个比特对应的比特翻转率分别为0.498、0.523、0.53、0.505、0.503、0.494、0.503、0.504。
步骤24、将相邻字节的全值数据字段进行合并得到长度为m的比特翻转率数组。
例如,将相邻的三四字节合并,得到比特翻转率数组brr[0、0、0.002、0.013、0.086、0.155、0.296、0.612、0、0、0.004、0.025、0.082、0.178、0.332、0.69],数组长度m为16;
将相邻的六七八字节合并,得到比特翻转率数组brr[0.007、0.015、0.031、0.062、0.125、0.25、0.5、1、0.494、0.513、0.493、0.513、0.501、0.495、0.49、0.484、0.498、0.523、0.53、0.505、0.503、0.494、0.503、0.504],数组长度m为24。
步骤25、计算各合并后的全值数据字段对应每个比特的比特翻转率权重。
举例4bit的计数器值字段的比特反转率数组brr[]=[0.125,0.25,0.5,1],故其比特权重数组W[]=[3,2,1,0]。
举例4bit的校验值字段的比特反转率数组可能为brr[]=[0.54,0.39,0.44,0.51],故其比特权重数组W[]=[1,1,1,1]。
同理,三四字节对应的长度为16的比特权重数组,以及六七八字节对应的长度为24的比特权重数组,计算原理与上述相同。
步骤26、根据所述权重对各合并后的全值数据字段进行子字段切割,以确定每个全值数据子字段的边界。
当W[i]<W[i+1],说明第i+1个比特属于另一全值数据字段,是另一全值数据字段的最高有效位;
当W[i]≥W[i+1],则说明第i个bit和第i+1个bit属于同一全值数据字段。
例如,第3字节的24比特对应的比特翻转率为0.612,第4字节的25比特对应的比特翻转率为0,则W[24]=1,W[25]=∞,因此,第3字节的24比特和第4字节的25比特属于不同的全值数据子字段。第3字节和第4字节属于不同的全值数据子字段。
再例如,第6字节的48比特对应的比特翻转率为1,第7字节的49比特对应的比特翻转率为0.494,则W[48]=0,W[49]=1,因此,第6字节的48比特和第7字节的49比特属于不同的全值数据子字段。第6字节和第7字节属于不同的全值数据子字段。
但是,第7字节和第8字节每个比特的比特翻转率分布呈现以0.5为期望的正态分布,每个比特对应的权重都为1,因此,第7字节和第8字节属于同一全值数据子字段。
步骤27、根据切割后各个全值数据子字段对应每个比特的比特翻转率特征,对各个全值数据子字段进行分类。
全值数据子字段进一步划分为三类:
如果低有效位的比特翻转率是高有效位比特翻转率的两倍,则确定所述全值数据子字段为计数器值字段;
如果全值数据子字段每个比特的比特翻转率分布呈现以0.5为期望的正态分布,则确定所述全值数据子字段为校验值字段。
如果既不属于计数器值字段,也不属于校验值字段则确定所述全值数据子字段为状态值字段。
例如,字节3为一个状态值字段,字节4为一个状态值字段,字节6为一个计数器值字段,字节7-8合并为一个校验值字段。
本发明实施例提供的车辆CAN总线数据分类方法,根据CAN总线数据特征,对数据字段进行多次准确切割,从而能够对CAN总线数据字段进行准确分类。
实施例四
基于相同的发明构思,本发明实施例提出了一种车辆ECU安全测试装置,其结构示意图如图3所示,该装置包括:
获取模块31,获取车辆CAN总线数据,将相同帧ID的CAN总线数据划分为同一数据集作为原始数据集;其中,不同帧ID对应不同ECU;
确定模块32,确定每个原始数据集所属单值数据集、多值数据集或全值数据集;
构造模块33,根据每个原始数据集构造相应模糊测试数据集;
测试模块34,分别将每个模糊测试数据集中的数据向CAN总线发送,以确定车辆各ECU的安全性。
其中,所述确定模块32,确定每个原始数据集所属单值数据集、多值数据集或全值数据集,具体用于:
确定每个原始数据集中,每个字节所属单值数据、多值数据或全值数据字段;
如果该原始数据集中包含全值数据字段,且为状态值字段,则所述原始数据集为全值数据集;
如果该原始数据集中不包含全值数据字段的状态值字段,包含多值数据字段,则所述原始数据集为多值数据集;
如果该原始数据集中只包含单值数据字段,则所述原始数据集为单值数据集。
所述构造模块33,根据每个原始数据集特征构造相应模糊测试数据集,具体用于:
如果所述原始数据集为全值数据集,且为状态值字段,则确定发送周期Δt、数据值所在区间A、相邻报文数据差值的最大值M;选取预定数量的值填充状态值字段,其他字段数值保持不变,以构造模糊测试数据集;其中,预定数量的值包括表示范围最小值、最大值、第一预定数量的区间A内未出现的值、以及第二预定数量的区间A外的值,其中,区间A外的各个数值间隔大于M;
如果所述原始数据集为多值数据集,则选取与多值数据集中多值数据字段数值邻近的值填充多值数据字段,其他字段数值保持不变,以构造模糊测试数据集。
其中,全值数据集具有发送周期Δt,则所述测试模块34,选择不同发送周期将全值数据集对应的模糊测试数据集中的数据向CAN总线发送。
所述测试模块34分别将每个模糊测试数据集中的数据向CAN总线发送,以确定车辆各ECU的安全性,具体用于:
将一帧ID对应的模糊测试数据集中的数据向CAN总线发送时,
根据车辆的状态是否出现改变,如果发生改变,则确定该帧ID对应的ECU处于非安全状态;
或者,监听CAN总线数据,与该帧ID对应的原始数据集以及模糊测试数据集进行比较,判断是否出现新的数据,如果是,则确定该帧ID对应的ECU处于非安全状态。
所述测试模块34,将一帧ID对应的模糊测试数据集中的数据向CAN总线发送后,还用于:
向CAN总线发送诊断报文,以确定对应ECU的安全性。
所述确定模块32,确定每个字节所属全值数据字段,具体用于:
以字节为单位,遍历同一数据集的CAN总线数据,统计每个字节存在不同数值的个数,当字节存在不同数值的个数大于预定个数时,确定该字节为全值数据字段;
以比特为单位,遍历同一数据集的CAN总线数据,获取以字节为单位的各个全值数据字段对应每个比特的比特翻转率;将相邻字节的全值数据字段进行合并后,计算各合并后的全值数据字段对应每个比特的比特翻转率权重;根据所述权重对各合并后的全值数据字段进行子字段切割,以确定每个全值数据子字段的边界;根据切割后各个全值数据子字段对应每个比特的比特翻转率特征,对各个全值数据子字段进行分类;
其中,根据所述权重对各合并后的全值数据字段进行子字段切割,以确定每个全值数据子字段的边界,具体包括:
当前一比特的比特翻转率权重小于后一比特的比特翻转率权重,则确定所述前一比特和后一比特属于不同的全值数据子字段;
当前一比特的比特翻转率权重不小于后一比特的比特翻转率权重,则确定所述前一比特和后一比特属于同一全值数据子字段;
其中,根据切割后各个全值数据子字段对应每个比特的比特翻转率特征,对各个全值数据子字段进行分类,具体包括:
根据低有效位的比特翻转率是高有效位比特翻转率的两倍,确定所述全值数据子字段为计数器值字段;
或者,根据全值数据子字段每个比特的比特翻转率分布呈现以0.5为期望的正态分布,确定所述全值数据子字段为校验值字段;
或者,如果所述全值数据子字段既不属于计数器值字段,也不属于校验值字段,则确定所述全值数据子字段为状态值字段。
所述确定模块32,确定每个字节所属多值数据字段,具体用于:
以字节为单位,遍历同一数据集的CAN总线数据,统计每个字节存在不同数值的个数,当字节存在不同数值的个数不大于预定个数时,确定该字节为多值数据字段。
所述确定模块32,确定每个字节所属单值数据字段,具体用于:
以字节为单位,遍历同一数据集的CAN总线数据,统计每个字节存在不同数值的个数,当字节存在不同数值的个数为1时,确定该字节为单值数据字段。
综上,本发明的有益效果为:
一、本发明针对性的测试,耗时时间短,能够对引发ECU响应的报文数据精准定位,而且,本发明还能够将报文各类特征结合起来考虑,以确定车辆各ECU的安全性。
二、本发明车辆CAN总线数据分类方法,操作简单易实现,能够准确推断并切割CAN总线数据字段,对CAN总线数据字段进行准确分类。
三、本发明能够将车辆CAN总线数据准确划分为三类:单值数据字段、多值数据字段、全值数据字段。其中,全值数据字段可以进一步划分为状态值字段、计数器值字段、校验值字段。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换以及改进等,均应包含在本发明的保护范围之内。