summaryrefslogtreecommitdiffstats
path: root/tools/ghidra/gsp-fwimage-570.144/scripts/ScanBranches.java
diff options
context:
space:
mode:
Diffstat (limited to 'tools/ghidra/gsp-fwimage-570.144/scripts/ScanBranches.java')
-rw-r--r--tools/ghidra/gsp-fwimage-570.144/scripts/ScanBranches.java34
1 files changed, 34 insertions, 0 deletions
diff --git a/tools/ghidra/gsp-fwimage-570.144/scripts/ScanBranches.java b/tools/ghidra/gsp-fwimage-570.144/scripts/ScanBranches.java
new file mode 100644
index 0000000..cff36f0
--- /dev/null
+++ b/tools/ghidra/gsp-fwimage-570.144/scripts/ScanBranches.java
@@ -0,0 +1,34 @@
+import ghidra.app.script.GhidraScript;
+import ghidra.program.model.address.Address;
+import ghidra.program.model.listing.Instruction;
+import ghidra.program.model.listing.Listing;
+import ghidra.program.model.symbol.FlowType;
+
+public class ScanBranches extends GhidraScript {
+ @Override
+ protected void run() throws Exception {
+ Listing listing = currentProgram.getListing();
+ String[] args = getScriptArgs();
+ Address start = toAddr(args[0]);
+ Address end = toAddr(args[1]);
+ Address target = toAddr(args[2]);
+ Address cur = start;
+ int n = 0;
+ while (cur.compareTo(end) < 0 && n < 20000) {
+ Instruction insn = listing.getInstructionAt(cur);
+ if (insn == null) {
+ try { disassemble(cur); } catch (Exception e) { println("stop at " + cur + ": " + e); break; }
+ insn = listing.getInstructionAt(cur);
+ }
+ if (insn == null) { println("no insn at " + cur); break; }
+ for (Address a : insn.getFlows()) {
+ if (a.equals(target)) {
+ println("TARGET HIT: " + insn.getAddress() + ": " + insn.toString());
+ }
+ }
+ cur = insn.getMaxAddress().add(1);
+ n++;
+ }
+ println("scanned " + n + " instructions from " + start + " to " + cur);
+ }
+}