diff options
| -rw-r--r-- | example/ida/symbol_exec.py | 3 | ||||
| -rw-r--r-- | miasm2/expression/expression_helper.py | 23 | ||||
| -rw-r--r-- | test/expression/expression_helper.py | 13 |
3 files changed, 29 insertions, 10 deletions
diff --git a/example/ida/symbol_exec.py b/example/ida/symbol_exec.py index b1601cef..c7aff5b5 100644 --- a/example/ida/symbol_exec.py +++ b/example/ida/symbol_exec.py @@ -16,7 +16,8 @@ class symbolicexec_t(idaapi.simplecustviewer_t): def expand(self, linenum): element = self.line2eq[linenum] - expanded = Variables_Identifier(element[1]) + expanded = Variables_Identifier(element[1], + var_prefix="%s_v" % element[0]) self.line2eq = self.line2eq[0:linenum] + \ expanded.vars.items() + \ [(element[0], expanded.equation)] + \ diff --git a/miasm2/expression/expression_helper.py b/miasm2/expression/expression_helper.py index 2f0bd4e7..c94bc353 100644 --- a/miasm2/expression/expression_helper.py +++ b/miasm2/expression/expression_helper.py @@ -17,7 +17,6 @@ # # Expressions manipulation functions -import re import itertools import collections import random @@ -210,16 +209,20 @@ class Variables_Identifier(object): - original expression with variables translated """ - var_identifier = re.compile("v\d+") + # Attribute used to distinguish created variables from original ones + is_var_ident = "is_var_ident" - def __init__(self, expr): + def __init__(self, expr, var_prefix="v"): """Set the expression @expr to handle and launch variable identification - process""" + process + @expr: Expr instance + @var_prefix: (optional) prefix of the variable name, default is 'v'""" # Init self.var_indice = itertools.count() self.var_asked = set() self._vars = {} # VarID -> Expr + self.var_prefix = var_prefix # Launch recurrence self.find_variables_rec(expr) @@ -282,12 +285,12 @@ class Variables_Identifier(object): @classmethod def is_var_identifier(cls, expr): - "Return True iff expr seems to be a variable identifier" + "Return True iff @expr is a variable identifier" if not isinstance(expr, m2_expr.ExprId): return False - match = cls.var_identifier.match(expr.name) - return match is not None and match.group(0) == expr.name + return hasattr(expr, cls.is_var_ident) and \ + getattr(expr, cls.is_var_ident) == True def find_variables_rec(self, expr): """Recursive method called by find_variable to expand @expr. @@ -301,8 +304,10 @@ class Variables_Identifier(object): if (expr not in self._vars.values()): # Create var - identifier = m2_expr.ExprId("v%s" % self.var_indice.next(), - size = expr.size) + identifier = m2_expr.ExprId("%s%s" % (self.var_prefix, + self.var_indice.next()), + size = expr.size) + setattr(identifier, self.__class__.is_var_ident, True) self._vars[identifier] = expr # Recursion stop case diff --git a/test/expression/expression_helper.py b/test/expression/expression_helper.py index 3ff6f5da..e1674fdc 100644 --- a/test/expression/expression_helper.py +++ b/test/expression/expression_helper.py @@ -35,6 +35,19 @@ class TestExpressionExpressionHelper(unittest.TestCase): new_expr = new_expr.replace_expr({var_id: var_value}) self.assertEqual(exprf, new_expr) + # Test prefix + vi = Variables_Identifier(exprf, var_prefix="prefix_v") + + # Use __str__ + print vi + + # Test the result + new_expr = vi.equation + ## Force replace in the variable dependency order + for var_id, var_value in reversed(vi.vars.items()): + new_expr = new_expr.replace_expr({var_id: var_value}) + self.assertEqual(exprf, new_expr) + if __name__ == '__main__': testcase = TestExpressionExpressionHelper testsuite = unittest.TestLoader().loadTestsFromTestCase(testcase) |