diff options
Diffstat (limited to 'miasm/core')
| -rw-r--r-- | miasm/core/asmblock.py | 7 | ||||
| -rw-r--r-- | miasm/core/bin_stream.py | 2 | ||||
| -rw-r--r-- | miasm/core/cpu.py | 9 | ||||
| -rw-r--r-- | miasm/core/graph.py | 43 | ||||
| -rw-r--r-- | miasm/core/objc.py | 5 | ||||
| -rw-r--r-- | miasm/core/parse_asm.py | 4 | ||||
| -rw-r--r-- | miasm/core/utils.py | 12 |
7 files changed, 65 insertions, 17 deletions
diff --git a/miasm/core/asmblock.py b/miasm/core/asmblock.py index 8f47947f..93ad6b13 100644 --- a/miasm/core/asmblock.py +++ b/miasm/core/asmblock.py @@ -628,6 +628,7 @@ class AsmCFG(DiGraph): This method should be called if a block's '.bto' in nodes have been modified without notifying this instance to resynchronize edges. """ + self._pendings = {} for block in self.blocks: edges = [] # Rebuild edges from bto @@ -960,7 +961,9 @@ def fix_loc_offset(loc_db, loc_key, offset, modified): loc_offset = loc_db.get_location_offset(loc_key) if loc_offset == offset: return - loc_db.set_location_offset(loc_key, offset, force=True) + if loc_offset is not None: + loc_db.unset_location_offset(loc_key) + loc_db.set_location_offset(loc_key, offset) modified.add(loc_key) @@ -1209,7 +1212,7 @@ def assemble_block(mnemo, block, loc_db, conservative=False): data = b"" for expr in instr.raw: expr_int = fix_expr_val(expr, loc_db) - data += pck[expr_int.size](expr_int.arg) + data += pck[expr_int.size](int(expr_int)) instr.data = data instr.offset = offset_i diff --git a/miasm/core/bin_stream.py b/miasm/core/bin_stream.py index 727a853d..9224053f 100644 --- a/miasm/core/bin_stream.py +++ b/miasm/core/bin_stream.py @@ -137,7 +137,7 @@ class bin_stream(object): if endianness == LITTLE_ENDIAN: return upck16le(data) else: - return upck32be(data) + return upck16be(data) def get_u32(self, addr, endianness=None): """ diff --git a/miasm/core/cpu.py b/miasm/core/cpu.py index 3dc7bd68..aee22c97 100644 --- a/miasm/core/cpu.py +++ b/miasm/core/cpu.py @@ -1587,13 +1587,8 @@ class imm_noarg(object): if e == [None]: return None, None - assert(isinstance(e, m2_expr.Expr)) - if isinstance(e, tuple): - self.expr = self.int2expr(e[1]) - elif isinstance(e, m2_expr.Expr): - self.expr = e - else: - raise TypeError('zarb expr') + assert(m2_expr.is_expr(e)) + self.expr = e if self.expr is None: log.debug('cannot fromstring int %r', text) return None, None diff --git a/miasm/core/graph.py b/miasm/core/graph.py index 01f580a3..8bb4371d 100644 --- a/miasm/core/graph.py +++ b/miasm/core/graph.py @@ -732,6 +732,49 @@ class DiGraph(object): yield scc + def compute_weakly_connected_components(self): + """ + Return the weakly connected components + """ + remaining = set(self.nodes()) + components = [] + while remaining: + node = remaining.pop() + todo = set() + todo.add(node) + component = set() + done = set() + while todo: + node = todo.pop() + if node in done: + continue + done.add(node) + remaining.discard(node) + component.add(node) + todo.update(self.predecessors(node)) + todo.update(self.successors(node)) + components.append(component) + return components + + + + def replace_node(self, node, new_node): + """ + Replace @node by @new_node + """ + + predecessors = self.predecessors(node) + successors = self.successors(node) + self.del_node(node) + for predecessor in predecessors: + if predecessor == node: + predecessor = new_node + self.add_uniq_edge(predecessor, new_node) + for successor in successors: + if successor == node: + successor = new_node + self.add_uniq_edge(new_node, successor) + class DiGraphSimplifier(object): """Wrapper on graph simplification passes. diff --git a/miasm/core/objc.py b/miasm/core/objc.py index 123d339a..117e3b7d 100644 --- a/miasm/core/objc.py +++ b/miasm/core/objc.py @@ -14,7 +14,8 @@ from functools import total_ordering from miasm.core.utils import cmp_elts from miasm.expression.expression_reduce import ExprReducer -from miasm.expression.expression import ExprInt, ExprId, ExprOp, ExprMem +from miasm.expression.expression import ExprInt, ExprId, ExprOp, ExprMem, \ + is_op_segm from miasm.core.ctypesmngr import CTypeUnion, CTypeStruct, CTypeId, CTypePtr,\ CTypeArray, CTypeOp, CTypeSizeof, CTypeEnum, CTypeFunc, CTypeEllipsis @@ -1045,7 +1046,7 @@ class ExprToAccessC(ExprReducer): def reduce_op(self, node, lvl=0, **kwargs): """Generate access for ExprOp""" - if not (node.expr.is_op("+") or node.expr.is_op_segm()) \ + if not (node.expr.is_op("+") or is_op_segm(node.expr)) \ or len(node.args) != 2: return None type_arg1 = self.get_solo_type(node.args[1]) diff --git a/miasm/core/parse_asm.py b/miasm/core/parse_asm.py index 2b4f1195..b742a2d2 100644 --- a/miasm/core/parse_asm.py +++ b/miasm/core/parse_asm.py @@ -65,7 +65,7 @@ def guess_next_new_label(loc_db): """Generate a new label @loc_db: the LocationDB instance""" i = 0 - gen_name = b"loc_%.8X" + gen_name = "loc_%.8X" while True: name = gen_name % i label = loc_db.get_name_location(name) @@ -121,7 +121,7 @@ def parse_txt(mnemo, attrib, txt, loc_db=None): # label beginning with .L match_re = LABEL_RE.match(line) if match_re: - label_name = match_re.group(1).encode() + label_name = match_re.group(1) label = loc_db.get_or_create_name_location(label_name) lines.append(label) continue diff --git a/miasm/core/utils.py b/miasm/core/utils.py index 7667a656..37248c40 100644 --- a/miasm/core/utils.py +++ b/miasm/core/utils.py @@ -81,10 +81,16 @@ def printable(string): def force_bytes(value): - try: - return value.encode() - except AttributeError: + if isinstance(value, bytes): return value + if not isinstance(value, str): + return value + out = [] + for c in value: + c = ord(c) + assert c < 0x100 + out.append(c) + return bytes(out) def force_str(value): |