ObadClean.py
# JEB script - demo AST API
# Obad, Part 3: Remove useless try-catch blocks after Obad is unreflected
# See www.android-decompiler.com/blog
import sys
import os
import time
from jeb.api import IScript
from jeb.api import EngineOption
from jeb.api.ui import View
from jeb.api.dex import Dex
from jeb.api.ast import TryStm, Compound, Throw
class ObadClean(IScript):
def run(self, jeb):
self.jeb = jeb
self.dex = self.jeb.getDex()
v = self.jeb.getUI().getView(View.Type.JAVA)
if not v:
print 'Switch to the Java view, position the caret somewhere inside the method to be decompiled'
return
self.msig = v.getCodePosition().getSignature()
print 'Cursor: %s' % self.msig
r = jeb.decompile(self.msig, False, False)
if not r:
print 'Could not find method'
return
m = jeb.getDecompiledMethodTree(self.msig)
self.revertReflection(m.getBody())
def revertReflection(self, block):
i = 0
while i < block.size():
stm = block.get(i)
if isinstance(stm, TryStm):
if stm.getCatchCount() == 1 and stm.getCatchType(0) == 'Ljava/lang/Throwable;':
catchb = stm.getCatchBody(0)
if catchb.size() == 1 and isinstance(catchb.get(0), Throw):
print 'Removing try/finally'
tryb = stm.getTryBody()
block.remove(i)
self.insertStatements(block, i, tryb)
continue
elif isinstance(stm, Compound):
for b in stm.getBlocks():
self.revertReflection(b)
i += 1
def insertStatements(self, block, index, src):
j = 0
while j < src.size():
block.insert(index, src.get(j))
index += 1
j += 1