From 33189681bf13f88a1e39383a86079fc001ec619d Mon Sep 17 00:00:00 2001 From: Camille Mougey Date: Tue, 10 Feb 2015 09:57:50 +0100 Subject: VariableIdentifier: Less hacky way to identify sub vars, add a prefix feature --- test/expression/expression_helper.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'test/expression/expression_helper.py') 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) -- cgit 1.4.1 From 388b74c92f518584e0351af894588d90a48624ce Mon Sep 17 00:00:00 2001 From: Camille Mougey Date: Tue, 10 Feb 2015 10:53:38 +0100 Subject: VariablesIdentifier: Handle corner cases (using var ident on already computed eq) --- miasm2/expression/expression_helper.py | 7 +++++-- test/expression/expression_helper.py | 37 +++++++++++++++++++++++++++++++--- 2 files changed, 39 insertions(+), 5 deletions(-) (limited to 'test/expression/expression_helper.py') diff --git a/miasm2/expression/expression_helper.py b/miasm2/expression/expression_helper.py index c94bc353..825cad60 100644 --- a/miasm2/expression/expression_helper.py +++ b/miasm2/expression/expression_helper.py @@ -257,9 +257,13 @@ class Variables_Identifier(object): ## Build initial needs for var_id, var_expr in self._vars.iteritems(): + ### Handle corner cases while using Variable Identifier on an + ### already computed equation needs[var_id] = [var_name for var_name in var_expr.get_r(mem_read=True) - if self.is_var_identifier(var_name)] + if self.is_var_identifier(var_name) and \ + var_name in todo and \ + var_name != var_id] ## Build order list while todo: @@ -271,7 +275,6 @@ class Variables_Identifier(object): # A dependency is not met all_met = False break - if not all_met: continue diff --git a/test/expression/expression_helper.py b/test/expression/expression_helper.py index e1674fdc..514a9a51 100644 --- a/test/expression/expression_helper.py +++ b/test/expression/expression_helper.py @@ -30,6 +30,7 @@ class TestExpressionExpressionHelper(unittest.TestCase): # 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}) @@ -38,16 +39,46 @@ class TestExpressionExpressionHelper(unittest.TestCase): # Test prefix vi = Variables_Identifier(exprf, var_prefix="prefix_v") - # Use __str__ + ## Use __str__ print vi - # Test the result + ## Test the result new_expr = vi.equation - ## Force replace in the variable dependency order + ### 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) + # Test an identify on an expression already containing identifier + vi = Variables_Identifier(exprf) + vi2 = Variables_Identifier(vi.equation) + + ## Test the result + new_expr = vi2.equation + ### Force replace in the variable dependency order + for var_id, var_value in reversed(vi2.vars.items()): + new_expr = new_expr.replace_expr({var_id: var_value}) + self.assertEqual(vi.equation, new_expr) + + ## Corner case: each sub var depends on itself + mem1 = m2_expr.ExprMem(ebx, size=32) + mem2 = m2_expr.ExprMem(mem1, size=32) + cst2 = m2_expr.ExprInt32(-1) + expr_mini = ((eax ^ mem2 ^ cst2) & (mem2 ^ (eax + mem2)))[31:32] + + ## Build + vi = Variables_Identifier(expr_mini) + vi2 = Variables_Identifier(vi.equation) + + ## Test the result + new_expr = vi2.equation + ### Force replace in the variable dependency order + for var_id, var_value in reversed(vi2.vars.items()): + new_expr = new_expr.replace_expr({var_id: var_value}) + self.assertEqual(vi.equation, new_expr) + + + if __name__ == '__main__': testcase = TestExpressionExpressionHelper testsuite = unittest.TestLoader().loadTestsFromTestCase(testcase) -- cgit 1.4.1