mirror of
https://github.com/MobSF/Mobile-Security-Framework-MobSF.git
synced 2026-10-12 02:06:59 +00:00
* Androguard 293ab2d89ab9ce011c7dbbc5df3c876172875a1c update * AXML Parser warn "reserved must be zero!" instead of raise * Fallback on get app name when androguard returns empty string
95 lines
2.9 KiB
Python
95 lines
2.9 KiB
Python
# -*- coding: utf_8 -*-
|
|
"""Module for apk analysis."""
|
|
import os
|
|
import re
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
from mobsf.StaticAnalyzer.tools.androguard4 import (
|
|
apk,
|
|
)
|
|
from mobsf.MobSF.utils import (
|
|
append_scan_status,
|
|
)
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def parse_apk(checksum, app_path):
|
|
"""Androguard4 APK."""
|
|
try:
|
|
msg = 'Parsing APK with androguard'
|
|
logger.info(msg)
|
|
append_scan_status(checksum, msg)
|
|
return apk.APK(app_path)
|
|
except Exception as exp:
|
|
msg = 'Failed to parse APK with androguard'
|
|
append_scan_status(checksum, msg, repr(exp))
|
|
return None
|
|
|
|
|
|
def get_app_name(a, app_dir, is_apk):
|
|
"""Get app name."""
|
|
base = Path(app_dir)
|
|
if is_apk:
|
|
if a:
|
|
# Parsed Androguard APK Object
|
|
try:
|
|
app_name = a.get_app_name()
|
|
if app_name:
|
|
return app_name
|
|
except Exception:
|
|
logger.warning('Failed to get app name from parsed APK object')
|
|
# Look for app_name in values folder.
|
|
val = base / 'apktool_out' / 'res' / 'values'
|
|
if val.exists():
|
|
try:
|
|
return get_app_name_from_values_folder(val.as_posix())
|
|
except Exception:
|
|
logger.error('Failed to get app name from values folder')
|
|
else:
|
|
# For source code
|
|
try:
|
|
strings_path = base / 'app' / 'src' / 'main' / 'res' / 'values'
|
|
eclipse_path = base / 'res' / 'values'
|
|
if strings_path.exists():
|
|
return get_app_name_from_values_folder(
|
|
strings_path.as_posix())
|
|
elif eclipse_path.exists():
|
|
return get_app_name_from_values_folder(
|
|
eclipse_path.as_posix())
|
|
except Exception:
|
|
logger.error('Failed to get app name')
|
|
logger.warning('Cannot find app name')
|
|
return ''
|
|
|
|
|
|
def get_app_name_from_values_folder(values_dir):
|
|
"""Get all the files in values folder and checks them for app_name."""
|
|
files = [f for f in os.listdir(values_dir) if
|
|
(os.path.isfile(os.path.join(values_dir, f)))
|
|
and (f.endswith('.xml'))]
|
|
for f in files:
|
|
# Look through each file, searching for app_name.
|
|
app_name = get_app_name_from_file(os.path.join(values_dir, f))
|
|
if app_name:
|
|
return app_name # we found an app_name, lets return it.
|
|
return '' # Didn't find app_name, returning empty string.
|
|
|
|
|
|
def get_app_name_from_file(file_path):
|
|
"""Looks for app_name in specific file."""
|
|
with open(file_path, 'r', encoding='utf-8') as f:
|
|
data = f.read()
|
|
|
|
app_name_match = re.search(
|
|
r'<string name=\"app_name\">(.{0,300})</string>',
|
|
data)
|
|
|
|
if (not app_name_match) or (len(app_name_match.group()) <= 0):
|
|
# Did not find app_name in current file.
|
|
return ''
|
|
|
|
# Found app_name!
|
|
return app_name_match.group(app_name_match.lastindex)
|