def testFeatures(self): from androguard.core.bytecodes.apk import APK # First Demo App a = APK("examples/tests/com.example.android.tvleanback.apk") self.assertListEqual(list(a.get_features()), ["android.hardware.microphone", "android.hardware.touchscreen", "android.software.leanback"]) self.assertTrue(a.is_androidtv()) self.assertFalse(a.is_wearable()) self.assertTrue(a.is_leanback()) # Second Demo App a = APK("examples/tests/com.example.android.wearable.wear.weardrawers.apk") self.assertListEqual(list(a.get_features()), ["android.hardware.type.watch"]) self.assertTrue(a.is_wearable()) self.assertFalse(a.is_leanback()) self.assertFalse(a.is_androidtv()) self.assertListEqual(list(a.get_libraries()), ["com.google.android.wearable"])
def testFeatures(self): from androguard.core.bytecodes.apk import APK # First Demo App a = APK("examples/tests/com.example.android.tvleanback.apk") self.assertListEqual(list(a.get_features()), ["android.hardware.microphone", "android.hardware.touchscreen", "android.software.leanback"]) self.assertTrue(a.is_androidtv()) self.assertFalse(a.is_wearable()) self.assertTrue(a.is_leanback()) # Second Demo App a = APK("examples/tests/com.example.android.wearable.wear.weardrawers.apk") self.assertListEqual(list(a.get_features()), ["android.hardware.type.watch"]) self.assertTrue(a.is_wearable()) self.assertFalse(a.is_leanback()) self.assertFalse(a.is_androidtv()) self.assertListEqual(list(a.get_libraries()), ["com.google.android.wearable"])
def extract_attributes(sha256): with NamedTemporaryFile() as f: f.write(default_storage.open(sha256).read()) f.seek(0) sign = ApplicationSignature.compute_from_apk(f.name) package = sign.handle sign = sign.to_dict() a = APK(f.name) sign['uploaded_at'] = datetime.now() sign['sha256'] = sha256 sign['activities'] = a.get_activities() sign['features'] = a.get_features() sign['libraries'] = a.get_libraries() sign['main_activity'] = a.get_activities() sign['min_sdk_version'] = a.get_min_sdk_version() sign['max_sdk_version'] = a.get_max_sdk_version() sign['target_sdk_version'] = a.get_target_sdk_version() sign['permissions'] = a.get_permissions() sign['aosp_permissions'] = a.get_requested_aosp_permissions() sign[ 'third_party_permissions'] = a.get_requested_third_party_permissions( ) sign['providers'] = a.get_providers() sign['receivers'] = a.get_receivers() sign['services'] = a.get_services() sign['is_valid'] = a.is_valid_APK() sign['is_signed'] = a.is_signed() sign['is_signed_v1'] = a.is_signed_v1() sign['is_signed_v2'] = a.is_signed_v2() sign['is_signed_v3'] = a.is_signed_v3() if not es.exists(settings.ELASTICSEARCH_APK_INDEX, id=sha256): es.index(index=settings.ELASTICSEARCH_APK_INDEX, id=sha256, body=sign) else: es.update(index=settings.ELASTICSEARCH_APK_INDEX, id=sha256, body={'doc': sign}, retry_on_conflict=5) del a, sign, f gc.collect() return package
def extract_features_using_androguard(androguard: APK): resulat_dict = dict() count_dict = dict() _permissions = androguard.get_permissions() _hardwares = list(androguard.get_features()) np = len(_permissions) if np > 0: resulat_dict = { 'defined_perm': dict(Counter(_permissions)), } count_dict = {'num_permission': np} nh = len(_hardwares) if nh > 0: resulat_dict.update({'hardware': dict(Counter(_hardwares))}) count_dict.update({'num_hardware': len(_hardwares)}) # List of all intents in apk _filters = list() # Apk components components_dict = { 'activity': androguard.get_activities(), 'service': androguard.get_services(), 'receiver': androguard.get_receivers(), 'provider': androguard.get_providers() } # Extract intents for categorie, names in components_dict.items(): # Components and Count the number of each components in apk nm = len(names) if nm > 0: count_dict.update({'num_' + categorie: nm}) resulat_dict.update( {categorie: dict(Counter(components_dict[categorie]))}) # Extract intent filter for each component intents = extract_intent(androguard, categorie, names) ni = len(intents) if ni > 0: _filters.extend(intents) count_dict.update({'num_intent_' + categorie: ni}) nf = len(_filters) if nf > 0: resulat_dict.update({'intent': dict(Counter(_filters))}) count_dict.update({'num_intent': nf}) resulat_dict.update({'component_count': count_dict}) return resulat_dict
def lim_features_categories(apk_filepath): try: apk = APK(apk_filepath) info = { 'declared permissions': sorted(apk.get_permissions()), 'activities': apk.get_activities(), 'services': apk.get_services(), 'intent filters': apk.get_intent_filters('receiver', ''), 'content providers': apk.get_providers(), 'broadcast receivers': apk.get_receivers(), 'hardware components': apk.get_features() } for category in info: info[category] = [ feature.replace(".", "_").lower() for feature in info[category] ] return info except: # We just do not process the APK pass