From 5fdf7e61e2ba7123c7250f58893c06aa5c77c81b Mon Sep 17 00:00:00 2001 From: Willi Ballenthin Date: Thu, 5 Dec 2024 14:28:59 +0000 Subject: [PATCH] inspect-binexport2: better render ARM lsl/lsr and pruned expressions --- scripts/inspect-binexport2.py | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/scripts/inspect-binexport2.py b/scripts/inspect-binexport2.py index 2b59e35e..9e205b0d 100644 --- a/scripts/inspect-binexport2.py +++ b/scripts/inspect-binexport2.py @@ -128,6 +128,11 @@ def _render_expression_tree( if expression.symbol != "!": o.write(expression.symbol) + if expression.symbol in ("lsl", "lsr"): + # like: lsl 16 + # not like: lsl16 + o.write(" ") + child_index = children_tree_indexes[0] _render_expression_tree(be2, operand, expression_tree, child_index, o) @@ -141,7 +146,13 @@ def _render_expression_tree( child_a = children_tree_indexes[0] child_b = children_tree_indexes[1] _render_expression_tree(be2, operand, expression_tree, child_a, o) + o.write(expression.symbol) + if expression.symbol == ",": + # like: 10, 20 + # not like 10,20 + o.write(" ") + _render_expression_tree(be2, operand, expression_tree, child_b, o) return @@ -152,11 +163,19 @@ def _render_expression_tree( child_c = children_tree_indexes[2] _render_expression_tree(be2, operand, expression_tree, child_a, o) o.write(expression.symbol) + if expression.symbol == ",": + o.write(" ") _render_expression_tree(be2, operand, expression_tree, child_b, o) o.write(expression.symbol) + if expression.symbol == ",": + o.write(" ") _render_expression_tree(be2, operand, expression_tree, child_c, o) return + elif len(children_tree_indexes) == 0: + # like when all subtrees have been pruned: don't render anything + return + else: raise NotImplementedError(len(children_tree_indexes)) @@ -362,10 +381,17 @@ def main(argv=None): operands = [] for operand_index in instruction.operand_index: operand = be2.operand[operand_index] - # Ghidra bug where empty operands (no expressions) may - # exist so we skip those for now (see https://github.com/NationalSecurityAgency/ghidra/issues/6817) - if len(operand.expression_index) > 0: - operands.append(render_operand(be2, operand, index=operand_index)) + if not operand.expression_index: + # Ghidra bug where empty operands (no expressions) may + # exist so we skip those for now (see https://github.com/NationalSecurityAgency/ghidra/issues/6817) + continue + + op = render_operand(be2, operand, index=operand_index) + if not op: + # operand has been pruned away, so don't show it + continue + + operands.append(op) call_targets = "" if instruction.call_target: