Miasm2
 All Classes Namespaces Files Functions Variables Typedefs Properties Macros
python.py
Go to the documentation of this file.
1 from miasm2.ir.translators.translator import Translator
2 
3 
5  """Translate a Miasm expression to an equivalent Python code
6 
7  Memory is abstracted using the unimplemented function:
8  int memory(int address, int size)
9  """
10 
11  # Implemented language
12  __LANG__ = "Python"
13  # Operations translation
14  op_no_translate = ["+", "-", "/", "%", ">>", "<<", "&", "^", "|", "*"]
15 
16  def from_ExprInt(self, expr):
17  return str(expr)
18 
19  def from_ExprId(self, expr):
20  return str(expr)
21 
22  def from_ExprMem(self, expr):
23  return "memory(%s, 0x%x)" % (self.from_expr(expr.arg),
24  expr.size / 8)
25 
26  def from_ExprSlice(self, expr):
27  out = self.from_expr(expr.arg)
28  if expr.start != 0:
29  out = "(%s >> %d)" % (out, expr.start)
30  return "(%s & 0x%x)" % (out, (1 << (expr.stop - expr.start)) - 1)
31 
32  def from_ExprCompose(self, expr):
33  out = []
34  for subexpr, start, stop in expr.args:
35  out.append("((%s & 0x%x) << %d)" % (self.from_expr(subexpr),
36  (1 << (stop - start)) - 1,
37  start))
38  return "(%s)" % ' | '.join(out)
39 
40  def from_ExprCond(self, expr):
41  return "(%s if (%s) else %s)" % (self.from_expr(expr.src1),
42  self.from_expr(expr.cond),
43  self.from_expr(expr.src2))
44 
45  def from_ExprOp(self, expr):
46  if expr.op in self.op_no_translate:
47  args = map(self.from_expr, expr.args)
48  if len(expr.args) == 1:
49  return "((%s %s) & 0x%x)" % (expr.op,
50  args[0],
51  (1 << expr.size) - 1)
52  else:
53  return "((%s) & 0x%x)" % ((" %s " % expr.op).join(args),
54  (1 << expr.size) - 1)
55  elif expr.op == "parity":
56  return "(%s & 0x1)" % self.from_expr(expr.args[0])
57 
58  raise NotImplementedError("Unknown operator: %s" % expr.op)
59 
60  def from_ExprAff(self, expr):
61  return "%s = %s" % tuple(map(self.from_expr, (expr.dst, expr.src)))
62 
63 
64 # Register the class
65 Translator.register(TranslatorPython)