def movk(ir, instr, arg1, arg2): e = [] if isinstance(arg2, m2_expr.ExprOp): assert (arg2.op == 'slice_at' and isinstance(arg2.args[0], m2_expr.ExprInt) and isinstance(arg2.args[1], m2_expr.ExprInt)) value, shift = int(arg2.args[0].arg), int(arg2.args[1]) e.append( m2_expr.ExprAff(arg1[shift:shift + 16], m2_expr.ExprInt16(value))) else: e.append(m2_expr.ExprAff(arg1[:16], m2_expr.ExprInt16(int(arg2)))) return e, []
def test_Variables_Identifier(self): import miasm2.expression.expression as m2_expr from miasm2.expression.expression_helper import Variables_Identifier # Build a complex expression cst = m2_expr.ExprInt16(0x100) eax = m2_expr.ExprId("EAX") ebx = m2_expr.ExprId("EBX") ax = eax[0:16] expr = eax + ebx expr = m2_expr.ExprCompose([(ax, 0, 16), (expr[16:32], 16, 32)]) expr2 = m2_expr.ExprMem((eax + ebx) ^ (eax), size=16) expr2 = expr2 | ax | expr2 | cst exprf = expr - expr + m2_expr.ExprCompose([(expr2, 0, 16), (cst, 16, 32)]) # Identify variables vi = Variables_Identifier(exprf) # 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)
def lui(ir, instr, a, b): """The immediate value @b is shifted left 16 bits and stored in the register @a. The lower 16 bits are zeroes.""" e = [] e.append(m2_expr.ExprAff(a, m2_expr.ExprCompose([(m2_expr.ExprInt16(0), 0, 16), (b[:16], 16, 32)]))) return e, []
class imm16_noarg(object): int2expr = lambda self, x: m2_expr.ExprInt16(x)
def test_Variables_Identifier(self): import miasm2.expression.expression as m2_expr from miasm2.expression.expression_helper import Variables_Identifier # Build a complex expression cst = m2_expr.ExprInt16(0x100) eax = m2_expr.ExprId("EAX") ebx = m2_expr.ExprId("EBX") ax = eax[0:16] expr = eax + ebx expr = m2_expr.ExprCompose(ax, expr[16:32]) expr2 = m2_expr.ExprMem((eax + ebx) ^ (eax), size=16) expr2 = expr2 | ax | expr2 | cst exprf = expr - expr + m2_expr.ExprCompose(expr2, cst) # Identify variables vi = Variables_Identifier(exprf) # 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) # 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) # 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)