diff options
Diffstat (limited to 'miasm2/ir')
| -rw-r--r-- | miasm2/ir/ir.py | 31 | ||||
| -rw-r--r-- | miasm2/ir/symbexec.py | 4 | ||||
| -rw-r--r-- | miasm2/ir/symbexec_top.py | 2 | ||||
| -rw-r--r-- | miasm2/ir/translators/C.py | 2 | ||||
| -rw-r--r-- | miasm2/ir/translators/smt2.py | 13 | ||||
| -rw-r--r-- | miasm2/ir/translators/z3_ir.py | 5 |
6 files changed, 28 insertions, 29 deletions
diff --git a/miasm2/ir/ir.py b/miasm2/ir/ir.py index 234be181..8ee35ed5 100644 --- a/miasm2/ir/ir.py +++ b/miasm2/ir/ir.py @@ -357,7 +357,7 @@ class IRBlock(object): def __str__(self): out = [] - out.append('loc_key_%s' % self.loc_key.key) + out.append(str(self.loc_key)) for assignblk in self: for dst, src in assignblk.iteritems(): out.append('\t%s = %s' % (dst, src)) @@ -416,14 +416,23 @@ class DiGraphIR(DiGraph): if self.loc_db is None: name = str(expr) else: - name = self.loc_db.loc_key_to_name(expr.loc_key) + names = self.loc_db.get_location_names(expr.loc_key) + if not names: + name = self.loc_db.pretty_str(expr.loc_key) + else: + # Use only one name for readability + name = sorted(names)[0] return m2_expr.ExprId(name, expr.size) def node2lines(self, node): if self.loc_db is None: node_name = str(node) else: - node_name = self.loc_db.loc_key_to_name(node) + names = self.loc_db.get_location_names(node) + if not names: + node_name = self.loc_db.pretty_str(node) + else: + node_name = "".join("%s:\n" % name for name in names) yield self.DotCellDescription( text="%s" % node_name, attr={ @@ -530,7 +539,7 @@ class IntermediateRepresentation(object): except (ValueError, TypeError): return None - return self.loc_db.getby_offset_create(addr) + return self.loc_db.get_or_create_offset_location(addr) def get_block(self, addr): """Returns the irbloc associated to an ExprId/ExprInt/loc_key/int @@ -551,7 +560,7 @@ class IntermediateRepresentation(object): def add_instr(self, line, loc_key=None, gen_pc_updt=False): if loc_key is None: - loc_key = self.loc_db.gen_loc_key() + loc_key = self.loc_db.add_location() block = AsmBlock(loc_key) block.lines = [line] self.add_block(block, gen_pc_updt) @@ -687,9 +696,9 @@ class IntermediateRepresentation(object): if block.lines: line = block.lines[-1] if line.offset is not None: - loc_key = self.loc_db.getby_offset_create(line.offset + line.l) + loc_key = self.loc_db.get_or_create_offset_location(line.offset + line.l) if loc_key is None: - loc_key = self.loc_db.gen_loc_key() + loc_key = self.loc_db.add_location() block.add_cst(loc_key, AsmConstraint.c_next) else: loc_key = next_loc_key @@ -724,18 +733,18 @@ class IntermediateRepresentation(object): def get_loc_key_for_instr(self, instr): """Returns the loc_key associated to an instruction @instr: current instruction""" - return self.loc_db.getby_offset_create(instr.offset) + return self.loc_db.get_or_create_offset_location(instr.offset) def gen_loc_key_and_expr(self, size): """ Return a loc_key and it's corresponding ExprLoc @size: size of expression """ - loc_key = self.loc_db.gen_loc_key() + loc_key = self.loc_db.add_location() return loc_key, m2_expr.ExprLoc(loc_key, size) def get_next_loc_key(self, instr): - loc_key = self.loc_db.getby_offset_create(instr.offset + instr.l) + loc_key = self.loc_db.get_or_create_offset_location(instr.offset + instr.l) return loc_key def simplify(self, simplifier): @@ -825,7 +834,7 @@ class IntermediateRepresentation(object): self._graph.add_node(lbl) for dst in self.dst_trackback(block): if dst.is_int(): - dst_lbl = self.loc_db.getby_offset_create(int(dst)) + dst_lbl = self.loc_db.get_or_create_offset_location(int(dst)) dst = m2_expr.ExprLoc(dst_lbl.loc_key, self.pc.size) if dst.is_loc(): self._graph.add_edge(lbl, dst.loc_key) diff --git a/miasm2/ir/symbexec.py b/miasm2/ir/symbexec.py index 09113311..288a46e4 100644 --- a/miasm2/ir/symbexec.py +++ b/miasm2/ir/symbexec.py @@ -19,7 +19,7 @@ def get_block(ir_arch, mdis, addr): """Get IRBlock at address @addr""" lbl = ir_arch.get_loc_key(addr) if not lbl in ir_arch.blocks: - offset = mdis.loc_db.loc_key_to_offset(lbl) + offset = mdis.loc_db.get_location_offset(lbl) block = mdis.dis_block(offset) ir_arch.add_block(block) irblock = ir_arch.get_block(lbl) @@ -892,7 +892,7 @@ class SymbolicExecutionEngine(object): def eval_exprloc(self, expr, **kwargs): """[DEV]: Evaluate an ExprLoc using the current state""" - offset = self.ir_arch.loc_db.loc_key_to_offset(expr.loc_key) + offset = self.ir_arch.loc_db.get_location_offset(expr.loc_key) if offset is not None: ret = ExprInt(offset, expr.size) else: diff --git a/miasm2/ir/symbexec_top.py b/miasm2/ir/symbexec_top.py index e0976c9b..5fe12996 100644 --- a/miasm2/ir/symbexec_top.py +++ b/miasm2/ir/symbexec_top.py @@ -128,7 +128,7 @@ class SymbExecTopNoMem(SymbolicExecutionEngine): return ret def eval_exprloc(self, expr, **kwargs): - offset = self.ir_arch.loc_db.loc_key_to_offset(expr.loc_key) + offset = self.ir_arch.loc_db.get_location_offset(expr.loc_key) if offset is not None: ret = ExprInt(offset, expr.size) else: diff --git a/miasm2/ir/translators/C.py b/miasm2/ir/translators/C.py index 28222803..cafec7c8 100644 --- a/miasm2/ir/translators/C.py +++ b/miasm2/ir/translators/C.py @@ -55,7 +55,7 @@ class TranslatorC(Translator): if self.loc_db is None: return str(loc_key) - offset = self.loc_db.loc_key_to_offset(loc_key) + offset = self.loc_db.get_location_offset(loc_key) if offset is None: return str(loc_key) diff --git a/miasm2/ir/translators/smt2.py b/miasm2/ir/translators/smt2.py index f5e69163..1a513bfb 100644 --- a/miasm2/ir/translators/smt2.py +++ b/miasm2/ir/translators/smt2.py @@ -141,20 +141,13 @@ class TranslatorSMT2(Translator): def from_ExprLoc(self, expr): loc_key = expr.loc_key - if self.loc_db is None: + if self.loc_db is None or self.loc_db.get_location_offset(loc_key) is None: if str(loc_key) not in self._bitvectors: self._bitvectors[str(loc_key)] = expr.size return str(loc_key) - offset = self.loc_db.loc_key_to_offset(loc_key) - name = self.loc_db.loc_key_to_name(loc_key) - - if offset is None: - return bit_vec_val(str(offset), expr.size) - name = "|{}|".format(str(name)) - if name not in self._bitvectors: - self._bitvectors[name] = expr.size - return name + offset = self.loc_db.get_location_offset(loc_key) + return bit_vec_val(str(offset), expr.size) def from_ExprMem(self, expr): addr = self.from_expr(expr.arg) diff --git a/miasm2/ir/translators/z3_ir.py b/miasm2/ir/translators/z3_ir.py index bfb29d06..887c68d0 100644 --- a/miasm2/ir/translators/z3_ir.py +++ b/miasm2/ir/translators/z3_ir.py @@ -138,12 +138,9 @@ class TranslatorZ3(Translator): # No loc_db, fallback to default name return z3.BitVec(str(expr), expr.size) loc_key = expr.loc_key - offset = self.loc_db.loc_key_to_offset(loc_key) - name = self.loc_db.loc_key_to_name(loc_key) + offset = self.loc_db.get_location_offset(loc_key) if offset is not None: return z3.BitVecVal(offset, expr.size) - if name is not None: - return z3.BitVec(name, expr.size) # fallback to default name return z3.BitVec(str(loc_key), expr.size) |