Esempio n. 1
0
 def check_candidate(self, candidate):
     if not is_check_mop(candidate["x_0"].mop):
         return False
     if candidate["c_1"].value & 0x1 != 1:
         return False
     if not equal_bnot_mop(candidate["c_1"].mop, candidate["bnot_c_1"].mop):
         return False
     if not equal_bnot_mop(candidate["x_0"].mop, candidate["bnot_x_0"].mop):
         return False
     return True
Esempio n. 2
0
    def check_bnot_mop(self, add_non_cst_mop_list, sub_non_cst_mop_list):
        add_index_removed = []
        sub_index_removed = []
        cst_value = 0
        final_add_non_cst_mop_list = add_non_cst_mop_list
        final_sub_non_cst_mop_list = sub_non_cst_mop_list
        add_size_list = [c.size for c in add_non_cst_mop_list]
        sub_size_list = [c.size for c in sub_non_cst_mop_list]
        final_cst_size = max(add_size_list + sub_size_list)

        for i in range(len(add_non_cst_mop_list)):
            for j in range(i + 1, len(add_non_cst_mop_list)):
                if (i not in add_index_removed) and (j
                                                     not in add_index_removed):
                    if equal_bnot_mop(add_non_cst_mop_list[i],
                                      add_non_cst_mop_list[j]):
                        cst_value += AND_TABLE[add_non_cst_mop_list[i].size]
                        add_index_removed += [i, j]

        for i in range(len(sub_non_cst_mop_list)):
            for j in range(i + 1, len(sub_non_cst_mop_list)):
                if (i not in sub_index_removed) and (j
                                                     not in sub_index_removed):
                    if equal_bnot_mop(sub_non_cst_mop_list[i],
                                      sub_non_cst_mop_list[j]):
                        cst_value += 1
                        sub_index_removed += [i, j]

        final_add_cst_mop = mop_t()
        final_add_cst_mop.make_number(cst_value & AND_TABLE[final_cst_size],
                                      final_cst_size)

        if len(add_index_removed) > 0:
            final_add_non_cst_mop_list = []
            self._is_instruction_simplified = True
            for i in range(len(add_non_cst_mop_list)):
                if i not in add_index_removed:
                    final_add_non_cst_mop_list.append(add_non_cst_mop_list[i])
        if len(sub_index_removed) > 0:
            final_sub_non_cst_mop_list = []
            self._is_instruction_simplified = True
            for i in range(len(sub_non_cst_mop_list)):
                if i not in sub_index_removed:
                    final_sub_non_cst_mop_list.append(sub_non_cst_mop_list[i])
        return final_add_non_cst_mop_list, final_sub_non_cst_mop_list, final_add_cst_mop
Esempio n. 3
0
 def check_candidate(self, opcode, left_candidate, right_candidate):
     if not equal_mops_bypass_xdu(left_candidate["xdu_x_0"].mop,
                                  left_candidate["x_0"].mop):
         return False
     if not equal_bnot_mop(left_candidate["c_2"].mop,
                           left_candidate["c_1"].mop):
         return False
     self.jump_replacement_block_serial = self.jump_original_block_serial
     return True
Esempio n. 4
0
 def check_candidate(self, candidate):
     if not equal_bnot_mop(candidate["x_0"].mop, candidate["bnot_x_0"].mop):
         return False
     if candidate["c_and_1"].value & candidate["c_and_2"].value != 0:
         return False
     candidate.add_constant_leaf(
         "c_and_res",
         candidate["c_and_1"].value ^ candidate["c_and_2"].value,
         candidate["c_and_1"].size)
     candidate.add_constant_leaf(
         "c_xor_res", candidate["c_and_1"].value ^ candidate["c_xor"].value,
         candidate["c_and_1"].size)
     return True
Esempio n. 5
0
    def get_simplified_non_constant(self):
        if len(self.non_cst_mop_list) == 0:
            return []
        elif len(self.non_cst_mop_list) == 1:
            return self.non_cst_mop_list
        else:
            is_always_0 = False
            index_removed = []
            for i in range(len(self.non_cst_mop_list)):
                for j in range(i + 1, len(self.non_cst_mop_list)):
                    if (i not in index_removed) and (j not in index_removed):
                        if equal_mops_ignore_size(self.non_cst_mop_list[i],
                                                  self.non_cst_mop_list[j]):
                            if self.opcode == m_xor:
                                # x ^ x == 0
                                rules_chain_logger.debug(
                                    "Doing non cst simplification (xor): {0}, {1} in {2}"
                                    .format(i, j, self.formatted_ins))
                                index_removed += [i, j]
                            elif self.opcode == m_and:
                                # x & x == x
                                rules_chain_logger.debug(
                                    "Doing non cst simplification (and): {0}, {1} in {2}"
                                    .format(i, j, self.formatted_ins))
                                index_removed += [j]
                            elif self.opcode == m_or:
                                # x | x == x
                                rules_chain_logger.debug(
                                    "Doing non cst simplification (or): {0}, {1} in {2}"
                                    .format(i, j, self.formatted_ins))
                                index_removed += [j]
                        elif equal_bnot_mop(self.non_cst_mop_list[i],
                                            self.non_cst_mop_list[j]):
                            if self.opcode == m_and:
                                is_always_0 = True

            if len(index_removed) == 0 and not is_always_0:
                return self.non_cst_mop_list
            final_mop_list = []
            self._is_instruction_simplified = True
            if is_always_0:
                final_mop_list.append(self.create_cst_mop(
                    0, self.res_mop_size))
                return final_mop_list
            for i in range(len(self.non_cst_mop_list)):
                if i not in index_removed:
                    final_mop_list.append(self.non_cst_mop_list[i])
            return final_mop_list
Esempio n. 6
0
 def check_candidate(self, candidate):
     if not equal_bnot_mop(candidate["x_0"].mop, candidate["bnot_x_0"].mop):
         return False
     return True
Esempio n. 7
0
 def check_candidate(self, candidate):
     if not equal_bnot_mop(candidate["x_1"].mop, candidate["bnot_x_1"].mop):
         return False
     candidate.add_constant_leaf("val_1", 1, candidate["x_0"].size)
     return True
Esempio n. 8
0
 def check_candidate(self, candidate):
     if not equal_bnot_mop(candidate["c_1"].mop, candidate["c_2"].mop):
         return False
     candidate.add_constant_leaf("val_res", candidate["c_2"].value - 1, candidate["x_0"].size)
     return True
Esempio n. 9
0
 def check_candidate(self, candidate):
     return equal_bnot_mop(candidate["x_1"].mop, candidate["bnot_x_1"].mop)