Skip to content

Instantly share code, notes, and snippets.

@diarmaid-mcmanus
Created September 29, 2013 23:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save diarmaid-mcmanus/6757352 to your computer and use it in GitHub Desktop.
Save diarmaid-mcmanus/6757352 to your computer and use it in GitHub Desktop.
A quick script that uses androguard to rip out some info I wanted from an Android APK's AndroidManifest.xml file.
import sys
from androguard.core.bytecodes import apk
class Interface: # need to rename this
def __init__(self):
self.enabled = None
self.exported = None
self.label = None
self.name = None
# todo permission
self.process = None
class Service(Interface):
def __init__(self):
self.isolated_process = None
class Provider(Interface):
def __init__(self):
self.authorities = None # todo - csv, needs to be split up
self.grant_uri_permissions = None
self.permission = None
self.read_permission = None
self.write_permission = None
class Napkin:
def __init__(self, filename):
apk_file = apk.APK(filename)
self.manifest = apk_file.get_AndroidManifest().getElementsByTagName("manifest")[0]
def __is_enabled(self, element):
try:
if element.attributes["android:enabled"].value == 'true':
return True
else:
return False
except KeyError:
return True
def __is_exported(self, element):
try:
if element.attributes["android:exported"].value == 'true':
return True
else:
return False
except KeyError:
if len(element.getElementsByTagName("intent-filter")) > 0:
return True
else:
return False
def __get_label(self, element):
try:
return element.attributes["android:label"].value
except KeyError:
return self.manifest.getElementsByTagName("application")[0].attributes["android:label"].value
def __get_process(self, element):
try:
return element.attributes["android:process"].value
except KeyError:
try:
return self.manifest.getElementsByTagName("application")[0].attributes["android:process"].value
except KeyError:
return self.get_package()
def __get_isolated_process(self, element):
try:
if element.attributes["android:isolatedProccess"].value == 'true':
return True
else:
return False
except KeyError:
return False
def __get_grant_uri_permissions(self, element):
try:
if element.attributes["android:grantUriPermissions"].value == 'true':
return True
else:
return False
except KeyError:
return False
def __get_permission(self, element):
try:
return element.attributes["android:permission"].value
except KeyError:
return None
def __get_read_permission(self, element):
try:
return element.attributes["android:readPermission"].value
except KeyError:
return None
def __get_write_permission(self, element):
try:
return element.attributes["android:writePermission"].value
except KeyError:
return None
def get_uses_permissions(self):
permissions = []
for uses_permission in self.manifest.getElementsByTagName("uses-permission"):
permissions.append(uses_permission.attributes["android:name"].value)
return permissions
def get_permissions(self):
permissions = []
for permission in self.manifest.getElementsByTagName("permission"):
permissions.append(permission.attributes["android:name"].value)
return permissions
def get_package(self):
return self.manifest.attributes["package"].value
def get_apk_version(self):
return self.manifest.attributes["android:versionName"].value
def get_services(self):
services = []
application = self.manifest.getElementsByTagName("application")[0]
for service in application.getElementsByTagName("service"):
interface = Service()
interface.enabled = True if self.__is_enabled(service) else False
interface.exported = True if self.__is_exported(service) else False
interface.label = self.__get_label(service)
interface.name = service.attributes["android:name"].value
interface.process = self.__get_process(service)
interface.isolated_process = self.__get_isolated_process(service)
services.append(interface)
return services
def get_receivers(self):
receivers = []
application = self.manifest.getElementsByTagName("application")[0]
for receiver in application.getElementsByTagName("receiver"):
interface = Interface() # i really need to rename this
interface.enabled = True if self.__is_enabled(receiver) else False
interface.exported = True if self.__is_exported(receiver) else False
interface.label = self.__get_label(receiver)
interface.name = receiver.attributes["android:name"].value
interface.process = self.__get_process(receiver)
receivers.append(interface)
return receivers
def get_providers(self):
providers = []
application = self.manifest.getElementsByTagName("application")[0]
for provider in application.getElementsByTagName("provider"):
interface = Provider()
interface.enabled = True if self.__is_enabled(provider) else False
interface.exported = True if self.__is_exported(provider) else False
interface.label = self.__get_label(provider)
interface.name = provider.attributes["android:name"].value
interface.process = self.__get_process(provider)
interface.authorities = provider.attributes["android:authorities"].value
interface.grant_uri_permissions = self.__get_grant_uri_permissions(provider)
interface.permission = self.__get_permission(provider)
interface.read_permission = self.__get_read_permission(provider)
interface.write_permission = self.__get_write_permission(provider)
providers.append(interface)
return providers
def get_uses_library(self):
uses_libraries = []
application = self.manifest.getElementsByTagName("application")[0]
for library in application.getElementsByTagName("uses-library"):
uses_libraries.append(library.attributes["android:name"].value)
return uses_libraries
napkin = Napkin(sys.argv[1])
print "App: " + napkin.get_package() + ":" + napkin.get_apk_version() + "\n"
print "Uses Permissions:"
for uses_permission in napkin.get_uses_permissions():
print uses_permission
print "\nPermissions:"
for permission in napkin.get_permissions():
print permission
print "\nServices:"
for service in napkin.get_services():
print service.label
print "\nReceivers:"
for receiver in napkin.get_receivers():
print receiver.label
print "\nProviders:"
for provider in napkin.get_providers():
print provider.label
print "\nUses Library:"
for library in napkin.get_uses_library():
print library
App: com.android.email:3.0.0
Uses Permissions:
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.READ_CONTACTS
android.permission.READ_OWNER_DATA
android.permission.ACCESS_NETWORK_STATE
android.permission.INTERNET
android.permission.VIBRATE
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.GET_ACCOUNTS
android.permission.MANAGE_ACCOUNTS
android.permission.AUTHENTICATE_ACCOUNTS
android.permission.READ_SYNC_SETTINGS
android.permission.WRITE_SYNC_SETTINGS
android.permission.RECEIVE_WAP_PUSH
android.permission.WRITE_CONTACTS
android.permission.WRITE_CALENDAR
android.permission.READ_CALENDAR
android.permission.WAKE_LOCK
android.permission.READ_PHONE_STATE
com.sonyericsson.r2r.client.permission.DOWNLOAD_SETTINGS
com.sonyericsson.home.permission.BROADCAST_BADGE
com.android.email.permission.READ_ATTACHMENT
com.android.email.permission.ACCESS_PROVIDER
Permissions:
com.android.email.permission.READ_ATTACHMENT
com.android.email.permission.ACCESS_PROVIDER
Services:
@7F070019
@7F070019
@7F070019
@7F070019
@7F070019
@7F070019
@7F070019
Receivers:
@7F070019
@7F070019
@7F070019
@7F070019
@7F070109
@7F070019
@7F070019
Providers:
@7F070019
@7F070019
@7F070019
Uses Library:
com.sonyericsson.smartslider
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment