// Writes Ghidra's pseudo-C for every function to /.c (a starting point for decompiling). // Usage: analyzeHeadless -import eqgame.exe -postScript ExportDecomp.java import ghidra.app.decompiler.*; import ghidra.app.script.GhidraScript; import ghidra.program.model.listing.*; import java.io.*; public class ExportDecomp extends GhidraScript { @Override public void run() throws Exception { File dir = new File(getScriptArgs()[0]); dir.mkdirs(); DecompInterface di = new DecompInterface(); di.openProgram(currentProgram); int n = 0; for (Function f : currentProgram.getFunctionManager().getFunctions(true)) { if (monitor.isCancelled()) break; if (f.isExternal() || f.isThunk()) continue; File out = new File(dir, String.format("%08x.c", f.getEntryPoint().getOffset())); if (out.exists()) continue; DecompileResults r = di.decompileFunction(f, 60, monitor); String c = r.decompileCompleted() ? r.getDecompiledFunction().getC() : "// decompile failed: " + r.getErrorMessage() + "\n"; try (PrintWriter w = new PrintWriter(new FileWriter(out))) { w.print(c); } if (++n % 500 == 0) println("decompiled " + n); } di.dispose(); } }