#?description=Enumerate the IJavaIdentifiers (parameters, local vars) of IJavaMethod objects of a decompiled IJavaClass. Rename some identifiers. List all identifiers.
#?shortcut=
from com.pnfsoftware.jeb.client.api import IScript
from com.pnfsoftware.jeb.core.units.code.java import IJavaSourceUnit, IJavaClass
"""
Sample script for JEB Decompiler.
Enumerate the IJavaIdentifiers (parameters, local vars) of IJavaMethod objects of a decompiled IJavaClass. Rename some identifiers. List all identifiers
"""
class JavaListIdentifiers(IScript):
def run(self, ctx):
prj = ctx.getMainProject()
assert prj, 'Need a project'
f = ctx.getFocusedFragment()
assert f, 'Need a focused fragment'
# assume a fragment is focused, assumed it is backed by an IUnit
unit = f.getUnit()
if not isinstance(unit, IJavaSourceUnit): return
# assume the unit is an IJavaSourceUnit
elt = unit.getASTElement()
if not isinstance(elt, IJavaClass): return
# 1) DEMO: rename some method identifiers
# enumerate all methods in the class (NOTE: nested classes are not enumerated, this is just a demo script)
idx = 0
for m in elt.getMethods():
identifiers = m.getIdentifierManager().getIdentifiers()
print('METHOD: %s: identifiers=%s' % (m, identifiers))
for ident in identifiers:
print(' current=%s original=%s debug=%s' % (unit.getIdentifierName(ident), ident.getName(), ident.getDebugName()))
# rename all non-this identifiers (including param names) that do not carry a debug name
if ident.getName() != 'this' and ident.getDebugName() == None:
newName = 'RENAMED_%d' % idx
idx += 1
print(' -> renaming to %s' % newName)
unit.setIdentifierName(ident, newName)
# 2) DEMO: note that all identifiers are uniquely identified by their CodeCoordinates
# they can be enumerated via IDexUnit (the parent of an IDexDecompilerUnit, itself parent of all IJavaSourceUnit)
dexdec = unit.getParent()
dex = dexdec.getParent()
print('All renamed identifiers: %s' % dex.getRenamedIdentifiers())