Interface IDexUnit
- All Superinterfaces:
IAddressableUnit
,ICodeUnit
,IEventSource
,IInteractiveUnit
,IUnit
,IUnitCreator
,IUserDataSupport
Dex units use Java-style internal addresses to identify items:
- package: Lcom/abc/
- type: Lcom/abc/Foo;
- method: Lcom/abc/Foo;->bar(I[JLjava/Lang/String;)V
- field: Lcom/abc/Foo;->flag1:Z
More information here.
Note that in the case of multi-Dex APKs, the Dex unit represents a virtual, unified view of the
separate Dex files contained in the APK. If required, the individual information about those Dex
files can be retrieved via IDexFile
.
Like many units, Dex unit objects emit J.UnitChange
when the unit contents is being
changed. IDexUnit set up event objects such that JebEvent.getData()
will return a
UnitChangeEventData
with fields reasonably populated.
How use the JEB API to interact with those objects?
- Writing JEB client scripts in Python is a great way to ease into the JEB API.
- Visit this public
GitHub repository for sample code
- In the JEB client, use F2 to bring up the script manager, and try out some sample scripts
Below is a sample client script that shows how to retrieve a project, find the main dex unit,
enumerate dex methods, check the bytecode and search for specific instructions.
File: ListDexMethodsWithXor.py
#?description=List dex methods making use of xor instructions #?shortcut= from com.pnfsoftware.jeb.client.api import IScript from com.pnfsoftware.jeb.core.units.code.android import IDexUnit class ListDexMethodsWithXor(IScript): def run(self, ctx): prj = ctx.getMainProject() assert prj, 'Need a project' dex = prj.findUnit(IDexUnit) assert dex, 'Need a dex unit' cnt = 0 for m in dex.getMethods(): if m.isInternal(): ci = m.getData().getCodeItem() if ci and self.checkMethod(ci): print(m.getSignature(True, False)) cnt += 1 print('Found %d methods' % cnt) def checkMethod(self, ci): for insn in ci.getInstructions(): if insn.toString().find('xor-') >= 0: return True return False
-
Field Summary
Modifier and TypeFieldDescriptionstatic final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
Inlining mode: allowed.static final int
Inlining mode: auto-determined.static final int
Inlining mode: blocked.static final int
Inlining mode: forced.static final int
static final int
static final int
Do not use directly - reserved by dex decompilersstatic final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final int
static final String
-
Method Summary
Modifier and TypeMethodDescriptionvoid
Add (merge) an additional Dex file into this Dex unit.Create a new field and add it to the field pool index.Create a new field and add it to the field pool index.Create a new method reference and add it to the method pool index.addPackage
(String signature) addPrototype
(String prototypeString) Create a new Dex prototype and add it to the prototype pool index.Create a new string and add it to the string pool index.Create a new type and add it to the type pool index.int
Retrieve the pool index of a string, by value.int
getCallSite
(int index) List<? extends IDexCallSite>
getClass
(int index) Convenience method to retrieve a class by its Dex class pool index.Convenience method used to retrieve a class by name.Get the Dex class poolGet the comment manager.Retrieve the constant library object.Retrieve the context information provider.int
Retrieve the count of dex files that make up this dex unit.getCrossReferences
(DexPoolType poolType, int index) Retrieve a list of addresses referencing the provided pool item.getCrossReferences
(DexPoolType poolType, int index, int cap) Retrieve a list of addresses referencing the provided pool item.Retrieve or create a decompiler for this unit.getDexFile
(int index) Retrieve a dex file by index.Retrieve the collection of dex files that make up this dex unit.This convenience method provides the entire disassembly of the bytecode making up the Dex file.Convenience method to retrieve the text document representing the disassembly of this code unit.getField
(int index) Convenience method to retrieve a field by its Dex field pool index.Convenience method used to retrieve a field by name.Get the Dex field poollong
Retrieve the total amount of instructions in this Dex unit.getMethod
(int index) Convenience method to retrieve a method by its Dex method pool index.Convenience method used to retrieve a method by name.getMethodHandle
(int index) List<? extends IDexMethodHandle>
List<? extends IDexMethod>
Get the Dex method poolgetObjectById
(long id) Feature preview.getPackage
(String signature) List<? extends IDexPackage>
Get the list of code packages.getPrototype
(int index) Convenience method to retrieve a prototype by its Dex prototype pool index.List<? extends IDexPrototype>
Get the list of Dex prototypes defined in the Dex file (prototype pool).Retrieve the cross-references manager.Retrieve a map of renamed identifiers.getStaticFieldInitializer
(int index) Retrieve the initializer for the static field of a class.getString
(int index) Convenience method to retrieve a string by its Dex string pool index.int
Get the number of strings present in the aggregated string pools represented by this Dex unit.List<? extends IDexString>
Get the Dex string pool, including extra strings added viaaddString
.getType
(int index) Retrieve a type by its Dex type pool index.Retrieve a type by its fully-qualified name.getTypeHierarchy
(String typesig, int maxNodeCount, boolean includeSuperTypes) getTypes()
Get the Dex prototype pooldefault boolean
Move a class or a package to another package, class, or method.boolean
Move a class or a package to another package, class, or method.Methods inherited from interface com.pnfsoftware.jeb.core.units.IAddressableUnit
getAddressLabel, getAddressLabels, getAddressOfItem, getCanonicalAddress, getItemAtAddress, getItemObject, getRelatedItems, getWellKnownAddresses, isValidAddress
Methods inherited from interface com.pnfsoftware.jeb.core.units.code.ICodeUnit
getAddressFromCodeCoordinates, getCodeCoordinatesFromAddress, getCodeItemByAddress, getHierarchy
Methods inherited from interface com.pnfsoftware.jeb.util.events.IEventSource
addListener, countListeners, getListeners, getParentSource, insertListener, notifyListeners, removeListener, setParentSource
Methods inherited from interface com.pnfsoftware.jeb.core.units.IInteractiveUnit
addressToLocation, canExecuteAction, executeAction, executeAction, getAddressActions, getFullComment, getFullComments, getGlobalActions, getInlineComment, getInlineComments, getItemActions, getMetadataManager, locationToAddress, prepareExecution, setInlineComment
Methods inherited from interface com.pnfsoftware.jeb.core.units.IUnit
addChild, addChild, canBePersisted, dispose, generateQuickState, getChildren, getContributions, getCreationTimestamp, getDescription, getExtraInputs, getFormatter, getFormatType, getIconData, getInput, getInterpreters, getLock, getName, getNotes, getNotificationManager, getParent, getParentArtifact, getParentProject, getPropertyDefinitionManager, getPropertyManager, getRealName, getStatus, getUid, getUnitProcessor, initializePropertyObjects, isDisposed, isProcessed, isStale, isTransientChild, notifyGenericChange, postDeserialization, process, removeChild, setName, setNotes, setParent, setRealName, setUnitProcessor
Methods inherited from interface com.pnfsoftware.jeb.core.IUserDataSupport
clearAllData, getAllData, getData, setData
-
Field Details
-
ACC_PUBLIC
static final int ACC_PUBLIC- See Also:
-
ACC_PRIVATE
static final int ACC_PRIVATE- See Also:
-
ACC_PROTECTED
static final int ACC_PROTECTED- See Also:
-
ACC_STATIC
static final int ACC_STATIC- See Also:
-
ACC_FINAL
static final int ACC_FINAL- See Also:
-
ACC_SYNCHRONIZED
static final int ACC_SYNCHRONIZED- See Also:
-
ACC_VOLATILE
static final int ACC_VOLATILE- See Also:
-
ACC_BRIDGE
static final int ACC_BRIDGE- See Also:
-
ACC_TRANSIENT
static final int ACC_TRANSIENT- See Also:
-
ACC_VARARGS
static final int ACC_VARARGS- See Also:
-
ACC_NATIVE
static final int ACC_NATIVE- See Also:
-
ACC_INTERFACE
static final int ACC_INTERFACE- See Also:
-
ACC_ABSTRACT
static final int ACC_ABSTRACT- See Also:
-
ACC_STRICT
static final int ACC_STRICT- See Also:
-
ACC_SYNTHETIC
static final int ACC_SYNTHETIC- See Also:
-
ACC_ANNOTATION
static final int ACC_ANNOTATION- See Also:
-
ACC_ENUM
static final int ACC_ENUM- See Also:
-
ACC_CONSTRUCTOR
static final int ACC_CONSTRUCTOR- See Also:
-
ACC_DECLARED_SYNCHRONIZED
static final int ACC_DECLARED_SYNCHRONIZED- See Also:
-
INLINE_AUTO
static final int INLINE_AUTOInlining mode: auto-determined. This mode is to be understood as 'limited', that is, inlining is blocked except for trivial cases- See Also:
-
INLINE_BLOCKED
static final int INLINE_BLOCKEDInlining mode: blocked. The method must not be inlined by code processors.- See Also:
-
INLINE_ALLOWED
static final int INLINE_ALLOWEDInlining mode: allowed. The method may be inlined by code processors.- See Also:
-
INLINE_FORCED
static final int INLINE_FORCEDInlining mode: forced. The method should be inlined by code processors if possible.- See Also:
-
itagItemIdShift
static final int itagItemIdShift- See Also:
-
itagBitsize
static final int itagBitsize- See Also:
-
ITAG_STRING
static final int ITAG_STRING- See Also:
-
ITAG_PACKAGE
static final int ITAG_PACKAGE- See Also:
-
ITAG_TYPE
static final int ITAG_TYPE- See Also:
-
ITAG_CLASS
static final int ITAG_CLASS- See Also:
-
ITAG_FIELD
static final int ITAG_FIELD- See Also:
-
ITAG_METHOD
static final int ITAG_METHOD- See Also:
-
ITAG_BYTECODE
static final int ITAG_BYTECODE- See Also:
-
ITAG_PARAMETER
static final int ITAG_PARAMETER- See Also:
-
ITAG_VARIABLE
static final int ITAG_VARIABLE- See Also:
-
ITAG_IMMEDIATE
static final int ITAG_IMMEDIATE- See Also:
-
ITAG_VIRTUAL_VAR
static final int ITAG_VIRTUAL_VAR- See Also:
-
ITAG_CUSTOM
static final int ITAG_CUSTOMDo not use directly - reserved by dex decompilers- See Also:
-
propnameContextInfoDb
- See Also:
-
-
Method Details
-
getCountOfDexFiles
int getCountOfDexFiles()Retrieve the count of dex files that make up this dex unit.- Returns:
-
getDexFiles
Retrieve the collection of dex files that make up this dex unit.When the dex unit is the result of processing an APK, the first entry (index 0) represents the primary dex file,
classes.dex
; entries 1...N represent additionalclassesN.dex
of the APK is a multi-dex; additional dex files, dynamically added viaaddDex(IInput)
}, are found at index N+1 and beyond.- Returns:
- a non-empty collection of dex files; when restoring pre-JEB 2.3 JDB2, this list will be null
-
getDexFile
Retrieve a dex file by index.When the dex unit is the result of processing an APK, the first entry (index 0) represents the primary dex file,
classes.dex
; entries 1...N represent additionalclassesN.dex
of the APK is a multi-dex; additional dex files, dynamically added viaaddDex(IInput)
}, are found at index N+1 and beyond.- Parameters:
index
- a dex file index- Returns:
- the dex file
-
findStringIndex
Retrieve the pool index of a string, by value.- Parameters:
s
- a string- Returns:
- an string pool index, -1 if the string was not found
-
getStrings
List<? extends IDexString> getStrings()Get the Dex string pool, including extra strings added viaaddString
.- Specified by:
getStrings
in interfaceICodeUnit
- Returns:
-
getString
Convenience method to retrieve a string by its Dex string pool index.- Parameters:
index
-- Returns:
-
getStringCount
int getStringCount()Get the number of strings present in the aggregated string pools represented by this Dex unit.- Returns:
-
addString
Create a new string and add it to the string pool index.- Parameters:
value
-- Returns:
-
getPrototypes
List<? extends IDexPrototype> getPrototypes()Get the list of Dex prototypes defined in the Dex file (prototype pool).- Returns:
- a list of prototypes
-
getPrototype
Convenience method to retrieve a prototype by its Dex prototype pool index.- Parameters:
index
- prototype index- Returns:
-
addPrototype
Create a new Dex prototype and add it to the prototype pool index.- Parameters:
prototypeString
- a full prototype string, such as:(typeParam1,typeParam2,...)typeReturn
- Returns:
-
getTypes
Get the Dex prototype pool -
getType
Retrieve a type by its Dex type pool index.- Parameters:
index
-- Returns:
-
getType
Retrieve a type by its fully-qualified name.- Parameters:
fqname
- eg,Lcom/foo/Bar;
- Returns:
-
addType
Create a new type and add it to the type pool index.- Parameters:
typeString
- a fully-qualified type name, using the standard Java internal signature notation (L...;
)- Returns:
-
getBadTypeCount
int getBadTypeCount()- Returns:
-
getClass
Description copied from interface:ICodeUnit
Convenience method used to retrieve a class by name. -
getClasses
Get the Dex class pool- Specified by:
getClasses
in interfaceICodeUnit
- Returns:
-
getClass
Convenience method to retrieve a class by its Dex class pool index.- Parameters:
index
-- Returns:
-
getFields
Get the Dex field pool -
getField
Description copied from interface:ICodeUnit
Convenience method used to retrieve a field by name. -
getField
Convenience method to retrieve a field by its Dex field pool index.- Parameters:
index
-- Returns:
-
getStaticFieldInitializer
Retrieve the initializer for the static field of a class.- Parameters:
index
- the field index- Returns:
- the static initializer, or null if there's none
-
addField
Create a new field and add it to the field pool index.- Parameters:
signature
- full, egLcom/foo/Bar;->val:I
- Returns:
-
addField
Create a new field and add it to the field pool index.- Parameters:
type
- full, egLcom/foo/Bar;->val:I
fieldname
- simple namefieldtype
- full, egLcom/foo/Bar;->val:I
- Returns:
-
getMethods
List<? extends IDexMethod> getMethods()Get the Dex method pool- Specified by:
getMethods
in interfaceICodeUnit
- Returns:
-
getMethod
Description copied from interface:ICodeUnit
Convenience method used to retrieve a method by name. -
getMethod
Convenience method to retrieve a method by its Dex method pool index.- Parameters:
index
-- Returns:
-
addMethod
Create a new method reference and add it to the method pool index.- Parameters:
signature
- full signature, including type name, eg:La/b/Foo;->bar(ILjava/lang/String;)Z
- Returns:
-
addMethod
- Parameters:
type
-methodname
-protostring
-- Returns:
-
getCallSite
- Parameters:
index
-- Returns:
-
getCallSites
List<? extends IDexCallSite> getCallSites()- Returns:
-
getMethodHandle
- Parameters:
index
-- Returns:
-
getMethodHandles
List<? extends IDexMethodHandle> getMethodHandles()- Returns:
-
getPackages
List<? extends IDexPackage> getPackages()Description copied from interface:ICodeUnit
Get the list of code packages.- Specified by:
getPackages
in interfaceICodeUnit
- Returns:
-
getPackage
- Parameters:
signature
-- Returns:
-
addPackage
- Parameters:
signature
-- Returns:
-
moveTo
Move a class or a package to another package, class, or method.- Parameters:
src
- anIDexPackage
orIDexClass
dst
- anIDexPackage
,IDexClass
orIDexMethod
skipChecks
- skip extra sanity checks (if applicable)neverAnonymous
- legal only when moving a class to another method (else N/A); if true, the moved class will never be made an anonymous class of the destination method; if false, an anonymous class will be favored, if it is possible to do so- Returns:
- success indicator
-
moveTo
Move a class or a package to another package, class, or method. Checks are not skipped; whne moving a class to a method, the class will be made anonymous.- Parameters:
src
- anIDexPackage
orIDexClass
dst
- anIDexPackage
,IDexClass
orIDexMethod
- Returns:
- success indicator
-
getInstructionCount
long getInstructionCount()Retrieve the total amount of instructions in this Dex unit. Note that if this unit represents the virtual Dex file resulting from the merge of several classesX.dex files, the number of instructions returned is the sum of instructions of each individual Dex file.- Returns:
-
getDisassemblyDocument
IDexDisassemblyDocument getDisassemblyDocument()Description copied from interface:ICodeUnit
Convenience method to retrieve the text document representing the disassembly of this code unit.The caller is responsible for disposing the returned document after usage.
- Specified by:
getDisassemblyDocument
in interfaceICodeUnit
- Returns:
-
getDisassembly
String getDisassembly()This convenience method provides the entire disassembly of the bytecode making up the Dex file. This method is a convenience method: the disassembly text document object can always be retrieved viaIUnit.getFormatter()
.- Specified by:
getDisassembly
in interfaceICodeUnit
- Returns:
-
getCrossReferences
Retrieve a list of addresses referencing the provided pool item. This method is left for convenience and legacy only. Newer scripts should usegetReferenceManager()
.- Parameters:
poolType
- pool item type; currently supported for xrefs: STRING, TYPE, FIELD, METHODindex
- pool item indexcap
- max number of references to return (leave to 0 to mean return everything possible)- Returns:
-
getCrossReferences
Retrieve a list of addresses referencing the provided pool item. This method is left for convenience and legacy only. Newer scripts should usegetReferenceManager()
.- Parameters:
poolType
- pool item type; currently supported for xrefs: STRING, TYPE, FIELD, METHODindex
- pool item index- Returns:
-
getReferenceManager
IDexReferenceManager getReferenceManager()Retrieve the cross-references manager.- Returns:
-
getCommentManager
DexCommentManager getCommentManager()Description copied from interface:IInteractiveUnit
Get the comment manager. This method is optional. When the unit is disposed, this method must return null. The default implementation returns null.- Specified by:
getCommentManager
in interfaceICodeUnit
- Specified by:
getCommentManager
in interfaceIInteractiveUnit
- Returns:
- a comment manager, or null if the unit does not have one
-
getRenamedIdentifiers
Map<IdentifierCoordinates,String> getRenamedIdentifiers()Retrieve a map of renamed identifiers. Only renamed identifiers are stored in the returned object.- Returns:
-
getObjectById
Feature preview.- Parameters:
id
-- Returns:
-
addDex
Add (merge) an additional Dex file into this Dex unit.- Parameters:
dexInput
- a Dexinput
(file input, bytes input, etc.) or a ZIP input containing a singleclasses.dex
entry- Throws:
IOException
-
getConstantsLibrary
DexConstantLibrary getConstantsLibrary()Retrieve the constant library object. The constants library holds the constant fields of this dex unit (that is, allstatic final
fields ,regardless of their visibility attributes) as well as values attached to pure field references (external fields)- Returns:
-
getContextInfoProvider
IDexContextInfoProvider getContextInfoProvider()Retrieve the context information provider. This provider can be used to retrieve methods' context access information (context-sensitivity, side-effect) and fields' effective finality information.- Returns:
-
getDecompiler
IDexDecompilerUnit getDecompiler()Retrieve or create a decompiler for this unit. Ifdexdec
(the Dex Decompiler module) is not available with your JEB license, null is returned.- Returns:
-
getTypeHierarchy
- Parameters:
typesig
-maxNodeCount
-includeSuperTypes
-- Returns:
-