Miasm2
 All Classes Namespaces Files Functions Variables Typedefs Properties Macros
ira.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 
4 from miasm2.expression.expression import ExprAff, ExprOp, ExprId
5 from miasm2.core.graph import DiGraph
6 from miasm2.ir.ir import ir, irbloc
7 from miasm2.ir.analysis import ira
8 from miasm2.arch.x86.sem import ir_x86_16, ir_x86_32, ir_x86_64
9 
10 
12 
13  def __init__(self, symbol_pool=None):
14  ir_x86_16.__init__(self, symbol_pool)
15  self.ret_reg = self.arch.regs.AX
16 
17  # for test XXX TODO
18  def set_dead_regs(self, b):
19  b.rw[-1][1].add(self.arch.regs.zf)
20  b.rw[-1][1].add(self.arch.regs.of)
21  b.rw[-1][1].add(self.arch.regs.pf)
22  b.rw[-1][1].add(self.arch.regs.cf)
23  b.rw[-1][1].add(self.arch.regs.nf)
24  b.rw[-1][1].add(self.arch.regs.af)
25 
26  def get_out_regs(self, b):
27  return set([self.ret_reg, self.sp])
28 
29  def add_unused_regs(self):
30  leaves = [self.blocs[n] for n in self.g.leafs()]
31  for b in leaves:
32  self.set_dead_regs(b)
33 
34  def call_effects(self, ad):
35  irs = [[ExprAff(self.ret_reg, ExprOp('call_func_ret', ad, self.sp)),
36  ExprAff(self.sp, ExprOp('call_func_stack', ad, self.sp)),
37  ]]
38  return irs
39 
40  def post_add_bloc(self, bloc, ir_blocs):
41  ir.post_add_bloc(self, bloc, ir_blocs)
42  if not bloc.lines:
43  return
44  l = bloc.lines[-1]
45  sub_call_dst = None
46  if not l.is_subcall():
47  return
48  sub_call_dst = l.args[0]
49  if self.ExprIsLabel(sub_call_dst):
50  sub_call_dst = sub_call_dst.name
51  for b in ir_blocs:
52  l = b.lines[-1]
53  sub_call_dst = None
54  if not l.is_subcall():
55  continue
56  sub_call_dst = l.args[0]
57  if self.ExprIsLabel(sub_call_dst):
58  sub_call_dst = sub_call_dst.name
59  lbl = bloc.get_next()
60  new_lbl = self.gen_label()
61  irs = self.call_effects(l.args[0])
62  irs.append([ExprAff(self.IRDst, ExprId(lbl, size=self.pc.size))])
63 
64  nbloc = irbloc(new_lbl, irs)
65  nbloc.lines = [l]
66  self.blocs[new_lbl] = nbloc
67  b.dst = ExprId(new_lbl, size=self.pc.size)
68  return
69 
70 
72 
73  def __init__(self, symbol_pool=None):
74  ir_x86_32.__init__(self, symbol_pool)
75  self.ret_reg = self.arch.regs.EAX
76 
77  def sizeof_char(self):
78  return 8
79 
80  def sizeof_short(self):
81  return 16
82 
83  def sizeof_int(self):
84  return 32
85 
86  def sizeof_long(self):
87  return 32
88 
89  def sizeof_pointer(self):
90  return 32
91 
92 
94 
95  def __init__(self, symbol_pool=None):
96  ir_x86_64.__init__(self, symbol_pool)
97  self.ret_reg = self.arch.regs.RAX
98 
99  def call_effects(self, ad):
100  irs = [[ExprAff(self.ret_reg, ExprOp('call_func_ret', ad, self.sp,
101  self.arch.regs.RCX,
102  self.arch.regs.RDX,
103  self.arch.regs.R8,
104  self.arch.regs.R9,
105  )),
106  ExprAff(self.sp, ExprOp('call_func_stack', ad, self.sp)),
107  ]]
108  return irs
109 
110  def sizeof_char(self):
111  return 8
112 
113  def sizeof_short(self):
114  return 16
115 
116  def sizeof_int(self):
117  return 32
118 
119  def sizeof_long(self):
120  return 64
121 
122  def sizeof_pointer(self):
123  return 64
def ExprIsLabel
Definition: ir.py:337
def gen_label
Definition: ir.py:309