OBD数据分析(三)——将数据按照特征分类
处理数据
将数据分为4段,分别为A、B、C、D
删除相同数据内容的数据后,处理数据
- 有些数据内容一直保持不变,则合并为一条数据
- 有些数据一直变化,则取其平均值
处理结果如下:
分析数据,选出有特征的id数据
分析发现,某些数据如下图所示,数据内容始终保持为0000 0000 0000 0000,或DLC一直为0:
进行检测
对具体内容的大小进行检测分析是否有入侵
将消息的具体内容分为了四个部分,如下所示,分别命名为A,B,C,D
class message
{
public:
string Timestamp;
string timestamp;
string Id;
string iD;
string id;
string DLc;
string dlc;
string A;
string Aa;
string B;
string Ba;
string C;
string Ca;
string D;
string Da;
};
进过观察可知,某些数据,如id为02200000的消息,虽然内容在一直变化,但DLC始终未8,选取较中间大小的数据c603 f103 0c00 3f10,一部分消息就能被检测到攻击(因为数据是合理的,所以假设攻击),如下图所示
故我们定义个规则集,用于检查在处理消息之前ECU应接受或拒绝的消息结构及其属性,如下所示
if (mes.iD == "0220000")
{
//观察发现消息0220000的DLC一般为8,所以这里设不为8时为有入侵
//通过对消息0220000的具体内容进行分析,得四个信号的最大值分别是 c6 03 f1 03 0c 00 3f 10
//即超过这四个信号的最大值是判断为有入侵
if(mes.dlc != "8" || mes.A > "c603" || mes.B > "f103" || mes.C > "0c00" || mes.D > "3f10")
{
cout << "MALFORMED FRAME with ID " << mes.iD <<endl;
}
else
{
cout << mes.iD << "it is a safe id number!" << endl;
}
}
执行结果如图
完整代码如下
//手头的消息进行分析,我们将消息分为四个信号,分别为abcd,均最都具有两位
//之后,定义了一个规则集,用于检查在处理消息之前ECU应接受或拒绝的消息结构及其属性。
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <sstream>
#include <algorithm>
using namespace std;
class message
{
public:
string Timestamp;
string timestamp;
string Id;
string iD;
string id;
string DLc;
string dlc;
string A;
string Aa;
string B;
string Ba;
string C;
string Ca;
string D;
string Da;
};
int