Esempio n. 1
0
    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()
Esempio n. 2
0
    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)
Esempio n. 3
0
    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
Esempio n. 4
0
    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()
Esempio n. 5
0
    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