public abstract class

AbstractMasterOptimizer

extends Object
implements IMasterOptimizer<T extends IOptimizerTarget>
java.lang.Object
   ↳ com.pnfsoftware.jeb.core.units.code.asm.decompiler.opt.AbstractMasterOptimizer<T extends com.pnfsoftware.jeb.core.units.code.asm.decompiler.opt.IOptimizerTarget>
Known Direct Subclasses

Class Overview

Standard implementation of a generic master optimizer.

Summary

[Expand]
Inherited Constants
From interface com.pnfsoftware.jeb.core.units.code.asm.decompiler.opt.IMasterOptimizer
Fields
protected int decryptorSupport disabled (0) by default; client code must explicitly set to non-zero to allow the execution of decryptors.
protected boolean enableDeobfuscators false by default; client code must explicitly set to true to allow the execution of deobfuscators.
protected boolean enableUnsafeOptimizers false by default; client code must explicitly set to true to allow the execution of unsafe optimizers.
protected int grp1NMaxRunCount maximum run count for the group [1..N] (<0 means no limit)
protected List<IMasterOptimizerInstrumenter<T extends IOptimizerTarget>> instrumenters instrumenters
protected SortedMap<Integer, List<OptimizerEntry<T extends IOptimizerTarget>>> optGrpMap groups of optimizers; groups 0 and -1 are entry and exit groups, respectively
protected List<OptimizerEntry<T extends IOptimizerTarget>> optList list of all optimizers
protected T extends IOptimizerTarget t default target
Public Constructors
AbstractMasterOptimizer(T t, int grp1NMaxRunCount)
Create a master optimizer.
Public Methods
int getDecryptorSupport()
OptimizerMode getMode()
Retrieve the current operating mode for this MO.
int getOptimizationCount(boolean deobfuscationOnly)
OptimizerEntry<T> getOptimizer(Class<? extends IOptimizer<T>> clazz)
IOptimizer<T> getOptimizerObject(Class<? extends IOptimizer<T>> clazz)
List<OptimizerEntry<T>> getRegisteredOptimizers(int groupId)
Get a copy of the lists of optimizer entries registered with this MO and belonging to the provided optimizer group.
List<OptimizerEntry<T>> getRegisteredOptimizers()
Get a copy of the list of optimizer entries registered with this MO.
T getTarget()
Get the target onto which the optimizations will be performed.
int getTotalOptimizationCount()
boolean isEnableDeobfuscators()
boolean isEnableUnsafeOptimizers()
int perform()
Perform an optimization pass.
int performMultiple(List<OptimizerEntry<T>> list)
Run the list of optimizers, in sequence.
int performSingle(OptimizerEntry<T> e)
Perform a single optimization, using the provided optimizer (which must have been previously registered).
void registerInstrumenter(IMasterOptimizerInstrumenter<T> instrumenter)
Register an instrumenter.
OptimizerEntry<T> registerOptimizer(int group, IOptimizer<T> opt)
Register an optimizer, using the optimizer's provided default priority.
OptimizerEntry<T> registerOptimizer(IOptimizer<T> opt)
Register an optimizer to the main group, using the optimizer's provided default priority.
OptimizersPerformanceCounters retrievePerformanceCounters()
void setDecryptorSupport(int value)
void setEnableDeobfuscators(boolean enabled)
void setEnableUnsafeOptimizers(boolean enabled)
OptimizerMode setMode(OptimizerMode mode)
void setPolicyForOptimizerTag(String tag, boolean allowed)
Set the running policy associated to a tag or group of tags.
void setTarget(T t)
Set the optimizer's target.
void unregisterAllOptimizers()
boolean unregisterInstrumenter(IMasterOptimizerInstrumenter<T> instrumenter)
Unregister an instrumenter
boolean unregisterOptimizer(OptimizerEntry<T> e)
Remove an optimizer.
Protected Methods
abstract String getTargetAddress(T target)
boolean onOptimizerException(T target, IOptimizer<T> opt, Exception ex)
This method is called when an optimizer hard-failed and generated an exception.
int performV1()
int performV2(boolean rerunFromStartAfterOpt)
void postAllOptimizationsCallback(T target)
This method might be overridden, but the parent should be called first.
void postOptimizationCallback(T target, OptimizerEntry<T> e, int cnt, long executionTimeMs)
This method might be overridden, but the parent should be called first.
void preAllOptimizationsCallback(T target)
This method might be overridden, but the parent should be called first.
void preOptimizationCallback(T target, OptimizerEntry<T> e)
This method might be overridden, but the parent should be called first.
[Expand]
Inherited Methods
From class java.lang.Object
From interface com.pnfsoftware.jeb.core.units.code.asm.decompiler.opt.IMasterOptimizer

Fields

protected int decryptorSupport

disabled (0) by default; client code must explicitly set to non-zero to allow the execution of decryptors.

protected boolean enableDeobfuscators

false by default; client code must explicitly set to true to allow the execution of deobfuscators.

protected boolean enableUnsafeOptimizers

false by default; client code must explicitly set to true to allow the execution of unsafe optimizers.

