def changedatafield_attack_randomly(self, id, exist_time): # attackType就是 case switch的根本决定因素 self.get_rule(" ") self.refresh_place() # document_name = "changedatafield_attack_test.csv" # 从源数据中提取重放数据 begin_time = random.random() begin_time = self.sourceDataSnippet.shape[0] * (2 / 3) * begin_time begin_time = self.sourceDataSnippet.iloc[round(begin_time)]['time'] tmp_origin_data = self.sourceDataSnippet end_time = exist_time + begin_time for i in range(0, self.sourceDataSnippet.shape[0]): if tmp_origin_data.iloc[i]['time'] >= begin_time and tmp_origin_data.iloc[i]['time'] <= end_time \ and tmp_origin_data.iloc[i]['can_id'] == id: # 正式进入random环节 # 从前半部分直接random到后半部分 random_begin_bit = round(random.random() * 32) length_of_bit = round(random.random() * 32) random_end_bit = random_begin_bit + length_of_bit - 1 target_binary_bit = tmp_origin_data.iloc[i]['data_in_binary'] descriptionTmp = "before binary is " + target_binary_bit[ random_begin_bit:random_end_bit + 1] target_binary_bit = list(target_binary_bit) for love in range(random_begin_bit, random_end_bit + 1): if (random.random() > 0.5): target_binary_bit[love] = '0' else: target_binary_bit[love] = '1' target_binary_bit = "".join(target_binary_bit) descriptionTmp = descriptionTmp + " end binary is " + target_binary_bit[ random_begin_bit:random_end_bit + 1] tmp_origin_data.loc[i, 'data_in_binary'] = target_binary_bit tmp_origin_data.loc[i, 'data_in_hex'] = binary_str_to_hex_str( target_binary_bit) tmp_origin_data.loc[i, 'anormal'] = 5 hex_data = binary_str_to_hex_str(target_binary_bit) for peace in range(0, 8): tmp_origin_data.loc[i, 'data' + str(peace)] = hex_data[2 * peace:2 * peace + 2] df3 = tmp_origin_data.iloc[i] self.descriptionStruct.updateBasicInformation( 5, df3['can_id'], df3['time'], descriptionTmp, df3['data_in_binary']) # document_name = document_name + str(begin_time) + "_" + str(self.input_num) + ".csv" document_name = self.document_name if not os.path.exists(self.store_place): os.mkdir(self.store_place) tmp_origin_data.to_csv(self.store_place + "/" + document_name) self.descriptionStruct.writeIntoCsv()
def writeIntoInnerStruct(self): # 目标是返回一个dataframe,这个算是最重要的目标喽 # description其实是需要添加的数据? dict_tmp = {} dict_tmp['time'] = self.attackTime dict_tmp['can_id'] = self.attackCanId dict_tmp['attackType'] = self.attackType dict_tmp['description'] = self.attackDescription dict_tmp['data_in_hex'] = binary_str_to_hex_str(self.attackData) dict_tmp['data_in_binary'] = self.attackData dataSmallFrame = pd.DataFrame([dict_tmp]) self.dataFrameList = self.dataFrameList.append(dataSmallFrame)
def changedatafield_attack_sensro(self, id, exist_time, basicType): # 不知道传感器的攻击可以选择到什么粒度,也不知道究竟可以制造哪种类型的攻击呢? # 这几者都是暂时未知的 # 实际上,sensor的修改尺度是由attackType决定的,这是一个复杂的攻击配置变量 # 这二者的名字是一样的?但是攻击类型是否需要相同呢?暂时是未知的 self.get_rule(" ") document_name = "changedatafield_attack_test.csv" # 从源数据中提取重放数据 begin_time = random.random() begin_time = self.sourceDataSnippet.shape[0] * (2 / 3) * begin_time begin_time = self.sourceDataSnippet.iloc[round(begin_time)]['time'] tmp_origin_data = self.sourceDataSnippet end_time = exist_time + begin_time # 首先得到目标列表,存放的是Rule Class的类 tmp_rule_list = self.myRuleMap.getTargetCanIdRule(id) final_rule_list = [] for item in tmp_rule_list: if item.type_of_class == 1: final_rule_list.append(item) # 存储好我们接下来要操作的类即可,这种操作是某种程度 to some extent 合理的 # 这里就随便选几个规则,都改一改 for i in range(0, self.sourceDataSnippet.shape[0]): if tmp_origin_data.iloc[i]['time'] >= begin_time and tmp_origin_data.iloc[i]['time'] <= end_time \ and tmp_origin_data.iloc[i]['can_id'] == id: # 正式进入random环节 # 从前半部分直接random到后半部分 random_num = round(random.random() * (len(final_rule_list) - 1)) # 取到这个值即可 ruleSingle = final_rule_list[random_num] random_begin_bit = int(ruleSingle.begin_loc) length_of_bit = int(ruleSingle.length) random_end_bit = int(ruleSingle.end_loc) val_range = ruleSingle.range # 接下来对传感器的change是严格的,在某种程度上是严格的 target_binary_bit = tmp_origin_data.iloc[i]['data_in_binary'] descriptionTmp = "This is sensor value changing " # 这里居然使用的是硬编码,将来是很有可能出现问题的 if basicType == 0: descriptionTmp = descriptionTmp + " max-value change " elif basicType == 1: descriptionTmp = descriptionTmp + " min-value change " elif basicType == 2: descriptionTmp = descriptionTmp + " random-value change " elif basicType == 3: descriptionTmp = descriptionTmp + " apt advanced change " descriptionTmp = "before binary is " + target_binary_bit[ random_begin_bit:random_end_bit + 1] target_binary_bit = list(target_binary_bit) # 以下是攻击的核心内容,根据不同的type,制造不同类型的攻击 # 想要实现多态攻击,这里的粒度还暂时不够 if basicType == 2: # 不一定在传感器取值范围 for love in range(random_begin_bit, random_end_bit + 1): if (random.random() > 0.5): target_binary_bit[love] = '0' else: target_binary_bit[love] = '1' elif basicType == 0: for love in range(random_begin_bit, random_end_bit + 1): target_binary_bit[love] = '1' elif basicType == 1: for love in range(random_begin_bit, random_end_bit + 1): target_binary_bit[love] = '0' target_binary_bit = "".join(target_binary_bit) descriptionTmp = descriptionTmp + " end binary is " + target_binary_bit[ random_begin_bit:random_end_bit + 1] tmp_origin_data.loc[i, 'data_in_binary'] = target_binary_bit tmp_origin_data.loc[i, 'data_in_hex'] = binary_str_to_hex_str( target_binary_bit) tmp_origin_data.loc[i, 'anormal'] = 7 hex_data = binary_str_to_hex_str(target_binary_bit) for peace in range(0, 8): tmp_origin_data.loc[i, 'data' + str(peace)] = hex_data[2 * peace:2 * peace + 2] df3 = tmp_origin_data.iloc[i] self.descriptionStruct.updateBasicInformation( 7, df3['can_id'], df3['time'], descriptionTmp, df3['data_in_binary']) self.store_place = "../src/attack_test" document_name = document_name + str(begin_time) + "_" + str( self.input_num) + ".csv" if not os.path.exists(self.store_place): os.mkdir(self.store_place) tmp_origin_data.to_csv(self.store_place + "/" + document_name) self.descriptionStruct.writeIntoCsv() return
def changedatafield_attack_const_or_multivalue(self, id, exist_time): # 这二者的名字是一样的?但是攻击类型是否需要相同呢?暂时是未知的 self.get_rule(" ") document_name = "changedatafield_attack_test.csv" # 从源数据中提取重放数据 begin_time = random.random() begin_time = self.sourceDataSnippet.shape[0] * (2 / 3) * begin_time begin_time = self.sourceDataSnippet.iloc[round(begin_time)]['time'] tmp_origin_data = self.sourceDataSnippet end_time = exist_time + begin_time # 首先得到目标列表,存放的是Rule Class的类 tmp_rule_list = self.myRuleMap.getTargetCanIdRule(id) final_rule_list = [] for item in tmp_rule_list: if item.type_of_class == 2 or item.type_of_class == 4: final_rule_list.append(item) # 存储好我们接下来要操作的类即可,这种操作是某种程度 to some extent 合理的 # 这里就随便选几个规则,都改一改 for i in range(0, self.sourceDataSnippet.shape[0]): if tmp_origin_data.iloc[i]['time'] >= begin_time and tmp_origin_data.iloc[i]['time'] <= end_time \ and tmp_origin_data.iloc[i]['can_id'] == id: # 正式进入random环节 # 从前半部分直接random到后半部分 print("successfully") random_num = round(random.random() * (len(final_rule_list) - 1)) # 取到这个值即可 ruleSingle = final_rule_list[random_num] random_begin_bit = ruleSingle.begin_loc length_of_bit = ruleSingle.length random_end_bit = ruleSingle.end_loc val_range = ruleSingle.range target_binary_bit = tmp_origin_data.iloc[i]['data_in_binary'] descriptionTmp = "" if ruleSingle.type_of_class == 2: descriptionTmp = descriptionTmp + "This is a const value: " else: # multi表示有很多个数值,处理过程是合理的 descriptionTmp = descriptionTmp + "This is a multi value: " descriptionTmp = "before binary is " + target_binary_bit[ random_begin_bit:random_end_bit + 1] target_binary_bit = list(target_binary_bit) for love in range(random_begin_bit, random_end_bit + 1): if (random.random() > 0.5): target_binary_bit[love] = '0' else: target_binary_bit[love] = '1' target_binary_bit = "".join(target_binary_bit) descriptionTmp = descriptionTmp + " end binary is " + target_binary_bit[ random_begin_bit:random_end_bit + 1] tmp_origin_data.loc[i, 'data_in_binary'] = target_binary_bit tmp_origin_data.loc[i, 'data_in_hex'] = binary_str_to_hex_str( target_binary_bit) tmp_origin_data.loc[i, 'anormal'] = 6 hex_data = binary_str_to_hex_str(target_binary_bit) for peace in range(0, 8): tmp_origin_data.loc[i, 'data' + str(peace)] = hex_data[2 * peace:2 * peace + 2] df3 = tmp_origin_data.iloc[i] self.descriptionStruct.updateBasicInformation( 6, df3['can_id'], df3['time'], descriptionTmp, df3['data_in_binary']) self.store_place = "../src/attack_test" document_name = document_name + str(begin_time) + "_" + str( self.input_num) + ".csv" if not os.path.exists(self.store_place): os.mkdir(self.store_place) tmp_origin_data.to_csv(self.store_place + "/" + document_name) self.descriptionStruct.writeIntoCsv()
def changedatafield_attack(self, id, attackType, exist_time): # 这种数据域攻击主要有两种: # 一种是使用将某个字段设置为最大or最小常量 # 另一种是历史序列重放,可以认为是变种重返攻击 # doc path是完全不需要的 # 只对某种报文进行数据域修改,description也是暂时不需要的,应该是的吧 self.get_rule(" ") ''' 新的tag标志 checksum_tag = 0 sensor_tag = 1 const_tag = 2 counter_tag = 3 multi_value_tag = 4 no_meaning_tag = 5 攻击的mod: 以下的mod如何决定呢?暂时是不清楚的哦 const_attack: yes or no multi_value_atack: 统一修改为第i个数值,这里i的生成方式可以固定,也可以随机 counter_attack: +1 +2 +3 修改数值即可 sensor_attack: max-value, min-value, any-value ''' # 这里是统一的文件输入位置,可以考虑加一个函数load document_name = "changedatafield_attack_test.csv" # 在这里需要设定一系列参数的 # exist_time = 0.5 # 修改在0.5s内的所有数据 # 从源数据中提取重放数据 begin_time = random.random() # 这里标记的是begin的行 begin_time = self.historyNormalDataSnippet.shape[0] * (2 / 3) * begin_time begin_time = self.historyNormalDataSnippet.iloc[round( begin_time)]['time'] tmp_origin_data = self.historyNormalDataSnippet end_time = exist_time + begin_time for i in range(0, self.origin_data.shape[0]): # 进行按行访问 if tmp_origin_data.iloc[i][ 'time'] >= begin_time and tmp_origin_data.iloc[i][ 'time'] <= end_time: if tmp_origin_data.iloc[i]['can_id'] == id: tmp_str = tmp_origin_data.iloc[i]['data_in_binary'] # 这里显然是不太舒服的,我真的是直接裂开了 res_str = self.change_data_field( tmp_str, attackType) # 进行了某种级别的攻击,这里需要先定义接口,再进行不同种类的攻击书写 tmp_origin_data.iloc[i, 2] = res_str tmp_origin_data.iloc[i, 2] = binary_str_to_hex_str(res_str) # 下面的存储操作是完全类似的,是可以封装为函数的部分 self.store_place = "../src/attack_test" document_name = document_name + str(begin_time) + "_" + str( self.input_num) + ".csv" if not os.path.exists(self.store_place): os.mkdir(self.store_place) tmp_origin_data.to_csv(self.store_place + "/" + document_name) return None