Class DecompilerExporter

java.lang.Object
com.pnfsoftware.jeb.core.units.code.DecompilerExporter
Direct Known Subclasses:
DexDecompilerExporter, NativeDecompilerExporter

public abstract class DecompilerExporter extends Object
Helper class used to decompile and export to source files all or a subset of classes or methods of a code unit.

Example: export all top-level items to an output folder:

 IDecompilerUnit decomp = ...; // retrieved from the current IRuntimeProject
 File outdir = ...;
 DecompilerExporter exp = decomp.getExporter();
 exp.setOutputFolder(outdir, false);
 exp.setMethodTimeout(60_000L);  // safety
 exp.setTotalTimeout(15 * 60_000L);  // safety
 exp.setCallback(new ProgressCallbackAdapter() {
     @Override
     public void message(String msg) {
         System.out.println(msg);
     }
 });
 boolean success = exp.process();
 System.out.println("Errors: " + exp.getErrors());
 
  • Field Details

    • logger

      protected static final ILogger logger
      Logger.
    • decomp

      protected IDecompilerUnit decomp
      Decompiler unit.
    • outputFolder

      protected File outputFolder
      Output folder.
    • headerString

      protected String headerString
      Header prepended to generated files.
    • pattern

      protected Pattern pattern
      Optional signature pattern.
    • methodTimeoutMs

      protected long methodTimeoutMs
      Per-method timeout, in milliseconds.
    • totalTimeoutMs

      protected long totalTimeoutMs
      Total timeout, in milliseconds.
    • callback

      protected IProgressCallback callback
      Progress callback.
    • discardDecompiledItemsAfterProcessing

      protected boolean discardDecompiledItemsAfterProcessing
      True to discard decompiled items after processing.
    • usesCustomDecompWriter

      protected boolean usesCustomDecompWriter
      True if a custom decompilation writer is used.
    • writeCount

      protected AtomicInteger writeCount
      Generated file count.
    • writeErrorCount

      protected AtomicInteger writeErrorCount
      Generated file error count.
    • errormap

      protected Map<String,String> errormap
      Decompilation errors.
  • Constructor Details

    • DecompilerExporter

      public DecompilerExporter(IDecompilerUnit decompiler)
      Create an exporter with default settings.
      Parameters:
      decompiler - a decompiler
  • Method Details

    • reset

      protected void reset()
      Reset exporter counters and errors.
    • getDecompiler

      public IDecompilerUnit getDecompiler()
      Get the decompiler.
      Returns:
      decompiler
    • setOutputFolder

      public void setOutputFolder(File folder) throws IOException
      Set the output folder.
      Parameters:
      folder - output folder
      Throws:
      IOException - if the output folder cannot be created
    • setOutputFolder

      public void setOutputFolder(File folder, Boolean discardDecompiledItemsAfterProcessing) throws IOException
      Set an optional output folder. If the folder exists and contents is already present, it will NOT be removed.
      Parameters:
      folder - output folder
      discardDecompiledItemsAfterProcessing - optional; if non-null, also update setDiscardDecompiledItemsAfterProcessing(boolean)
      Throws:
      IOException - if some error occurred when creating the output folder
    • getOutputFolder

      public File getOutputFolder()
      Get the output folder.
      Returns:
      output folder, or null
    • setHeaderString

      public void setHeaderString(String s)
      Set an optional single-line header string, prepended to all decompiled classes. The default header string is: Decompiled by JEB v[VERSION]
      Parameters:
      s - header string
    • getHeaderString

      public String getHeaderString()
      Get the header string prepended to generated files.
      Returns:
      header string, or null
    • setSignaturePattern

      public void setSignaturePattern(Pattern pattern)
      Set an optional matcher for classes or methods to be decompiled.
      Parameters:
      pattern - a regex pattern
    • getSignaturePattern

      public Pattern getSignaturePattern()
      Get the signature pattern.
      Returns:
      signature pattern, or null
    • setMethodTimeout

      public void setMethodTimeout(long methodTimeoutMs)
      Set an optional timeout for method decompilation.
      Parameters:
      methodTimeoutMs - timeout in milliseconds
    • getMethodTimeout

      public long getMethodTimeout()
      Get the method timeout.
      Returns:
      timeout in milliseconds
    • setTotalTimeout

      public void setTotalTimeout(long totalTimeoutMs)
      Set an optional timeout for the entire decompilation process.
      Parameters:
      totalTimeoutMs - timeout in milliseconds
    • getTotalTimeout

      public long getTotalTimeout()
      Get the total timeout.
      Returns:
      timeout in milliseconds
    • setCallback

      public void setCallback(IProgressCallback callback)
      Set an optional callback to receive progress information on the decompilation.
      Parameters:
      callback - progress callback
    • getCallback

      public IProgressCallback getCallback()
      Get the progress callback.
      Returns:
      progress callback, or null
    • setDiscardDecompiledItemsAfterProcessing

      public void setDiscardDecompiledItemsAfterProcessing(boolean discardDecompiledItemsAfterProcessing)
      Specify whether decompiled items should be kept or discarded after the decompilation process is complete. Unless you are planning to examine decompiled items later, it is recommended to discard them.
      Parameters:
      discardDecompiledItemsAfterProcessing - true to discard decompiled items after processing
    • isDiscardDecompiledItemsAfterProcessing

      public boolean isDiscardDecompiledItemsAfterProcessing()
      Determine whether decompiled items are discarded after processing.
      Returns:
      true if decompiled items are discarded after processing
    • export

      public final boolean export()
      A synonym for process().
      Returns:
      true if no error occurred
    • process

      public abstract boolean process()
      Decompile and export all meaningful elements. This is the recommended method to call. Top-level classes and their constituents will be exported; orphaned methods and other items will be exported as well.

      If an output folder was specified, the resulting source files will be stored in a folder hierarchy that matches their namespace or package name.

      Returns:
      true if no error occurred; false if some errors occurred
    • customizeOptions

      protected void customizeOptions(boolean decompilingClasses, DecompilationOptions.Builder optbld)
      Optional method used to customize the options of the decompilation context. The custom implementation may modify or set new options. The default implementation does nothing.
      Parameters:
      decompilingClasses - true if the exporter will decompile classes; false if it will decompile methods
      optbld - the current option builder
    • processTopLevelClasses

      public boolean processTopLevelClasses()
      Decompile and export all top-level classes (i.e., non member classes).

      If an output folder was specified, the resulting source files will be stored in a folder hierarchy that matches their namespace or package name.

      Returns:
      true if no error occurred; false if some errors occurred
    • processMethods

      public boolean processMethods()
      Decompile and export all internal methods. Refer to processTopLevelClasses() to export classes hierarchically.

      If an output folder was specified, the resulting source files will be stored in that folder. No folder hierarchy is created. File names are uniquely derived from method signatures.

      Returns:
      true if no error occurred; false if some errors occurred
    • generateMethodFileName

      protected String generateMethodFileName(String address)
      Generate a file name for a decompiled method.
      Parameters:
      address - method address
      Returns:
      file name
    • writeMethodDecompilation

      protected void writeMethodDecompilation(String addr)
      Write a method decompilation to disk.
      Parameters:
      addr - method address
    • generateClassFileName

      protected String generateClassFileName(String address)
      Generate a file name for a decompiled class.
      Parameters:
      address - class address
      Returns:
      file name
    • writeClassDecompilation

      protected void writeClassDecompilation(String addr)
      Write a class decompilation to disk.
      Parameters:
      addr - class address
    • getGeneratedFileCount

      public Integer getGeneratedFileCount()
      Retrieve the number of generated source files.
      Returns:
      generated file count
    • getErrors

      public Map<String,String> getErrors()
      Retrieve a map "address -> error string" for all methods that failed the decompilation. Call after process().
      Returns:
      error map