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
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
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
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
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
def check_candidate(self, candidate): if not equal_bnot_mop(candidate["x_0"].mop, candidate["bnot_x_0"].mop): return False return True
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
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
def check_candidate(self, candidate): return equal_bnot_mop(candidate["x_1"].mop, candidate["bnot_x_1"].mop)