From 68c94736087f2330449d624a08a85dc48a8512e9 Mon Sep 17 00:00:00 2001 From: Boris Batteux Date: Thu, 25 Feb 2021 16:33:56 +0100 Subject: [PATCH] Allow to specific maturities at a instruction simplification rule level --- .../instructions/analysis/pattern_guess.py | 2 ++ d810/optimizers/instructions/handler.py | 12 ++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/d810/optimizers/instructions/analysis/pattern_guess.py b/d810/optimizers/instructions/analysis/pattern_guess.py index 5d879c8..2bcd523 100644 --- a/d810/optimizers/instructions/analysis/pattern_guess.py +++ b/d810/optimizers/instructions/analysis/pattern_guess.py @@ -3,6 +3,7 @@ import os from d810.ast import minsn_to_ast from d810.hexrays_formatters import format_minsn_t, format_mop_t, maturity_to_string +from d810.optimizers.handler import DEFAULT_INSTRUCTION_MATURITIES from d810.optimizers.instructions.analysis.handler import InstructionAnalysisRule from d810.optimizers.instructions.analysis.utils import get_possible_patterns @@ -12,6 +13,7 @@ class ExampleGuessingRule(InstructionAnalysisRule): def __init__(self): super().__init__() + self.maturities = DEFAULT_INSTRUCTION_MATURITIES self.cur_maturity = None self.min_nb_var = 1 self.max_nb_var = 3 diff --git a/d810/optimizers/instructions/handler.py b/d810/optimizers/instructions/handler.py index 6220934..19a05e0 100644 --- a/d810/optimizers/instructions/handler.py +++ b/d810/optimizers/instructions/handler.py @@ -3,7 +3,7 @@ import logging from typing import List from ida_hexrays import * -from d810.optimizers.handler import OptimizationRule, DEFAULT_INSTRUCTION_MATURITIES +from d810.optimizers.handler import OptimizationRule from d810.hexrays_formatters import format_minsn_t from d810.ast import minsn_to_ast, AstNode from d810.errors import D810Exception @@ -16,7 +16,7 @@ optimizer_logger = logging.getLogger('D810.optimizer') class InstructionOptimizationRule(OptimizationRule): def __init__(self): super().__init__() - self.maturities = DEFAULT_INSTRUCTION_MATURITIES + self.maturities = [] def check_and_replace(self, blk, ins): return None @@ -97,6 +97,8 @@ class InstructionOptimizer(object): if not is_valid_rule_class: return False optimizer_logger.debug("Adding rule {0}".format(rule)) + if len(rule.maturities) == 0: + rule.maturities = self.maturities self.rules.add(rule) self.rules_usage_info[rule.name] = 0 return True @@ -114,9 +116,11 @@ class InstructionOptimizer(object): def get_optimized_instruction(self, blk: mblock_t, ins: minsn_t): if blk is not None: self.cur_maturity = blk.mba.maturity - if self.cur_maturity not in self.maturities: - return None + # if self.cur_maturity not in self.maturities: + # return None for rule in self.rules: + if self.cur_maturity not in rule.maturities: + continue try: new_ins = rule.check_and_replace(blk, ins) if new_ins is not None: