diff options
Diffstat (limited to 'plugins/python/androperms')
| -rw-r--r-- | plugins/python/androperms/androperms.py | 67 | ||||
| -rw-r--r-- | plugins/python/androperms/panel.py | 78 | 
2 files changed, 88 insertions, 57 deletions
| diff --git a/plugins/python/androperms/androperms.py b/plugins/python/androperms/androperms.py index 0d70edc..6d65ca4 100644 --- a/plugins/python/androperms/androperms.py +++ b/plugins/python/androperms/androperms.py @@ -1,9 +1,10 @@  #!/usr/bin/python  # -*- coding: utf-8 -*- -from pychrysalide import Plugin  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 @@ -45,27 +46,69 @@ class AndroPerms(Plugin):          print -        button = gtk.Button("Hello World") -        button.show() - -        treestore = gtk.TreeStore(str, str, str)          panel = PermsPanel() +        self._build_panel_item() + +          panel.filter_permissions(plist) -        #self.add_wgt(panel.get_widget())          instrs = binary.get_instructions() +        buffer = binary.disassembled_buffer + + + +          for i in instrs: -        #    print i, " :: 0x%08lx" % i.address -            line = binary.disassembled_buffer.find_line_by_addr(i.address) -            text = line.get_text() +            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.CellRendererText() +        locations.pack_start(cell, False) +        locations.add_attribute(cell, "text", 0) + +        functions = gtk.TreeViewColumn() +        self._tree.append_column(functions) + +        cell = gtk.CellRendererText() +        functions.pack_start(cell, True) +        functions.add_attribute(cell, "text", 1) + +        self._store = gtk.TreeStore(str, str) +        self._tree.set_model(self._store) -            if text.startswith("invoke"): -                #print "[0x%08lx] " % i.address, text -                pass +        pi = PanelItem(name="Permissions", lname="Permissions", widget=self._scrolled_window, path="S") +        pi.dock() diff --git a/plugins/python/androperms/panel.py b/plugins/python/androperms/panel.py index b852049..ca7bb90 100644 --- a/plugins/python/androperms/panel.py +++ b/plugins/python/androperms/panel.py @@ -1,5 +1,6 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- -import gtk  import os @@ -8,50 +9,12 @@ class PermsPanel:      def __init__(self): - -        tree = gtk.TreeView() - -        languages = gtk.TreeViewColumn() -        languages.set_title("Programming languages") - -        cell = gtk.CellRendererText() -        languages.pack_start(cell, True) -        languages.add_attribute(cell, "text", 0) - -        treestore = gtk.TreeStore(str) - -        it = treestore.append(None, ["Scripting languages"]) -        treestore.append(it, ["Python"]) -        treestore.append(it, ["PHP"]) -        treestore.append(it, ["Perl"]) -        treestore.append(it, ["Ruby"]) - -        it = treestore.append(None, ["Compiling languages"]) -        treestore.append(it, ["C#"]) -        treestore.append(it, ["C++"]) -        treestore.append(it, ["C"]) -        treestore.append(it, ["Java"]) - -        tree.append_column(languages) -        tree.set_model(treestore) - -        tree.show() - -        self._view = tree -          self._perms = { } +        self._used = { }          self._load_all_definitions() -    def get_widget(self): - -        return self._view - - - - -      def _load_all_definitions(self):          """Load the database in memory.""" @@ -69,7 +32,10 @@ class PermsPanel:                      if p not in self._perms:                          self._perms[p] = [] -                    self._perms[p].append(perm[0]) +                    call = perm[0].split("(")[0] + +                    if call not in self._perms[p]: +                        self._perms[p].append(call)      def filter_permissions(self, used): @@ -83,7 +49,29 @@ class PermsPanel:          self._perms = keep -        # for p in self._perms: -        #     print p -        #     for v in self._perms[p]: -        #         print "   - ", v +        for p in keep: +            self._used[p] = [] + + +    def check_call(self, addr, line): +        """Check if a call requires some rights.""" + +        for p in self._perms: + +            for c in self._perms[p]: + +                if line.find(c) > -1: +                    self._used[p].append([addr, c + "()"]) + + +    def fill_tree(self, store): +        """Fill a treeview with all found permissions.""" + +        for p in self._used: + +            if len(self._used[p]) > 0: + +                it = store.append(None, [p, None]) + +                for f in self._used[p]: +                    store.append(it, ["0x%08x" % f[0], f[1]]) | 
