diff options
-rw-r--r-- | ChangeLog | 24 | ||||
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | plugins/python/Makefile.am | 2 | ||||
-rw-r--r-- | plugins/python/androperms/Makefile.am | 23 | ||||
-rw-r--r-- | plugins/python/androperms/__init__.py | 2 | ||||
-rw-r--r-- | plugins/python/androperms/android.png | bin | 1102 -> 0 bytes | |||
-rw-r--r-- | plugins/python/androperms/androperms.py | 89 | ||||
-rw-r--r-- | plugins/python/androperms/db.py | 94 | ||||
-rw-r--r-- | plugins/python/androperms/defs.py | 53 | ||||
-rw-r--r-- | plugins/python/androperms/manifest.py | 75 | ||||
-rw-r--r-- | plugins/python/androperms/panel.py | 125 | ||||
-rw-r--r-- | plugins/python/androperms/parser.py | 328 | ||||
-rw-r--r-- | plugins/python/androperms/reader.py | 41 | ||||
-rw-r--r-- | plugins/python/androperms/routine.png | bin | 568 -> 0 bytes | |||
-rw-r--r-- | plugins/python/androperms/stack.py | 108 | ||||
-rw-r--r-- | plugins/python/androperms/string.py | 82 |
16 files changed, 25 insertions, 1022 deletions
@@ -1,3 +1,27 @@ +16-05-28 Cyrille Bagard <nocbos@gmail.com> + + * configure.ac: + Remove the Makefile from the 'plugins/python/androperms' directory. + + * plugins/python/Makefile.am: + Remove androperms from SUBDIRS. Remove the old Python plugin reading + android permissions. + + * plugins/python/androperms/Makefile.am: + * plugins/python/androperms/__init__.py: + * plugins/python/androperms/android.png: + * plugins/python/androperms/androperms.py: + * plugins/python/androperms/db.py: + * plugins/python/androperms/defs.py: + * plugins/python/androperms/manifest.py: + * plugins/python/androperms/panel.py: + * plugins/python/androperms/parser.py: + * plugins/python/androperms/reader.py: + * plugins/python/androperms/routine.png: + * plugins/python/androperms/stack.py: + * plugins/python/androperms/string.py: + Deleted entries. + 16-05-27 Cyrille Bagard <nocbos@gmail.com> * src/arch/arm/v7/pseudo.c: diff --git a/configure.ac b/configure.ac index e8291b3..f856168 100644 --- a/configure.ac +++ b/configure.ac @@ -321,7 +321,6 @@ AC_CONFIG_FILES([Makefile plugins/pychrysa/gui/Makefile plugins/pychrysa/gui/panels/Makefile plugins/python/Makefile - plugins/python/androperms/Makefile plugins/python/apkfiles/Makefile plugins/python/exectracer/Makefile plugins/python/samples/Makefile diff --git a/plugins/python/Makefile.am b/plugins/python/Makefile.am index f54e1be..ae5baed 100644 --- a/plugins/python/Makefile.am +++ b/plugins/python/Makefile.am @@ -1,2 +1,2 @@ -SUBDIRS = androperms apkfiles samples welcome +SUBDIRS = apkfiles samples welcome diff --git a/plugins/python/androperms/Makefile.am b/plugins/python/androperms/Makefile.am deleted file mode 100644 index b1a1e4e..0000000 --- a/plugins/python/androperms/Makefile.am +++ /dev/null @@ -1,23 +0,0 @@ - -andropermsdir = $(datadir)/openida/plugins/python/androperms - -androperms_DATA = \ - __init__.py \ - android.png \ - androperms.db \ - androperms.py \ - db.py \ - defs.py \ - manifest.py \ - panel.py \ - parser.py \ - reader.py \ - routine.png \ - stack.py \ - string.py - -androperms.db: - @tmpzip=`tempfile` ; \ - wget http://www.android-permissions.org/permissionmap.zip -O $$tmpzip ; \ - unzip -p $$tmpzip permissionmap/APICalls.txt | tail -n +2 - > androperms.db ; \ - rm $$tmpzip diff --git a/plugins/python/androperms/__init__.py b/plugins/python/androperms/__init__.py deleted file mode 100644 index 8a5a159..0000000 --- a/plugins/python/androperms/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ - -from androperms import AndroPerms as androperms diff --git a/plugins/python/androperms/android.png b/plugins/python/androperms/android.png Binary files differdeleted file mode 100644 index ce9c905..0000000 --- a/plugins/python/androperms/android.png +++ /dev/null diff --git a/plugins/python/androperms/androperms.py b/plugins/python/androperms/androperms.py deleted file mode 100644 index f68b9a5..0000000 --- a/plugins/python/androperms/androperms.py +++ /dev/null @@ -1,89 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -from manifest import AndroidManifest -from db import PermsDataBase -from panel import PermsPanel -from pychrysalide import Plugin -from pychrysalide.format.dex import DexFormat -from xml.dom import minidom - -import re -import zipfile - - -class AndroPerms(Plugin): - """List all permissions given to an APK files.""" - - def init(self, ref): - """Initialize the plugin.""" - - self._panel = PermsPanel() - - return True - - - 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.""" - - fmt = binary.get_format() - if not isinstance(fmt, DexFormat): - return False - - 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 - - db = PermsDataBase() - db.filter_permissions(plist) - - instrs = binary.get_instructions() - buf = binary.disassembled_buffer - - pfn = re.compile('<.* ([^ ]*)\(') - - for i in instrs: - - if i.keyword.startswith("invoke"): - - line = buf.find_line_by_addr(i.address) - text = line.get_text() - - name = pfn.search(text) - - if name != None: - - resolved = fmt.resolve_relative_routine(i.address) - - if resolved == None: - reladdr = "0x%08x" % i.address - else: - reladdr = "<%s()+0x%x>" % (resolved[0], resolved[1]) - - db.check_call(i.address, name.group(1), reladdr) - - self._panel.memorize_permissions(binary, db.get_used_permissions()) diff --git a/plugins/python/androperms/db.py b/plugins/python/androperms/db.py deleted file mode 100644 index 7014915..0000000 --- a/plugins/python/androperms/db.py +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -import os - - -class PermsDataBase: - """Display all permissions found in the Manifest.""" - - def __init__(self): - - self._perms = { } - self._used = { } - - self._load_all_definitions() - - - def _load_all_definitions(self): - """Load the database in memory.""" - - with open(os.path.dirname(__file__) + '/androperms.db', 'r') as f: - - for line in f.readlines(): - - perm = line.strip("\n").split("\t") - - for p in perm[1].split(" "): - - if not p.startswith("android.permission."): - continue - - if p not in self._perms: - self._perms[p] = [] - - call = perm[0].split("(")[0] - - if call not in self._perms[p]: - self._perms[p].append(call) - - - def filter_permissions(self, used): - """Forget all permissions which are not used.""" - - keep = {} - - for p in self._perms: - if p in used: - keep[p] = self._perms[p] - - self._perms = keep - - for p in keep: - self._used[p] = [] - - - def check_call(self, addr, line, reladdr): - """Check if a call requires some rights.""" - - found = False - - for p in self._perms: - - if line.find("Wall") > -1: - print "[+]", line, ' ==> ', p - - for c in self._perms[p]: - - #print " - ", c - - #if line.find(c) > -1: - if c.find(line) > -1: - self._used[p].append([reladdr, c + "()", addr]) - found = True - - # if not found: - - # func = line.split('.')[-1] - - # for p in self._perms: - - # for c in self._perms[p]: - - # if c.find(func) > -1: - - # #print ">>> %s found in %s" % (func, c) - - # self._used[p].append([reladdr, line + "()", addr]) - # break - - - def get_used_permissions(self): - """Provide the list of used permissions.""" - - return self._used diff --git a/plugins/python/androperms/defs.py b/plugins/python/androperms/defs.py deleted file mode 100644 index e23511e..0000000 --- a/plugins/python/androperms/defs.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/python -u -# -*- coding: utf-8 -*- - - -ATTRIBUTE_IX_NAMESPACE_URI = 0 -ATTRIBUTE_IX_NAME = 1 -ATTRIBUTE_IX_VALUE_STRING = 2 -ATTRIBUTE_IX_VALUE_TYPE = 3 -ATTRIBUTE_IX_VALUE_DATA = 4 -ATTRIBUTE_LENGHT = 5 - -TYPE_NULL = 0 -TYPE_REFERENCE = 1 -TYPE_ATTRIBUTE = 2 -TYPE_STRING = 3 -TYPE_FLOAT = 4 -TYPE_DIMENSION = 5 -TYPE_FRACTION = 6 -TYPE_FIRST_INT = 16 -TYPE_INT_DEC = 16 -TYPE_INT_HEX = 17 -TYPE_INT_BOOLEAN = 18 -TYPE_FIRST_COLOR_INT = 28 -TYPE_INT_COLOR_ARGB8 = 28 -TYPE_INT_COLOR_RGB8 = 29 -TYPE_INT_COLOR_ARGB4 = 30 -TYPE_INT_COLOR_RGB4 = 31 -TYPE_LAST_COLOR_INT = 31 -TYPE_LAST_INT = 31 - -RADIX_MULTS = [ 0.00390625, 3.051758E-005, 1.192093E-007, 4.656613E-010 ] -DIMENSION_UNITS = [ "px", "dip", "sp", "pt", "in", "mm", "", "" ] -FRACTION_UNITS = [ "%", "%p", "", "", "", "", "", "" ] -COMPLEX_UNIT_MASK = 15 - - -CHUNK_AXML_FILE = 0x00080003 -CHUNK_RESOURCEIDS = 0x00080180 -CHUNK_XML_FIRST = 0x00100100 -CHUNK_XML_START_NAMESPACE = 0x00100100 -CHUNK_XML_END_NAMESPACE = 0x00100101 -CHUNK_XML_START_TAG = 0x00100102 -CHUNK_XML_END_TAG = 0x00100103 -CHUNK_XML_TEXT = 0x00100104 -CHUNK_XML_LAST = 0x00100104 -CHUNK_TYPE = 0x001C0001 - - -START_DOCUMENT = 0 -END_DOCUMENT = 1 -START_TAG = 2 -END_TAG = 3 -TEXT = 4 diff --git a/plugins/python/androperms/manifest.py b/plugins/python/androperms/manifest.py deleted file mode 100644 index 63536b2..0000000 --- a/plugins/python/androperms/manifest.py +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -from defs import * -from reader import AXMLReader -from parser import AXMLParser - - -class AndroidManifest(): - - - def __init__(self, data): - - self._buffer = "" - - reader = AXMLReader(data) - parser = AXMLParser(reader) - - has_ns = False - empty = False - - while 1 : - - tag = parser.next() - - if tag == START_DOCUMENT : - self._buffer += '<?xml version="1.0" encoding="utf-8"?>\n' - - elif tag == START_TAG: - - if empty: - self._buffer += '>\n' - - self._buffer += ' ' * (parser._namespaces.getDepth() - 2) - self._buffer += "<%s%s" % (parser.getTagPrefix(), parser.getTagName()) - - if not has_ns: - self._buffer += ' xmlns:%s="%s"' % (parser.getNamespacePrefix(0), parser.getNamespaceUri(0)) - has_ns = True - - for i in range(0, parser.countAttributes()): - self._buffer += ' %s%s="%s"' % (parser.getAttribPrefix(i), parser.getAttribName(i), parser.getAttribValue(i)) - - empty = True - - elif tag == END_TAG: - - if empty: - self._buffer += '/>\n' - empty = False - - else: - self._buffer += ' ' * (parser._namespaces.getDepth() - 2) - self._buffer += "</%s%s>\n" % (parser.getTagPrefix(), parser.getTagName()) - - elif tag == TEXT: - - if empty: - self._buffer += '>\n' - empty = False - - self._buffer += ' ' * (parser._namespaces.getDepth() - 1) - self._buffer += "%s\n" % parser.getText() - - elif tag == END_DOCUMENT : - break - - else: - break - - - def getXML(self): - """Provide the XML content.""" - - return self._buffer diff --git a/plugins/python/androperms/panel.py b/plugins/python/androperms/panel.py deleted file mode 100644 index 8f8e925..0000000 --- a/plugins/python/androperms/panel.py +++ /dev/null @@ -1,125 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- - -from pychrysalide.format.dex import DexFormat -from pychrysalide.gui.panels import PanelItem - -import gtk -import os - - -def _build_permissions_panel_content(): - """Build content for permissions panels.""" - - scrolled_window = gtk.ScrolledWindow() - scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - scrolled_window.show() - - tree = gtk.TreeView() - tree.set_headers_visible(False) - tree.show() - scrolled_window.add_with_viewport(tree) - - locations = gtk.TreeViewColumn() - 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() - 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) - - store = gtk.TreeStore(gtk.gdk.Pixbuf, str, gtk.gdk.Pixbuf, str, str) - tree.set_model(store) - - return scrolled_window, tree, store - - -class PermsPanel(PanelItem): - """Display all permissions found in the Manifest.""" - - def __new__(cls): - """Create the GLib instance relative this class as soon as possible, - for the pygobject registering process.""" - - scrolled_window, tree, store = _build_permissions_panel_content() - - self = super(PermsPanel, cls).__new__(cls, 'Permissions', 'Android Permissions', \ - scrolled_window, 'SE') - - self._scrolled_window = scrolled_window - self._tree = tree - self._store = store - - self._perms = {} - - return self - - - def __init__(self): - """Initialize the Python instance of the panel.""" - - self._tree.connect('row-activated', self._on_row_selection) - - self.dock() - self.register() - - - def memorize_permissions(self, binary, perms): - """Attach found permissions to a new loaded binary.""" - - self._perms[binary] = perms - - - def update_for_binary(self, binary): - """Fill the treeview with all found permissions for the given binary.""" - - self._store.clear() - - fmt = binary.get_format() - if not isinstance(fmt, DexFormat): - return False - - used = self._perms[binary] - - for p in used: - - if len(used[p]) > 0 or True: - - img = os.path.dirname(os.path.abspath(__file__)) + '/android.png' - buf = gtk.gdk.pixbuf_new_from_file(img) - - it = self._store.append(None, [buf, p, None, None, None]) - - img = os.path.dirname(os.path.abspath(__file__)) + '/routine.png' - buf = gtk.gdk.pixbuf_new_from_file(img) - - for f in used[p]: - self._store.append(it, [None, f[0], buf, f[1], f[2]]) - - self._tree.expand_all() - - - def _on_row_selection(self, treeview, path, column): - """Scroll the current view to the selected address.""" - - selection = treeview.get_selection() - model, it = selection.get_selected() - - # On ne traite que les lignes de code - if model.get_value(it, 0) == None: - - self.get_current_view().scroll_to_address(int(model.get_value(it, 4))) diff --git a/plugins/python/androperms/parser.py b/plugins/python/androperms/parser.py deleted file mode 100644 index 1939bbe..0000000 --- a/plugins/python/androperms/parser.py +++ /dev/null @@ -1,328 +0,0 @@ -#!/usr/bin/python -u -# -*- coding: utf-8 -*- - - -from defs import * -from stack import NamespaceStack -from string import StringBlock - -from struct import unpack - - -class AXMLParser(): - - - def __init__(self, reader): - - self._reader = reader - - magic = reader.readInt() - if magic != CHUNK_AXML_FILE: - raise Exception('Bad Magic Number (0x%08lx)!' % magic) - - # chunkSize - reader.skipInt() - - self._strings = StringBlock(reader) - self._namespaces = NamespaceStack() - self._operational = True - - self.resetEventInfo() - - - def resetEventInfo(self): - - self._event = -1 - self._line_number = -1 - self._name = -1 - self._namespace_uri = -1 - self._attributes = None - self._id_attrib = -1 - self._class_attrib = -1 - self._style_attrib = -1 - - self._decreaseDepth = False - - - - def next(self): - - self.doNext() - return self._event - - - def doNext(self): - - - - - - event = self._event - - - while True: - - if self._decreaseDepth: - self._decreaseDepth = False - self._namespaces.decDepth() - - # Fake END_DOCUMENT event. - if event == END_TAG and self._namespaces.getDepth() == 1 and self._namespaces.count() == 0: - self._event = END_DOCUMENT - break - - if event == START_DOCUMENT: - # Fake event, see CHUNK_XML_START_TAG handler. - chunk = CHUNK_XML_START_TAG - - else: - chunk = self._reader.readInt() - - if chunk == CHUNK_RESOURCEIDS: - - size = self._reader.readInt() - if size < 8 or size % 4 != 0: - raise Exception('Invalid resource ids size (%d).' % size) - - self._resource_ids = self._reader.readIntArray(size / 4 - 2) - - continue - - if chunk < CHUNK_XML_FIRST or chunk > CHUNK_XML_LAST: - raise Exception('Invalid chunk type 0x%08lx.' % chunk) - - # Fake START_DOCUMENT event. - if chunk == CHUNK_XML_START_TAG and event == -1: - self._event = START_DOCUMENT - break - - # Common header. - self._reader.skipInt() # chunkSize - self._line_number = self._reader.readInt() - self._reader.skipInt() # 0xffffffff - - if chunk == CHUNK_XML_START_NAMESPACE or chunk == CHUNK_XML_END_NAMESPACE: - - if chunk == CHUNK_XML_START_NAMESPACE: - - prefix = self._reader.readInt() - uri = self._reader.readInt() - self._namespaces.push(prefix, uri) - - else: - - self._reader.skipInt() # prefix - self._reader.skipInt() # uri - self._namespaces.pop() - - continue - - elif chunk == CHUNK_XML_START_TAG: - - self._namespace_uri = self._reader.readInt() - self._name = self._reader.readInt() - self._reader.skipInt() # flags ? - - attribs_count = self._reader.readInt() - self._id_attrib = (attribs_count >> 16) - 1 - attribs_count &= 0xffff - - self._class_attrib = self._reader.readInt() - self._style_attrib = (self._class_attrib >> 16) - 1 - self._class_attrib = (self._class_attrib & 0xffff) - 1 - - self._attributes = self._reader.readIntArray(attribs_count * ATTRIBUTE_LENGHT) - - for i in range(ATTRIBUTE_IX_VALUE_TYPE, len(self._attributes), ATTRIBUTE_LENGHT): - self._attributes[i] >>= 24 - - self._namespaces.incDepth() - self._event = START_TAG - - break - - elif chunk == CHUNK_XML_END_TAG: - - self._namespaceUri = self._reader.readInt() - self._name = self._reader.readInt() - - self._event = END_TAG - self._decreaseDepth = True - - break - - elif chunk == CHUNK_XML_TEXT: - - self._name = self._reader.readInt() - self._reader.skipInt() # ??? - self._reader.skipInt() # ??? - - self._event=TEXT - - break - - else: - raise Exception('Unknown chunck (0x%08lx)' % chunk) - - - ### ESPACES ### - - def getNamespacePrefix(self, index): - - name = self._namespaces.getPrefix(index) - - if name == -1: - return '' - - else: - return self._strings.getRaw(name) - - - def getNamespaceUri(self, index): - - name = self._namespaces.getUri(index) - - if name == -1: - return '' - - else: - return self._strings.getRaw(name) - - - ### NAMES ### - - def getTagPrefix(self): - """Provide the prefix linked to START_TAG or END_TAG.""" - - name = self._namespaces.findPrefix(self._namespace_uri) - - if name == -1: - return '' - - else: - return self._strings.getRaw(name) + ':' - - - def getTagName(self): - """Provide the name linked to START_TAG or END_TAG.""" - - if self._name == -1 or (self._event != START_TAG and self._event != END_TAG): - raise Exception('Invalid tag name.') - - return self._strings.getRaw(self._name) - - - def getText(self): - """Provide the content linked to TEXT.""" - - if self._name == -1 or self._event != START_TEXT: - raise Exception('Invalid text content.') - - return self._strings.getRaw(self._name) - - - ### ATRIBUTES ### - - def countAttributes(self): - """Count the properties of the current tag.""" - - if self._event != START_TAG: - raise Exception('Invalid event.') - - return len(self._attributes) / ATTRIBUTE_LENGHT - - - def getAttribPrefix(self, index): - """Get the prefix of a given attribute.""" - - index *= ATTRIBUTE_LENGHT - - if index >= len(self._attributes): - raise Exception('Bad attribute index.') - - uri = self._attributes[index + ATTRIBUTE_IX_NAMESPACE_URI] - name = self._namespaces.findPrefix(uri) - - if name == -1: - return '' - - else: - return self._strings.getRaw(name) + ':' - - - def getAttribName(self, index): - """Get the name of a given attribute.""" - - index *= ATTRIBUTE_LENGHT - - if index >= len(self._attributes): - raise Exception('Bad attribute index.') - - name = self._attributes[index + ATTRIBUTE_IX_NAME] - - if name == -1: - return '???' - - else: - return self._strings.getRaw(name) - - - def getAttribValue(self, index): - """Get the value of a given attribute.""" - - index *= ATTRIBUTE_LENGHT - - if index >= len(self._attributes): - raise Exception('Bad attribute index.') - - vtype = self._attributes[index + ATTRIBUTE_IX_VALUE_TYPE] - vdata = self._attributes[index + ATTRIBUTE_IX_VALUE_DATA] - - if vtype == TYPE_NULL: - return '???' - - elif vtype == TYPE_REFERENCE: - return '@%s%08X' % (self.getPackage(vdata), vdata) - - elif vtype == TYPE_ATTRIBUTE: - return '?%s%08X' % (self.getPackage(vdata), vdata) - - if vtype == TYPE_STRING: - vdata = self._attributes[index + ATTRIBUTE_IX_VALUE_STRING] - return self._strings.getRaw(vdata) - - elif vtype == TYPE_FLOAT: - return '%f' % unpack('=f', pack('=L', vdata))[0] - - elif vtype == TYPE_DIMENSION: - return '%f%s' % (self.complexToFloat(vdata), DIMENSION_UNITS[vdata & COMPLEX_UNIT_MASK]) - - elif vtype == TYPE_FRACTION: - return '%f%s' % (self.complexToFloat(vdata), FRACTION_UNITS[vdata & COMPLEX_UNIT_MASK]) - - elif vtype == TYPE_INT_HEX: - return '0x%08x' % vdata - - elif vtype == TYPE_INT_BOOLEAN: - if vdata == 0: - return 'false' - else: - return 'true' - - elif vtype >= TYPE_FIRST_COLOR_INT and vtype <= TYPE_LAST_COLOR_INT: - return '#%08x' % vdata - - elif vtype >= TYPE_FIRST_INT and vtype <= TYPE_LAST_INT: - return str(vdata) - - return "<0x%x, 0x%02x>" % (vdata, vtype) - - - def complexToFloat(self, xcomplex): - return (float)(xcomplex & 0xffffff00) * RADIX_MULTS[(xcomplex >> 4) & 3]; - - def getPackage(self, id): - if id >> 24 == 1: - return "android:" - else: - return "" diff --git a/plugins/python/androperms/reader.py b/plugins/python/androperms/reader.py deleted file mode 100644 index f126850..0000000 --- a/plugins/python/androperms/reader.py +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/python -u -# -*- coding: utf-8 -*- - - -from struct import unpack - - -class AXMLReader(): - """Provide various read helpers.""" - - def __init__(self, data): - - self._data = data - - self._position = 0 - self._length = len(self._data) - - - def readInt(self): - """Read a 4-bytes value.""" - - self.skipInt() - - value = unpack('<L', self._data[self._position - 4 : self._position])[0] - - return value - - - def skipInt(self): - """Skip a 4-bytes value.""" - - self._position += 4 - - if self._position > self._length: - raise Exception("Reader out of bound (%d > %d)!" % (self._position, self._length)) - - - def readIntArray(self, length): - """Read an array composed of 4-bytes values.""" - - return [ self.readInt() for i in range(0, length) ] diff --git a/plugins/python/androperms/routine.png b/plugins/python/androperms/routine.png Binary files differdeleted file mode 100644 index 2ddc67a..0000000 --- a/plugins/python/androperms/routine.png +++ /dev/null diff --git a/plugins/python/androperms/stack.py b/plugins/python/androperms/stack.py deleted file mode 100644 index 38431dc..0000000 --- a/plugins/python/androperms/stack.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/python -u -# -*- coding: utf-8 -*- - - -class NamespaceStack(): - - - def __init__(self): - - # self.increaseDepth() - - - self._depth = 1 - - self._prefix_2_uri = {} - self._uri_2_prefix = {} - - self._pairs = [] - - pass - - - - def getDepth(self): - - return self._depth - - - def incDepth(self): - - self._depth += 1 - - - def decDepth(self): - - self._depth -= 1 - - - - - - def count(self): - """Provider the current number of active namespaces.""" - - return len(self._pairs) - - - - - - - - def push(self, prefix, uri): - - self._prefix_2_uri[prefix] = uri - self._uri_2_prefix[uri] = prefix - - self._pairs.append((prefix, uri)) - - #print "PUSH", prefix, uri - - - - - def pop(self): - - self._pairs.pop() - - #print "POP" - - - - - - def getPrefix(self, index): - - if index < len(self._pairs): - return self._pairs[index][0] - - else: - return -1 - - - def findPrefix(self, uri): - - if uri in self._uri_2_prefix: - return self._uri_2_prefix[uri] - - else: - return -1 - - - def getUri(self, index): - - if index < len(self._pairs): - return self._pairs[index][1] - - else: - return -1 - - - def findUri(self, prefix): - - if prefix in self._prefix_2_uri: - return self._prefix_2_uri[prefix] - - else: - return -1 diff --git a/plugins/python/androperms/string.py b/plugins/python/androperms/string.py deleted file mode 100644 index 09a7b93..0000000 --- a/plugins/python/androperms/string.py +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/python -u -# -*- coding: utf-8 -*- - - -from defs import CHUNK_TYPE - - -class StringBlock(): - - - def __init__(self, reader): - - magic = reader.readInt() - if magic != CHUNK_TYPE: - raise Exception("Bad Magic Number (0x%08lx)!" % magic) - - chunk_size = reader.readInt() - str_count = reader.readInt() - style_offset_count = reader.readInt() - reader.readInt() # ??? - str_offset = reader.readInt() - styles_offset = reader.readInt() - - self._str_offsets = reader.readIntArray(str_count); - self._style_offsets = reader.readIntArray(style_offset_count); - - if styles_offset == 0: - size = chunk_size - str_offset - else: - size = styles_offset - str_offset - - if size % 4 != 0: - raise Exception("String data size is not multiple of 4 (%d)!" % size) - - self._strings = reader.readIntArray(size / 4) - - if styles_offset > 0: - - size = chunk_size - styles_offset - - if size % 4 != 0: - raise Exception("Style data size is not multiple of 4 (%d)!" % size) - - self._styles = reader.readIntArray(size / 4) - - self._str_data = [ self.getRaw(i) for i in range(self.count()) ] - - - def count(self): - """Count the number of strings in the current block.""" - - return len(self._str_offsets) - - - def getRaw(self, index): - """Provide a raw string (without any styling information) at specified index.""" - - if index < 0 or index >= len(self._str_offsets): - raise Exception("Invalid Index (%d)!" % index) - - offset = self._str_offsets[index] - length = self.getShort(self._strings, offset) - - data = '' - - for i in range(length): - offset += 2 - data += unichr(self.getShort(self._strings, offset)) - - return data - - - def getShort(self, array, offset): - - value = array[offset / 4] - - if ((offset % 4) / 2) == 0: - value &= 0xFFFF - else: - value >>= 16 - - return value |