#!/usr/bin/python # -*- coding: utf-8 -*- from manifest import AndroidManifest from panel import PermsPanel from pychrysalide import Plugin from pychrysalide.gui.panels import PanelItem from xml.dom import minidom import gtk import zipfile class AndroPerms(Plugin): """List all permissions given to an APK files.""" def get_action(self): """Register the plugin for given actions.""" return Plugin.PGA_DISASS_PROCESS def execute_on_binary(self, binary, action): """Process once a binary is disassembled.""" zf = zipfile.ZipFile(binary.get_filename()) f = zf.open('AndroidManifest.xml', 'r') data = f.read() f.closed manifest = AndroidManifest(data) xml = minidom.parseString(manifest.getXML()) print print "Permissions for ", binary.get_filename(), " :" print "-------------" print plist = [] for p in xml.getElementsByTagName("uses-permission"): plist.append(p.getAttribute("android:name")) print p.getAttribute("android:name") print panel = PermsPanel() self._build_panel_item() panel.filter_permissions(plist) instrs = binary.get_instructions() buffer = binary.disassembled_buffer for i in instrs: if i.keyword.startswith("invoke"): line = buffer.find_line_by_addr(i.address) text = line.get_text() panel.check_call(i.address, text) panel.fill_tree(self._store) self._tree.expand_all() def _build_panel_item(self): self._scrolled_window = gtk.ScrolledWindow() self._scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self._scrolled_window.show() self._tree = gtk.TreeView() self._tree.set_headers_visible(False) self._tree.show() self._scrolled_window.add_with_viewport(self._tree) locations = gtk.TreeViewColumn() self._tree.append_column(locations) cell = gtk.CellRendererPixbuf() locations.pack_start(cell, False) locations.add_attribute(cell, 'pixbuf', 0) cell = gtk.CellRendererText() locations.pack_start(cell, False) locations.add_attribute(cell, 'text', 1) functions = gtk.TreeViewColumn() self._tree.append_column(functions) cell = gtk.CellRendererPixbuf() functions.pack_start(cell, False) functions.add_attribute(cell, 'pixbuf', 2) cell = gtk.CellRendererText() functions.pack_start(cell, True) functions.add_attribute(cell, 'text', 3) self._store = gtk.TreeStore(gtk.gdk.Pixbuf, str, gtk.gdk.Pixbuf, str) self._tree.set_model(self._store) pi = PanelItem('Permissions', 'Permissions', self._scrolled_window, 'SE') pi.dock()