Interface IDMethodContext
- All Superinterfaces:
ICFGOwnerContext
,IVariableInformationProvider
dexdec
IR method context. A method context holds all intermediate (IR) information
relative to the decompilation of a dex method, including factory methods to create IR
instructions and IR expressions.-
Method Summary
Modifier and TypeMethodDescriptioncopy()
Create a copy of this context.default IDArrayElt
createArrayElt
(IDExpression array, IDExpression index, IJavaType type) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDInstanceField
createArrayLength
(IDExpression instance) Convenience IR factory method wrapping aroundgetGlobalContext()
.createAssign
(IDExpression dst, IDExpression src) Create anassignment
instruction.default IDImm
createBoolean
(boolean value) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDImm
createByte
(byte value) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDNewArrayInfo
createByteArray
(byte[] bytes) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDCallInfo
createCallInfo
(DInvokeType invoketype, int methodindex, List<IDExpression> arguments) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDCallInfo
createCallInfo
(IDIndex methodindex, IDExpression[] arguments, IJavaType returntype, String methodsig, DInvokeType invoketype) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDCallInfo
createCallInfo
(IDIndex methodindex, List<IDExpression> arguments, IJavaType returntype, String methodsig, DInvokeType invoketype) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDOperation
createCast
(IJavaType casttype, IDExpression e) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDImm
createChar
(char value) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDStaticField
createClassObject
(String csig) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDOperation
createConditional
(IJavaType type, IDExpression pred, IDExpression expTrue, IDExpression expFalse) Convenience IR factory method wrapping aroundgetGlobalContext()
.createConstruct
(IDNewInfo info) Create anew Object(...)
instruction.createCopyVar
(IDVar srcVar) Create a copy-variable.default IDImm
createDouble
(double value) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDImm
createFloat
(float value) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDImm
This convenience IR factory method wraps aroundIDGlobalContext.createImm(long, IJavaType)
.default IDIndex
createIndex
(int value) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDInstanceField
createInstanceField
(IDExpression instance, IDIndex index, IJavaType fieldtype, String fieldname) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDImm
createInt
(int value) Convenience IR factory method wrapping aroundgetGlobalContext()
.createInvoke
(IDCallInfo info) Create aninvocation
instruction.createJcond
(int irTargetOffset, IDExpression cond) Create ajcond
(conditional jump) instruction.createJump
(int irTargetOffset) Create agoto
(unconditional jump) instruction.default IDImm
createLong
(long value) Convenience IR factory method wrapping aroundgetGlobalContext()
.Create amonitor-enter
instruction.Create amonitor-exit
instruction.createNewArray
(IDNewArrayInfo info) Create anew array
instruction.default IDNewArrayInfo
createNewArrayInfo
(IJavaType type, IDExpression size, List<IDExpression> initvals) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDNewInfo
createNewInfo
(IJavaType objecttype, IJavaType constclasstype, IDIndex constructorindex, IDExpression[] arguments, String methodsig) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDNewInfo
createNewInfo
(IJavaType objecttype, IJavaType constclasstype, IDIndex constructorindex, List<IDExpression> arguments, String methodsig) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDNewInfo
createNewInfo
(String constructorSig, IDExpression... arguments) Convenience IR factory method wrapping aroundgetGlobalContext()
.Create ano-operation
instruction.default IDImm
Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDOperation
createOperation
(IJavaType type, IDExpression left, IJavaOperator operator, IDExpression right) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDOperation
createOperation
(IJavaType type, JavaOperatorType optype, IDExpression opnd1, IDExpression opnd2) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDOperation
createPredicate
(IDExpression left, IJavaOperator operator, IDExpression right) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDOperation
createPredicate
(JavaOperatorType optype, IDExpression opnd1, IDExpression opnd2) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDReferenceType
createReferenceType
(IDIndex cindex, IJavaType ctype) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDReferenceType
createReferenceType
(String csig) Convenience IR factory method wrapping aroundgetGlobalContext()
.createRegisterVar
(int regnum, IJavaType type) Create a variable mapping to a physical Dalvik register (or pair of registers).createReturn
(IDExpression exp) Create areturn
instruction.default IDImm
createShort
(short value) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDStaticField
createStaticField
(IDIndex index, IJavaType fieldtype, String csig, String fieldname) Convenience IR factory method wrapping aroundgetGlobalContext()
.createStoreException
(IDVar ident) Create anexception-store
instruction.default IDImm
createString
(IDIndex stringIndex) Convenience IR factory method wrapping aroundgetGlobalContext()
.default IDImm
createString
(String value) Convenience IR factory method wrapping aroundgetGlobalContext()
.createSwitch
(IDExpression swexp, IDSwitchData data) Create aswitch
instruction.default IDSwitchData
default IDTarget
createTarget
(int offset) Convenience IR factory method wrapping aroundgetGlobalContext()
.createThrow
(IDExpression exp) Create athrow
instruction.createVar
(int id) Create or retrieve a variable.Create or retrieve a variable.Create or retrieve a variable.createVirtualVar
(IJavaType type) Create a virtual variable.getCfg()
Get the current IR (intermediate representation) CFG of the decompiled method.Retrieve an arbitrary object in this context.Retrieve the set of objects keys for data elements stored usingsetData
.int
Retrieve the decompilation flags provided by the engine to decompile this method.getDex()
Retrieve the underlying dex unit.Retrieve the exception information for the current IR, if theexception information
were parsed when the Dalvik method was converted to IR.Retrieve the global IR context, shared by all IR method contexts.Retrieve a reference to the dex method being decompiled.Retrieve the original signature of the method being decompiled.Retrieve the global high-level operator factory.Retrieve the type map for the decompiled method.Retrieve the list of variables that hold the method parameters.Retrieve the global high-level type factory.Retrieve the type information provider.getVar
(int id) Retrieve avariable
by name.Retrieve a read-only map of all variables created by this context.Retrieve the optional decompilation watchdog.default boolean
Convenience method checking forIDecompilerUnit.FLAG_BATCH_DECOMPILATION
.boolean
Determine whether debug information (in particular, variable names) will be ported overvariables
created during the conversion to Intermediate Representation.boolean
Determine whether exception information will be parsed and integrated within the initial Intermediate Representation, when the Dalvik code is converted to IR.boolean
isSSA()
Determine whether the CFG wasconverted to an SSA form
.boolean
Determine whether the dalvik method in this IR context is static or non-static.void
load
(IDMethodContext sourceContext) Load the constituents of a source context into this context.void
makeSSA()
Convert this CFG to SSA (static single assignment) form.void
Perform type determination and propagation on the CFG.void
replace
(CFG<IDInstruction> replCfg, IDTryData replExdata) Replace the current IR by a new CFG and exception information.void
replaceCFG
(CFG<IDInstruction> cfg2, Map<Integer, Integer> oldToNewOffsets) Replace the current IR by a new CFG and exception information.int
retrievePhysicalRegisterId
(int varid) Retrieve the underlying register used by a variable.int
retrievePrimaryVariableId
(int varid) Retrieve the primary variable id from a variable.Store an arbitrary object in this context.void
verify()
Self-verification.Methods inherited from interface com.pnfsoftware.jeb.core.units.code.ICFGOwnerContext
getName, getSame
-
Method Details
-
verify
Self-verification. This method performs several consistency checks on the IR. On failure, the method will throw and an attempt will be made to dump the current IR CFG to a file named "failed.dot".- Throws:
IllegalStateException
- thrown on verification failure
-
copy
IDMethodContext copy()Create a copy of this context. This method is useful when optimizers need to operate and modify in depth a context and its elements (e.g. the CFG or exception-flow data), while the optimizer's success is not guaranteed. On failure, the copied context may be destroyed. On success, the context may be updated using the copied context, by usingload(IDMethodContext)
- Returns:
- a new context, which is a deep duplication of this context
-
load
Load the constituents of a source context into this context. This method is to be used in conjunction withcopy()
.- Parameters:
sourceContext
- a source context
-
getWatchdog
Watchdog getWatchdog()Retrieve the optional decompilation watchdog. The watchdog embeds timing information and can be queried by decompilation components: a component can request a self-verification, which will result in an exception being thrown (and decompilation aborted) if the timeout is exceeded.- Returns:
-
getDecompilationFlags
int getDecompilationFlags()Retrieve the decompilation flags provided by the engine to decompile this method. Refer toIDecompilerUnit#FLAG_xxx
constants.- Returns:
-
isBatchDecompilation
default boolean isBatchDecompilation()Convenience method checking forIDecompilerUnit.FLAG_BATCH_DECOMPILATION
.- Returns:
-
isParseExceptions
boolean isParseExceptions()Determine whether exception information will be parsed and integrated within the initial Intermediate Representation, when the Dalvik code is converted to IR.- Returns:
-
isParseDebugInfo
boolean isParseDebugInfo()Determine whether debug information (in particular, variable names) will be ported overvariables
created during the conversion to Intermediate Representation.- Returns:
-
getGlobalContext
IDGlobalContext getGlobalContext()Retrieve the global IR context, shared by all IR method contexts. The global context (also referred to as 'intermediate context') is managed by the decompiler.- Returns:
-
getOperatorFactory
IJavaOperatorFactory getOperatorFactory()Retrieve the global high-level operator factory. The type factory can be used to create all operators, including conditionals, string concatenation, and create cast operators.- Returns:
-
getTypeFactory
IJavaTypeFactory getTypeFactory()Retrieve the global high-level type factory.- Returns:
-
getTypeInfoProvider
IDTypeInfoProvider getTypeInfoProvider()Retrieve the type information provider. This provider can access additional, user-provided libraries (jar, dex) to retrieve information on types referenced but not defined in the underlying dex unit.- Returns:
-
getDex
IDexUnit getDex()Retrieve the underlying dex unit.- Returns:
-
getMethod
IDexMethod getMethod()Retrieve a reference to the dex method being decompiled.- Returns:
-
getMethodSignature
String getMethodSignature()Retrieve the original signature of the method being decompiled.- Returns:
-
getParametersTypeMap
Retrieve the type map for the decompiled method. The map keys are Dalvik input slot indices. The special index -1 indicates the return value type, if the method returns a value. The first entry isthis
, if the method is non-static. Although typeslong
anddouble
use two slots, only the first slot number is returned. Other primitives and reference type objects use a single slot.- Example: virtual method f() of class A using 10 registers:
int f(char, double, String)
=> map=(-1:int, 5:ref_A, 6:char, 7:double, 9:String)
- Example: static method g() of class B using 20 registers:
void g(long, long, Object, boolean) => map=(14:long, 16:long, 18:Object, 19:boolean)
- Returns:
-
getCfg
CFG<IDInstruction> getCfg()Get the current IR (intermediate representation) CFG of the decompiled method. As the method advances in the decompilation pipeline, the IR gets refined. When it is fully refined, the final IR is converted to a Java AST.- Returns:
-
getExceptionData
IDTryData getExceptionData()Retrieve the exception information for the current IR, if theexception information
were parsed when the Dalvik method was converted to IR.- Returns:
- an exception information object, which may be empty if the method is unprotected or
if
isParseExceptions()
was false when this object as built
-
replace
Replace the current IR by a new CFG and exception information.This method should be seldom called; most times, modifying the CFG itself is sufficient. However, in some cases, a full replacement may be necessary.
- Parameters:
replCfg
- new CFGreplExdata
- new exception data (may be null)
-
replaceCFG
Replace the current IR by a new CFG and exception information. It is recommended to usereplace(CFG, IDTryData)
instead.This method should be seldom called; most times, modifying the CFG itself is sufficient. However, in some cases, a full replacement may be necessary.
- Parameters:
cfg2
- new CFGoldToNewOffsets
- mandatory map map specifying a correspondence "old IR offset to new IR offset" for each instruction of the CFG (this map is currently used to update various internal structures as well as IR exception information)
-
makeSSA
void makeSSA()Convert this CFG to SSA (static single assignment) form. An SSA form should be generated before attempting to apply types. This method is reserved for internal use. -
isSSA
boolean isSSA()Determine whether the CFG wasconverted to an SSA form
.- Returns:
- true if the CFG was SSA'ed
-
propagateTypes
void propagateTypes()Perform type determination and propagation on the CFG. The CFG should be in SSA form before doing so. This method is reserved for internal use. -
getVariableMap
Retrieve a read-only map of all variables created by this context.- Returns:
-
isStaticMethod
boolean isStaticMethod()Determine whether the dalvik method in this IR context is static or non-static.- Returns:
- true if this context is for a static method, false otherwise
-
getParameterVariables
Retrieve the list of variables that hold the method parameters. If the method is non-static, the first entry representsthis
.- Returns:
- a list of variables
-
getVar
- Parameters:
id
- a variable id (not to be confused with Dalvik register number)- Returns:
- a variable, or null if no variable with the provided id exists
-
getVar
Retrieve avariable
by name. This method may return null.- Parameters:
name
- a variable name (standard name, or custom name)- Returns:
- a variable, or null if no variable with the provided name exists
-
createVar
Create or retrieve a variable.- Parameters:
id
- variable id (not to be confused with Dalvik register number)- Returns:
- a variable
-
createVar
Create or retrieve a variable. Caution: if the variable with the provided id already exists, it will be returned by this method without performing type check: the requested type at creation may not be the type of the returned (already existing) variable.- Parameters:
id
- variable id (not to be confused with Dalvik register number)type
- mandatory type- Returns:
- a variable
-
createVar
Create or retrieve a variable.- Parameters:
id
- variable id (not to be confused with Dalvik register number)type
- mandatory typeperformTypeCheckIfExists
- if false: if the variable with the provided id already exists, it will be returned by this method without performing type check: the requested type may not be the type of the returned (already existing) variable; if true: this method will throw anIllegalArgumentException
if an already existing variable does not have the requested type- Returns:
- a variable
-
createRegisterVar
Create a variable mapping to a physical Dalvik register (or pair of registers). This method is used during the initial decompilation phase when the bytecode is converted to low-level IR.- Parameters:
regnum
- dalvik register number (first register in the case of a pair)type
- variable type- Returns:
- a variable
-
createCopyVar
Create a copy-variable. If the source variable has apreferred name
, it is copied to the newly-created variable.- Parameters:
srcVar
- a primary variable, whose id is in [0, 0xFFFF] or [0x10000, 0x1FFFE]- Returns:
- a variable representing a copy of the provided variable
-
createVirtualVar
Create a virtual variable. A virtual variable does not map back to physical registers.- Parameters:
type
- variable type- Returns:
- the created variable
-
retrievePhysicalRegisterId
int retrievePhysicalRegisterId(int varid) Retrieve the underlying register used by a variable. If the variable uses a long type, the first register of the pair is returned. If the variable is virtual, -1 is returned.- Parameters:
varid
- a variable id- Returns:
- a register id in [0, 0xFFFF] if the variable is backed or indirectly backed by a physical register; -1 if the variable is "virtual", not backed by a register
-
retrievePrimaryVariableId
int retrievePrimaryVariableId(int varid) Retrieve the primary variable id from a variable. If the variable directly maps a register or pair of registers, or is virtual, its id is simply returned. If the variable is a copy of another variable, the id of the copied variable is provided.- Parameters:
varid
- a variable id- Returns:
- the original (non-copied) variable id, which may be the provided id itself
-
createNop
IDInstruction createNop()Create ano-operation
instruction. Opcode:DOpcodeType.IR_NOP
.- Returns:
-
createAssign
Create anassignment
instruction. Opcode:DOpcodeType.IR_ASSIGN
.- Parameters:
dst
-src
-- Returns:
-
createConstruct
Create anew Object(...)
instruction. Opcode:DOpcodeType.IR_INVOKE
.- Parameters:
info
-- Returns:
-
createInvoke
Create aninvocation
instruction. Opcode:DOpcodeType.IR_INVOKE
.- Parameters:
info
-- Returns:
-
createNewArray
Create anew array
instruction. Opcode:DOpcodeType.IR_INVOKE
.- Parameters:
info
-- Returns:
-
createJump
Create agoto
(unconditional jump) instruction. Opcode:DOpcodeType.IR_JUMP
.- Parameters:
irTargetOffset
-- Returns:
-
createJcond
Create ajcond
(conditional jump) instruction. Opcode:DOpcodeType.IR_JCOND
.- Parameters:
irTargetOffset
-cond
-- Returns:
-
createSwitch
Create aswitch
instruction. Opcode:DOpcodeType.IR_SWITCH
.- Parameters:
swexp
-data
-- Returns:
-
createReturn
Create areturn
instruction. Opcode:DOpcodeType.IR_RETURN
.- Parameters:
exp
-- Returns:
-
createThrow
Create athrow
instruction. Opcode:DOpcodeType.IR_THROW
.- Parameters:
exp
-- Returns:
-
createStoreException
Create anexception-store
instruction. Opcode:DOpcodeType.IR_STORE_EXCEPTION
.- Parameters:
ident
-- Returns:
-
createMonitorEnter
Create amonitor-enter
instruction. Opcode:DOpcodeType.IR_MONITOR_ENTER
.- Parameters:
exp
-- Returns:
-
createMonitorExit
Create amonitor-exit
instruction. Opcode:DOpcodeType.IR_MONITOR_EXIT
.- Parameters:
exp
-- Returns:
-
createImm
This convenience IR factory method wraps aroundIDGlobalContext.createImm(long, IJavaType)
. -
createBoolean
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createByte
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createChar
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createShort
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createInt
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createLong
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createFloat
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createDouble
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createNull
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createString
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createString
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createArrayElt
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createOperation
default IDOperation createOperation(IJavaType type, JavaOperatorType optype, IDExpression opnd1, IDExpression opnd2) Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createOperation
default IDOperation createOperation(IJavaType type, IDExpression left, IJavaOperator operator, IDExpression right) Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createCast
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createConditional
default IDOperation createConditional(IJavaType type, IDExpression pred, IDExpression expTrue, IDExpression expFalse) Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createPredicate
default IDOperation createPredicate(JavaOperatorType optype, IDExpression opnd1, IDExpression opnd2) Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createPredicate
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createReferenceType
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createReferenceType
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createIndex
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createStaticField
default IDStaticField createStaticField(IDIndex index, IJavaType fieldtype, String csig, String fieldname) Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createInstanceField
default IDInstanceField createInstanceField(IDExpression instance, IDIndex index, IJavaType fieldtype, String fieldname) Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createClassObject
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createArrayLength
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createCallInfo
default IDCallInfo createCallInfo(IDIndex methodindex, IDExpression[] arguments, IJavaType returntype, String methodsig, DInvokeType invoketype) Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createCallInfo
default IDCallInfo createCallInfo(IDIndex methodindex, List<IDExpression> arguments, IJavaType returntype, String methodsig, DInvokeType invoketype) Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createCallInfo
default IDCallInfo createCallInfo(DInvokeType invoketype, int methodindex, List<IDExpression> arguments) Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createNewInfo
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createNewInfo
default IDNewInfo createNewInfo(IJavaType objecttype, IJavaType constclasstype, IDIndex constructorindex, IDExpression[] arguments, String methodsig) Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createNewInfo
default IDNewInfo createNewInfo(IJavaType objecttype, IJavaType constclasstype, IDIndex constructorindex, List<IDExpression> arguments, String methodsig) Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createNewArrayInfo
default IDNewArrayInfo createNewArrayInfo(IJavaType type, IDExpression size, List<IDExpression> initvals) Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createByteArray
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createTarget
Convenience IR factory method wrapping aroundgetGlobalContext()
. -
createSwitchData
-
setData
Store an arbitrary object in this context.- Parameters:
key
- non-null keyvalue
- null means remove the entry- Returns:
- the previous value associated with the key
-
getData
Retrieve an arbitrary object in this context.- Parameters:
key
-- Returns:
-
getDataKeys
Retrieve the set of objects keys for data elements stored usingsetData
.- Returns:
- a read-only collection
-