删除相同数据内容的数据后,处理数据
分析发现,某些数据如下图所示,数据内容始终保持为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 main()
{
//0220000 c6 03 f1 03 0c 00 3f 10
std::vector<message> set;
ifstream In("F:\\DoS_attack_dataset.txt");
string line;
string id[10];
while(getline(In,line))//逐行读取数据并存于line中,直至数据全部读取
{
message mes;
std::stringstream input(line);
input >> mes.Timestamp >> mes.timestamp >> mes.Id >> mes.iD >> mes.id >> mes.DLc >> mes.dlc >> mes.A >> mes.Aa >> mes.B >> mes.Ba >> mes.C >> mes.Ca >> mes.D >> mes.Da;
mes.iD += mes.id;
mes.A += mes.Aa;
mes.B += mes.Ba;
mes.C += mes.Ca;
mes.D += mes.Da;
cout << mes.iD <<endl;
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;
}
}
}
return 0;
}
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <sstream>
#include <algorithm>
#include <cmath>
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;
string CarSpeed;
};
int main()
{
std::vector<message> set;
ifstream In("F:\\DoS_attack_dataset.txt");
string line;
string id[10];
while(getline(In,line))//逐行读取数据并存于line中,直至数据全部读取
{
message mes;
std::stringstream input(line);
input >> mes.Timestamp >> mes.timestamp >> mes.Id >> mes.iD >> mes.id >> mes.DLc >> mes.dlc >> mes.A >> mes.Aa >> mes.B >> mes.Ba >> mes.C >> mes.Ca >> mes.D >> mes.Da;
mes.iD += mes.id;
mes.A += mes.Aa;
mes.B += mes.Ba;
mes.C += mes.Ca;
mes.D += mes.Da;
cout << mes.iD <<endl;
int carspeed_monitor = 0;//现在的速度与之前的速度的差值
int speed_diff_threshold = 300;//定义阈值,现速度-原速度超过阈值则判断为有攻击
string previous_speed = "1511";//先假定之前的速度为1511
mes.CarSpeed = mes.C;
if(mes.iD == "0080000")
{
carspeed_monitor = atoi(mes.CarSpeed.c_str()) - atoi(previous_speed.c_str());
previous_speed = mes.CarSpeed;
if (abs(carspeed_monitor) >= speed_diff_threshold)
{
cout << "FALSE READINGS" <<endl;
}
else
{
cout << mes.iD << "it is a safe id number!" << endl;
}
}
}
return 0;
}
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <sstream>
#include <algorithm>
#include <cmath>
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;
string CarSpeed;
};
int main()
{
std::vector<message> set;
ifstream In("F:\\DoS_attack_dataset.txt");
string line;
string id[10];
while(getline(In,line))//逐行读取数据并存于line中,直至数据全部读取
{
message mes;
std::stringstream input(line);
input >> mes.Timestamp >> mes.timestamp >> mes.Id >> mes.iD >> mes.id >> mes.DLc >> mes.dlc >> mes.A >> mes.Aa >> mes.B >> mes.Ba >> mes.C >> mes.Ca >> mes.D >> mes.Da;
mes.iD += mes.id;
mes.A += mes.Aa;
mes.B += mes.Ba;
mes.C += mes.Ca;
mes.D += mes.Da;
cout << mes.iD <<endl;
string messages_allowed[15] = {"01f1000","04b0000","0034000","0510000","0517000","01f1100","05a2100","04b0100","05a2100","04b1100","0153100","0164100","0220100","0000000"};
int i;
int count=0;
for(i=0; i < 15; i++)
{
if(mes.iD == messages_allowed[i])
{
count++;
}
}
if(count == 0)
{
cout << "Unauthorized message with ID=" << mes.iD <<endl;
}
}
return 0;
}