protected int grp1NMaxRunCount

maximum run count for the group [1..N] (<0 means no limit)

protected List<IMasterOptimizerInstrumenter<T extends IOptimizerTarget>> instrumenters

instrumenters

protected SortedMap<Integer, List<OptimizerEntry<T extends IOptimizerTarget>>> optGrpMap

groups of optimizers; groups 0 and -1 are entry and exit groups, respectively

protected List<OptimizerEntry<T extends IOptimizerTarget>> optList

list of all optimizers

protected T extends IOptimizerTarget t

default target

Public Constructors

public AbstractMasterOptimizer (T t, int grp1NMaxRunCount)

Create a master optimizer.

Parameters
t the default target, may be null
grp1NMaxRunCount maximum run count for the group [1..N]

Public Methods

public int getDecryptorSupport ()

public OptimizerMode getMode ()

Retrieve the current operating mode for this MO.

Returns
  • the current operating mode

public int getOptimizationCount (boolean deobfuscationOnly)

public OptimizerEntry<T> getOptimizer (Class<? extends IOptimizer<T>> clazz)

public IOptimizer<T> getOptimizerObject (Class<? extends IOptimizer<T>> clazz)

public List<OptimizerEntry<T>> getRegisteredOptimizers (int groupId)

Get a copy of the lists of optimizer entries registered with this MO and belonging to the provided optimizer group.

public List<OptimizerEntry<T>> getRegisteredOptimizers ()

Get a copy of the list of optimizer entries registered with this MO.

public T getTarget ()

Get the target onto which the optimizations will be performed.

public int getTotalOptimizationCount ()

public boolean isEnableDeobfuscators ()

public boolean isEnableUnsafeOptimizers ()

public int perform ()

Perform an optimization pass. All the optimizers will be run according to this master's schedule. They may be run multiple times.

Returns
  • the total number of optimizations performed

public int performMultiple (List<OptimizerEntry<T>> list)

Run the list of optimizers, in sequence. Each optimizer is run once.

Parameters
list a list of optimizers
Returns
  • the total number of optimizations performed

public int performSingle (OptimizerEntry<T> e)

Perform a single optimization, using the provided optimizer (which must have been previously registered).

Parameters
e an optimizer
Returns
  • the total number of optimizations performed

public void registerInstrumenter (IMasterOptimizerInstrumenter<T> instrumenter)

Register an instrumenter. Instrumenters will be called following their registration order.

public OptimizerEntry<T> registerOptimizer (int group, IOptimizer<T> opt)

Register an optimizer, using the optimizer's provided default priority. Refer to IOptimizer#getDefaultPriority().

public OptimizerEntry<T> registerOptimizer (IOptimizer<T> opt)

Register an optimizer to the main group, using the optimizer's provided default priority. Refer to IOptimizer#getDefaultPriority().

public OptimizersPerformanceCounters retrievePerformanceCounters ()

public void setDecryptorSupport (int value)

public void setEnableDeobfuscators (boolean enabled)

public void setEnableUnsafeOptimizers (boolean enabled)

public OptimizerMode setMode (OptimizerMode mode)

public void setPolicyForOptimizerTag (String tag, boolean allowed)

Set the running policy associated to a tag or group of tags. Policy checks when deciding whether an optimizer should be run works as follow: 1) the tag must be allowed, 2) if passed, the tag must not be blocked. By default, all tags are allowed, none are blocked. To reset to that default policy: first invoke this method with ("*", true), then invoke it with (null, false).

Parameters
tag tag name; the special name "*" means all tags; the special name "" (empty string) or null string means no tag
allowed true to allow the master optimizer to run the optimizer with the specified tag; false to block it

public void setTarget (T t)

Set the optimizer's target.

public void unregisterAllOptimizers ()

public boolean unregisterInstrumenter (IMasterOptimizerInstrumenter<T> instrumenter)

Unregister an instrumenter

Returns
  • true if the instrumenter was removed, false otherwise

public boolean unregisterOptimizer (OptimizerEntry<T> e)

Remove an optimizer.

Protected Methods

protected abstract String getTargetAddress (T target)

protected boolean onOptimizerException (T target, IOptimizer<T> opt, Exception ex)

This method is called when an optimizer hard-failed and generated an exception.

Parameters
target the target that being optimized
opt the failing optimizer
ex the generated exception
Returns
  • if true, the exception will be neutered and the master optimizer will resume the optimizing process; else, the exception will be thrown

protected int performV1 ()

protected int performV2 (boolean rerunFromStartAfterOpt)

protected void postAllOptimizationsCallback (T target)

This method might be overridden, but the parent should be called first.

protected void postOptimizationCallback (T target, OptimizerEntry<T> e, int cnt, long executionTimeMs)

This method might be overridden, but the parent should be called first. Note that this method might have a big impact on decompilation performance, so override carefully.

protected void preAllOptimizationsCallback (T target)

This method might be overridden, but the parent should be called first.

protected void preOptimizationCallback (T target, OptimizerEntry<T> e)

This method might be overridden, but the parent should be called first. Note that this method might have a big impact on decompilation performance, so override carefully.