def decompile(input_, file_, output, format_, jar, limit, decompiler): """ Decompile an APK and create Control Flow Graphs. Example: \b $ androguard resources.arsc """ from androguard import session if file_ and input_: print( "Can not give --input and positional argument! " "Please use only one of them!", file=sys.stderr) sys.exit(1) if not input_ and not file_: print("Give one file to decode!", file=sys.stderr) sys.exit(1) if input_: fname = input_ else: fname = file_ s = session.Session() with open(fname, "rb") as fd: s.add(fname, fd.read()) export_apps_to_format(fname, s, output, limit, jar, decompiler, format_)
def __init__(self, parent=None, session=session_module.Session(), input_file=None, input_plugin=None): super(MainWindow, self).__init__(parent) self.session = session self.bin_windows = {} self.setupFileMenu() self.setupViewMenu() self.setupPluginsMenu() self.setupHelpMenu() self.setupCentral() self.setupEmptyTree() self.setupDock() self.setupSession() self.setWindowTitle("Androguard GUI") self.showStatus("Androguard GUI") self.installEventFilter(self) self.input_plugin = input_plugin if input_file: self._openFile(input_file) root = os.path.dirname(os.path.realpath(__file__)) self.setWindowIcon(QtGui.QIcon(os.path.join(root, "androguard.ico")))
def testSessionLoad(self): s = session.Session() with open("examples/android/TestsAndroguard/bin/TestActivity.apk", "rb") as fd: s.add("examples/android/TestsAndroguard/bin/TestActivity.apk", fd.read()) session.Save(s, "test_session") self.assertIn( '2f24538b3064f1f88d3eb29ee7fbd2146779a4c9144aefa766d18965be8775c7', s.analyzed_dex.keys()) self.assertIn( '3bb32dd50129690bce850124ea120aa334e708eaa7987cf2329fd1ea0467a0eb', s.analyzed_apk.keys()) x = s.analyzed_apk[ '3bb32dd50129690bce850124ea120aa334e708eaa7987cf2329fd1ea0467a0eb'][ 0] self.assertIsInstance(x, APK) nsession = session.Load("test_session") self.assertIn( '2f24538b3064f1f88d3eb29ee7fbd2146779a4c9144aefa766d18965be8775c7', nsession.analyzed_dex.keys()) self.assertIn( '3bb32dd50129690bce850124ea120aa334e708eaa7987cf2329fd1ea0467a0eb', nsession.analyzed_apk.keys()) y = nsession.analyzed_apk[ '3bb32dd50129690bce850124ea120aa334e708eaa7987cf2329fd1ea0467a0eb'][ 0] self.assertIsInstance(y, APK)
def testSessionSave(self): s = session.Session() with open("examples/android/TestsAndroguard/bin/TestActivity.apk", "r") as fd: s.add("examples/android/TestsAndroguard/bin/TestActivity.apk", fd.read()) s.save("test_session")
def __init__(self, parent=None, session=session_module.Session(), input_file=None, input_plugin=None): super(MainWindow, self).__init__(parent) self.session = session self.bin_windows = {} self.setupFileMenu() self.setupViewMenu() self.setupPluginsMenu() self.setupHelpMenu() self.setupCentral() self.setupEmptyTree() self.setupDock() self.setupSession() self.setWindowTitle("Androguard GUI") self.showStatus("Androguard GUI") self.installEventFilter(self) self.input_plugin = input_plugin if input_file: self._openFile(input_file)
def get_default_session(): """ Return the default Session from the configuration or create a new one, if the session is None. """ if androconf.CONF["SESSION"] is None: androconf.CONF["SESSION"] = session.Session() return androconf.CONF["SESSION"]
def testSessionDex(self): s = session.Session() with open("examples/android/TestsAndroguard/bin/classes.dex", "r") as fd: s.add("examples/android/TestsAndroguard/bin/classes.dex", fd.read()) self.assertEqual(len(s.analyzed_apk), 0) self.assertEqual(len(s.analyzed_files), 1) self.assertEqual(len(s.analyzed_digest), 1) self.assertEqual(len(s.analyzed_dex), 1)
def testSessionDex(self): s = session.Session() s.add("examples/android/TestsAndroguard/bin/classes.dex") self.assertEqual(len(s.analyzed_apk), 0) self.assertEqual(len(s.analyzed_files), 1) self.assertEqual(len(s.analyzed_digest), 1) self.assertEqual(len(s.analyzed_vms), 1) self.assertEqual(len(s.analyzed_dex), 1)
def main(options, arguments): if options.input is not None and options.output is not None: s = session.Session() with open(options.input, "rb") as fd: s.add(options.input, fd.read()) export_apps_to_format(options.input, s, options.output, options.limit, options.jar, options.decompiler, options.format) else: print("Please, specify an input file and an output directory")
def testSessionAPK(self): s = session.Session() with open("examples/android/TestsAndroguard/bin/TestActivity.apk", "r") as fd: s.add("examples/android/TestsAndroguard/bin/TestActivity.apk", fd.read()) self.assertEqual(len(s.analyzed_apk), 1) self.assertEqual(len(s.analyzed_files), 1) self.assertEqual(len(s.analyzed_digest), 2) self.assertEqual(len(s.analyzed_dex), 1)
def testSessionDexIPython(self): """ Test if exporting ipython works""" s = session.Session(export_ipython=True) s.add("examples/android/TestsAndroguard/bin/classes.dex") self.assertEqual(len(s.analyzed_apk), 0) self.assertEqual(len(s.analyzed_files), 1) self.assertEqual(len(s.analyzed_digest), 1) self.assertEqual(len(s.analyzed_vms), 1) self.assertEqual(len(s.analyzed_dex), 1)
def testSessionAPK(self): s = session.Session() s.add("examples/android/TestsAndroguard/bin/TestActivity.apk") self.assertEqual(len(s.analyzed_apk), 1) self.assertEqual(len(s.analyzed_files), 1) self.assertEqual( len(s.analyzed_files[ 'examples/android/TestsAndroguard/bin/TestActivity.apk']), 2) self.assertEqual(len(s.analyzed_digest), 2) # Two VMs analyzed: one at the APK level, one at the dex level self.assertEqual(len(s.analyzed_vms), 2) self.assertEqual(len(s.analyzed_dex), 1)
def testSessionAPKIP(self): """Test if exporting to ipython works with APKs""" s = session.Session(export_ipython=True) s.add("examples/android/TestsAndroguard/bin/TestActivity.apk") self.assertEqual(len(s.analyzed_apk), 1) self.assertEqual(len(s.analyzed_files), 1) self.assertEqual( len(s.analyzed_files[ 'examples/android/TestsAndroguard/bin/TestActivity.apk']), 2) self.assertEqual(len(s.analyzed_digest), 2) # Two VMs analyzed: one at the APK level, one at the dex level self.assertEqual(len(s.analyzed_vms), 2) self.assertEqual(len(s.analyzed_dex), 1)
def testSessionClassesDex(self): """Test if all classes.dex are added into the session""" from androguard.core.bytecodes.dvm import DalvikVMFormat from androguard.core.analysis.analysis import Analysis s = session.Session() # 0e1aa10d9ecfb1cb3781a3f885195f61505e0a4557026a07bd07bf5bd876c951 x = s.add("examples/tests/Test.dex") self.assertEqual( x, "0e1aa10d9ecfb1cb3781a3f885195f61505e0a4557026a07bd07bf5bd876c951") self.assertIn( '0e1aa10d9ecfb1cb3781a3f885195f61505e0a4557026a07bd07bf5bd876c951', s.analyzed_dex) dexfiles = list(s.get_objects_dex()) self.assertEqual(len(dexfiles), 1) df = dexfiles[0] self.assertEqual( df[0], "0e1aa10d9ecfb1cb3781a3f885195f61505e0a4557026a07bd07bf5bd876c951") self.assertIsInstance(df[1], DalvikVMFormat) self.assertIsInstance(df[2], Analysis) self.assertIn(df[1], df[2].vms) x = s.add("examples/android/TestsAndroguard/bin/TestActivity.apk") self.assertEqual( x, '3bb32dd50129690bce850124ea120aa334e708eaa7987cf2329fd1ea0467a0eb') self.assertIn( '2f24538b3064f1f88d3eb29ee7fbd2146779a4c9144aefa766d18965be8775c7', s.analyzed_dex) dexfiles = list(s.get_objects_dex()) self.assertEqual(len(dexfiles), 2) self.assertEqual( sorted([ '0e1aa10d9ecfb1cb3781a3f885195f61505e0a4557026a07bd07bf5bd876c951', '2f24538b3064f1f88d3eb29ee7fbd2146779a4c9144aefa766d18965be8775c7' ]), sorted(map(lambda x: x[0], dexfiles)))
help="Use a different decompiler (default: DAD)") return parser if __name__ == "__main__": parser = get_parser() args = parser.parse_args() if args.file and args.input: print("Can not give --input and positional argument! Please use only one of them!", file=sys.stderr) sys.exit(1) if args.version: print("Androaxml version %s" % androconf.ANDROGUARD_VERSION) sys.exit(0) if not args.input and not args.file: print("Give one file to decode!", file=sys.stderr) sys.exit(1) if args.input: fname = args.input else: fname = args.file s = session.Session() with open(fname, "rb") as fd: s.add(fname, fd.read()) export_apps_to_format(fname, s, args.output, args.limit, args.jar, args.decompiler, args.format)