import ghidra.app.decompiler.DecompInterface; import ghidra.app.decompiler.DecompileResults; import ghidra.app.script.GhidraScript; import ghidra.program.model.address.Address; import ghidra.program.model.listing.Function; import java.io.File; import java.io.PrintWriter; public class DecompileSelectedFunctions extends GhidraScript { @Override protected void run() throws Exception { String[] args = getScriptArgs(); if (args.length < 2) { println("usage: DecompileSelectedFunctions [...]"); return; } File output = new File(args[0]); output.getParentFile().mkdirs(); DecompInterface decompiler = new DecompInterface(); decompiler.openProgram(currentProgram); long imageBase = currentProgram.getImageBase().getOffset(); try (PrintWriter writer = new PrintWriter(output, "UTF-8")) { writer.printf("# %s selected decompile%n%n", currentProgram.getName()); for (int i = 1; i < args.length; i++) { long raw = Long.decode(args[i]); long absolute = raw < imageBase ? imageBase + raw : raw; Address address = toAddr(absolute); Function function = getFunctionContaining(address); if (function == null) { writer.printf("## %s%n%nNo function at %s.%n%n", args[i], address); continue; } writer.printf("## %s at %s%n%n", function.getName(), function.getEntryPoint()); writer.printf("Signature: `%s`%n%n", function.getSignature()); DecompileResults results = decompiler.decompileFunction(function, 90, monitor); if (!results.decompileCompleted()) { writer.printf("Decompile failed: %s%n%n", results.getErrorMessage()); continue; } writer.println("```c"); writer.println(results.getDecompiledFunction().getC()); writer.println("```"); writer.println(); } } finally { decompiler.dispose(); } } }