java.lang.Object | ||
↳ | com.pnfsoftware.jeb.core.AbstractPlugin | |
↳ | com.pnfsoftware.jeb.core.units.code.android.ir.AbstractDOptimizer |
Base class for dexdec
(DEX decompiler) IR optimizer plugins. Those plugins can access and
modify the intermediate representation of a method or group of methods being decompiled. They can
be used to implement a wide range of optimizations, from trivial code clean-up to the most
complex deobfuscation passes. Internally, dexdec
uses IR optimizers to perform dead-code
removal, variable substitutions, immediate propagation, restructuring, constant folding,
arithmetic operation simplifications, deobfuscations such as control-flow unflattening, etc.
Optimizers are usually managed by master optimizers
(also called
orchestrators
). Third-party optimizer plugins can be automatically registered when
creating an orchestrator. Refer to createMasterOptimizer
.
Life-cycle information:
- plugins are reused (i.e. the perform()
method is called multiple times)
- thread-safety:
-- Python script plugins must be thread-safe: a plugin instance may be executed by multiple
threads concurrently
-- Java plugins (including Java script plugins) are not required to be thread-safe: a plugin
instance will not be executed by multiple threads concurrently
[Expand]
Inherited Constants | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
![]() |
Fields | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
public CFG<IDInstruction> | cfg | Target method's IR CFG, set up for convenience (see getCfg() )
|
|||||||||
public IDMethodContext | ctx | Target method's IR context | |||||||||
public List<IDMethodContext> | ctxlist | If the optimizer is a regular method optimizer (an optimizer targeting a single method), this field is null. | |||||||||
public IDexDecompilerUnit | decomp | Managing dex decompiler. | |||||||||
public IDexUnit | dex | Underlying dex code. | |||||||||
public IDFA3<IDInstruction, BasicBlock<IDInstruction>> | dfa | The data flow analysis object is initially UNINITIALIZED. | |||||||||
public IDGlobalContext | g | IR global context. | |||||||||
public static final ILogger | logger | Public logger accessible by the implementing optimizer. | |||||||||
public IJavaOperatorFactory | of | IR/AST operation factory reference (for convenience). | |||||||||
public IJavaTypeFactory | tf | IR/AST type factory reference (for convenience). |
Public Constructors | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
AbstractDOptimizer()
Create a
standard optimizer. | |||||||||||
AbstractDOptimizer(DOptimizerType type)
Create an optimizer.
| |||||||||||
AbstractDOptimizer(DOptimizerType type, boolean collectionOptimizer)
Create an optimizer for a method or collection of methods.
| |||||||||||
AbstractDOptimizer(DOptimizerType type, String name)
Create an optimizer.
|
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
void |
assignLocalFields(IDMethodContext _ctx)
This convenience method can be used to assign the object's attributes (e.g.
| ||||||||||
String |
getName()
Retrieve the plugin name.
| ||||||||||
EditablePluginInformation |
getPluginInformation()
Retrieve basic information about the plugin, such as name, version, author, and organization.
| ||||||||||
double |
getPriority()
Get the optimizer priority.
| ||||||||||
Set<String> |
getTags()
Get the optimizer tags.
| ||||||||||
DOptimizerType |
getType()
Get the optimizer type.
| ||||||||||
boolean |
isCollectionOptimizer()
Determine whether this optimizer performs on a single method or an a collection of methods.
| ||||||||||
boolean |
isEnabled()
Determine whether the optimizer is enabled or not.
| ||||||||||
abstract int |
perform()
An optimizer must implement this method.
| ||||||||||
final int |
perform(IDMethodContext ctx)
Run the optimizer on the provided target method.
| ||||||||||
final int |
performOnCollection(List<IDMethodContext> ctxlist)
Run the optimizer on the provided collection of methods.
| ||||||||||
void |
resetLocalFields()
Reset this object's attributes.
| ||||||||||
void |
setEnabled(boolean enabled)
Enable or disable this optimizer.
|
Protected Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
void | addTag(String tag) | ||||||||||
IDFA3<IDInstruction, BasicBlock<IDInstruction>> | analyzeChains() | ||||||||||
IDFA3<IDInstruction, BasicBlock<IDInstruction>> | analyzeChains(boolean redo) | ||||||||||
void |
checkInterrupted()
Verify if an interruption request was made by the managing decompiler.
| ||||||||||
int |
cleanGraph()
Perform clean-up after a change in CFG structure.
| ||||||||||
int |
cleanGraph(boolean doRemoveUnreachableBlocks, boolean doSimplifyJCondsAndSwitches)
Perform clean-up after a change in CFG structure.
| ||||||||||
boolean |
deleteUnreachableTrampoline(BasicBlock<IDInstruction> b)
This method is deprecated.
use
removeUnreachableTrampoline(CFG, BasicBlock)
| ||||||||||
boolean |
removeInstruction(BasicBlock<IDInstruction> b, int idx)
This method is deprecated.
use
removeInstruction(BasicBlock, int)
| ||||||||||
void | removeTag(String tag) | ||||||||||
void |
setCollectionOptimizer(boolean collectionOptimizer)
Set the optimizer target category: single method (usual), or collection of methods.To be used
by the constructor.
| ||||||||||
void |
setName(String name)
Set the optimizer name.
| ||||||||||
void |
setPriority(double priority)
Set the optimizer priority.
| ||||||||||
void |
setType(DOptimizerType type)
Set the optimizer type.
|
[Expand]
Inherited Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
![]() | |||||||||||
![]() | |||||||||||
![]() | |||||||||||
![]() |
The data flow analysis object is initially UNINITIALIZED. To initialize one, call
analyzeChains(boolean)
.
Public logger accessible by the implementing optimizer. Writing to the logger should be
favored over writing directly to stdout
.
Create an optimizer for a method or collection of methods.
This convenience method can be used to assign the object's attributes (e.g. g
,
ctx
, cfg
, etc.) from the values of the provided IR context.
_ctx | an IR context |
---|
Retrieve the plugin name. Should be consistent with the value returned by
getPluginInformation().getName()
.
Retrieve basic information about the plugin, such as name, version, author, and organization.
Get the optimizer priority. A higher value means a higher priority. Priorities are used by
optimizer orchestrators
to determine in which order optimizers
should be executed.
Get the optimizer tags. An optimizer may have 0, 1, or more tags. A tag is a non-null, non-empty string.
Get the optimizer type. Types are used by optimizer orchestrators
to determine whether an optimizer should run.
Determine whether this optimizer performs on a single method or an a collection of methods.
Determine whether the optimizer is enabled or not. This method is used by
optimizer orchestrators
to determine whether an optimizer can be
scheduled for execution.
An optimizer must implement this method. This method is called by a master optimizer to
perform the optimization on the selected
target.
Note that the optimizer is responsible for returning a legal method context, e.g.: the method
IR instructions must be consistent with the CFG; the CFG must adhere to certain rules (see
cleanGraph
); if the data flow analysis is no longer valid, it should be
invalidated (see resetDFA
); etc.
Run the optimizer on the provided target method.
For this method to be called by an orchestrator
,
isCollectionOptimizer()
must return false
.
ctx | a method context |
---|
Run the optimizer on the provided collection of methods.
For this method to be called by an orchestrator
,
isCollectionOptimizer()
must return true
.
ctxlist | a collection of method contexts |
---|
Enable or disable this optimizer. This flag is checked by a master
optimizer
.
Verify if an interruption request was made by the managing decompiler. This method may be called when potentially length computations are performed in a loop.
Perform clean-up after a change in CFG structure. This method will remove unreachable blocks and simplify conditional jumps and switches.
Perform clean-up after a change in CFG structure. Convenience method.
doRemoveUnreachableBlocks | if true, will call
removeUnreachableBlocks(IDMethodContext) |
---|---|
doSimplifyJCondsAndSwitches | if true, will call
simplifyJCondsAndSwitches(IDMethodContext) |
This method is deprecated.
use removeUnreachableTrampoline(CFG, BasicBlock)
Remove an unreachable trampoline block (ending on a JCOND or JUMP).
b | the block must be an unreachable (no input) trampoline (single-instruction jump/jcc); if the block is the first block in the CFG, the method will fail |
---|
This method is deprecated.
use removeInstruction(BasicBlock, int)
Remove an instruction in a block. Throws on error (watch out: the boolean return value does not indicate failure).
b | basic block |
---|---|
idx | index of the instruction to remove in this block |
Set the optimizer target category: single method (usual), or collection of methods.To be used by the constructor.
collectionOptimizer | true for a collection optimizer; false otherwise |
---|
Set the optimizer name. To be used by the constructor.
name | if null, a name will be auto-generated |
---|
Set the optimizer priority. To be used by the constructor.
priority | the new priority (high means higher priority). When optimizers are managed and run by an orchestrator, the optimizers with a higher priority are run before those having a lower priority. The default priority is 0. |
---|
Set the optimizer type. To be used by the constructor.
type | if null, a standard optimizer is assumed
|
---|