diff --git a/MalwareAnalyzer/views.py b/MalwareAnalyzer/views.py index b7e86447..a6da0be8 100755 --- a/MalwareAnalyzer/views.py +++ b/MalwareAnalyzer/views.py @@ -22,7 +22,7 @@ MALWARE_DB_DIR = TOOLS_DIR = os.path.join( settings.BASE_DIR, 'MalwareAnalyzer/malwaredb/') -def apkid_analysis(app_dir): +def apkid_analysis(app_dir, apk_file): """APKiD Analysis of DEX file""" if settings.APKID_ENABLED: dex_file = app_dir + 'classes.dex' @@ -79,6 +79,39 @@ def apkid_analysis(app_dir): else: apkid_dict["manipulator"] = "" + apkid_dict["result"] = "" + print("[INFO] APKiD Analysis on apk file") + result = apkid.scan(apk_file, 30, True) + if "files" in result: + apkid_dict["result"] = result["files"][0]["results"] + if "apkid_version" in result: + apkid_dict["apkid_version"] = result["apkid_version"] + + if "anti_vm" in apkid_dict["result"]: + apkid_dict["anti_vm"] = apkid_dict["result"]["anti_vm"] + + if "compiler" in apkid_dict["result"]: + apkid_dict["compiler"] = apkid_dict["result"]["compiler"] + + if "packer" in apkid_dict["result"]: + apkid_dict["packer"] = apkid_dict["result"]["packer"] + + if "obfuscator" in apkid_dict["result"]: + apkid_dict["obfuscator"] = apkid_dict["result"]["obfuscator"] + + if "abnormal" in apkid_dict["result"]: + apkid_dict["abnormal"] = apkid_dict["result"]["abnormal"] + + if "anti_disassembly" in apkid_dict["result"]: + apkid_dict["anti_disassembly"] = apkid_dict[ + "result"]["anti_disassembly"] + + if "dropper" in apkid_dict["result"]: + apkid_dict["dropper"] = apkid_dict["result"]["dropper"] + + if "manipulator" in apkid_dict["result"]: + apkid_dict["manipulator"] = apkid_dict["result"]["manipulator"] + apkid_dict["result"] = "" return apkid_dict return {} diff --git a/MobSF/settings.py b/MobSF/settings.py index bc7c9ab4..969d9b18 100755 --- a/MobSF/settings.py +++ b/MobSF/settings.py @@ -151,11 +151,11 @@ except NameError: Exception('Please create a %s file with random characters \ to generate your secret key!' % SECRET_FILE) # Run Once - # Windows Setup - windows_config_local(MobSF_HOME) utils.make_migrations(BASE_DIR) utils.migrate(BASE_DIR) utils.kali_fix(BASE_DIR) + # Windows Setup + windows_config_local(MobSF_HOME) #============================================= diff --git a/MobSF/utils.py b/MobSF/utils.py index 23fd12e9..3d3a6700 100755 --- a/MobSF/utils.py +++ b/MobSF/utils.py @@ -1,4 +1,5 @@ import os +import signal import platform import random import subprocess @@ -77,13 +78,14 @@ def printMobSFverison(): print("Dist: " + str(platform.dist())) FindJava(True) FindVbox(True) + check_basic_env() adb_binary_or32bit_support() check_update() def check_update(): try: - print("\n[INFO] Checking for Update.") + print("[INFO] Checking for Update.") github_url = "https://raw.githubusercontent.com/MobSF/Mobile-Security-Framework-MobSF/master/MobSF/settings.py" try: proxies, verify = upstream_proxy('https') @@ -232,26 +234,50 @@ def FindVbox(debug=False): if debug: PrintException("[ERROR] Cannot find VirtualBox path.") -# Maintain JDK Version -JAVA_VER = '1.7|1.8|1.9|2.0|2.1|2.2|2.3' - def FindJava(debug=False): + """ Find Java """ + # Maintain JDK Version + java_versions = '1.7|1.8|1.9|2.0|2.1|2.2|2.3|8|9' + """ + This code is needed because some people are not capable + of setting java path :-( + """ + win_java_paths = [ + "C:/Program Files/Java/", + "C:/Program Files (x86)/Java/", + "D:/Program Files/Java/", + "D:/Program Files (x86)/Java/", + "E:/Program Files/Java/", + "E:/Program Files (x86)/Java/", + "F:/Program Files/Java/", + "F:/Program Files (x86)/Java/", + "G:/Program Files/Java/", + "G:/Program Files (x86)/Java/", + "H:/Program Files/Java/", + "H:/Program Files (x86)/Java/", + "I:/Program Files/Java/", + "I:/Program Files (x86)/Java/", + ] try: err_msg1 = "[ERROR] Oracle JDK 1.7 or above is not found!" - if len(settings.JAVA_DIRECTORY) > 0 and isDirExists(settings.JAVA_DIRECTORY): - return settings.JAVA_DIRECTORY - if platform.system() == "Windows": + if isDirExists(settings.JAVA_DIRECTORY): + if settings.JAVA_DIRECTORY.endswith("/"): + return settings.JAVA_DIRECTORY + elif settings.JAVA_DIRECTORY.endswith("\\"): + return settings.JAVA_DIRECTORY + else: + return settings.JAVA_DIRECTORY + "/" + elif platform.system() == "Windows": if debug: print("\n[INFO] Finding JDK Location in Windows....") # JDK 7 jdk1.7.0_17/bin/ - for java_path in ["C:/Program Files/Java/", - "C:/Program Files (x86)/Java/"]: + for java_path in win_java_paths: if os.path.isdir(java_path): for dirname in os.listdir(java_path): if "jdk" in dirname: win_java_path = java_path + dirname + "/bin/" - args = [win_java_path + "java", "--version"] + args = [win_java_path + "java", "-version"] dat = RunProcess(args) if "java" in dat: if debug: @@ -262,7 +288,7 @@ def FindJava(debug=False): java_home = os.environ.get(env) if java_home and os.path.isdir(java_home): win_java_path = java_home + "/bin/" - args = [win_java_path + "java", "--version"] + args = [win_java_path + "java", "-version"] dat = RunProcess(args) if "java" in dat: if debug: @@ -274,31 +300,42 @@ def FindJava(debug=False): return "java" else: if debug: - print("\n[INFO] Finding JDK Location in Linux/MAC....") - MAC_LINUX_JAVA = "/usr/bin/" - args = [MAC_LINUX_JAVA + "java"] + print("[INFO] Finding JDK Location in Linux/MAC....") + # Check in Environment Variables + for env in ["JDK_HOME", "JAVA_HOME"]: + java_home = os.environ.get(env) + if java_home and os.path.isdir(java_home): + lm_java_path = java_home + "/bin/" + args = [lm_java_path + "java", "-version"] + dat = RunProcess(args) + if "oracle" in dat: + if debug: + print("\n[INFO] Oracle Java is installed!") + return lm_java_path + mac_linux_java_dir = "/usr/bin/" + args = [mac_linux_java_dir + "java"] dat = RunProcess(args) if "oracle" in dat: - args = [MAC_LINUX_JAVA + "java", '-version'] + args = [mac_linux_java_dir + "java", '-version'] dat = RunProcess(args) f_line = dat.split("\n")[0] - if re.findall(JAVA_VER, f_line): + if re.findall(java_versions, f_line): if debug: - print("\n[INFO] JDK 1.7 or above is available") - return MAC_LINUX_JAVA + print("[INFO] JDK 1.7 or above is available") + return mac_linux_java_dir else: err_msg = "[ERROR] Please install Oracle JDK 1.7 or above" if debug: print(Color.BOLD + Color.RED + err_msg + Color.END) - return "" + return "java" else: if debug: print(Color.BOLD + Color.RED + err_msg1 + Color.END) - return "" + return "java" except: if debug: PrintException("[ERROR] Oracle Java (JDK >=1.7) is not found!") - return "" + return "java" def RunProcess(args): @@ -533,3 +570,30 @@ def adb_binary_or32bit_support(): print(Color.BOLD + Color.ORANGE + msg + Color.END) else: print(msg) + + +def check_basic_env(): + """Check if we have basic env for MobSF to run""" + print("[INFO] MobSF Basic Environment Check") + try: + import capfuzz + except ImportError: + PrintException("[ERROR] CapFuzz not installed!") + os.kill(os.getpid(), signal.SIGTERM) + try: + import lxml + except ImportError: + PrintException("[ERROR] lxml is not installed!") + os.kill(os.getpid(), signal.SIGTERM) + if platform.system() == "Windows": + java = settings.JAVA_PATH + 'java.exe' + else: + java = settings.JAVA_PATH + 'java' + if not isFileExists(java): + print("[ERROR] Oracle Java is not available or `JAVA_DIRECTORY` in settings.py is configured incorrectly!") + print("JAVA_DIRECTORY=%s" % settings.JAVA_DIRECTORY) + print('''Example Configuration: + JAVA_DIRECTORY = "C:/Program Files/Java/jdk1.7.0_17/bin/" + JAVA_DIRECTORY = "/usr/bin/" + ''') + os.kill(os.getpid(), signal.SIGTERM) diff --git a/StaticAnalyzer/tools/apktool_2.3.2.jar b/StaticAnalyzer/tools/apktool_2.3.3.jar similarity index 97% rename from StaticAnalyzer/tools/apktool_2.3.2.jar rename to StaticAnalyzer/tools/apktool_2.3.3.jar index 80a59bbe..6270407c 100644 Binary files a/StaticAnalyzer/tools/apktool_2.3.2.jar and b/StaticAnalyzer/tools/apktool_2.3.3.jar differ diff --git a/StaticAnalyzer/tools/cfr_0_119.jar b/StaticAnalyzer/tools/cfr_0_128.jar old mode 100755 new mode 100644 similarity index 52% rename from StaticAnalyzer/tools/cfr_0_119.jar rename to StaticAnalyzer/tools/cfr_0_128.jar index fac4801d..475aae6e Binary files a/StaticAnalyzer/tools/cfr_0_119.jar and b/StaticAnalyzer/tools/cfr_0_128.jar differ diff --git a/StaticAnalyzer/views/android/converter.py b/StaticAnalyzer/views/android/converter.py index b353e2d5..d83fb10b 100755 --- a/StaticAnalyzer/views/android/converter.py +++ b/StaticAnalyzer/views/android/converter.py @@ -139,7 +139,7 @@ def jar_2_java(app_dir, tools_dir): ): jd_path = settings.CFR_DECOMPILER_BINARY else: - jd_path = os.path.join(tools_dir, 'cfr_0_119.jar') + jd_path = os.path.join(tools_dir, 'cfr_0_128.jar') args = [settings.JAVA_PATH + 'java', '-jar', jd_path, jar_path, '--outputdir', output] elif settings.DECOMPILER == "procyon": diff --git a/StaticAnalyzer/views/android/manifest_analysis.py b/StaticAnalyzer/views/android/manifest_analysis.py index c5b8694f..ae4298d3 100755 --- a/StaticAnalyzer/views/android/manifest_analysis.py +++ b/StaticAnalyzer/views/android/manifest_analysis.py @@ -1292,7 +1292,7 @@ def get_manifest_file(app_path, app_dir, tools_dir): if len(settings.APKTOOL_BINARY) > 0 and isFileExists(settings.APKTOOL_BINARY): apktool_path = settings.APKTOOL_BINARY else: - apktool_path = os.path.join(tools_dir, 'apktool_2.3.2.jar') + apktool_path = os.path.join(tools_dir, 'apktool_2.3.3.jar') output_dir = os.path.join(app_dir, "apktool_out") args = [settings.JAVA_PATH + 'java', '-jar', apktool_path, "--match-original", "-f", "-s", "d", app_path, "-o", output_dir] diff --git a/StaticAnalyzer/views/android/static_analyzer.py b/StaticAnalyzer/views/android/static_analyzer.py index d81adc48..b9eb1d8a 100755 --- a/StaticAnalyzer/views/android/static_analyzer.py +++ b/StaticAnalyzer/views/android/static_analyzer.py @@ -184,7 +184,7 @@ def static_analyzer(request, api=False): cert_dic = cert_info( app_dic['app_dir'], app_dic['tools_dir']) apkid_results = apkid_analysis(app_dic[ - 'app_dir']) + 'app_dir'], app_dic['app_path']) dex_2_jar(app_dic['app_path'], app_dic[ 'app_dir'], app_dic['tools_dir']) dex_2_smali(app_dic['app_dir'], app_dic['tools_dir']) diff --git a/requirements.txt b/requirements.txt index 7111c05e..cffec402 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ -Django==2.0.4 +Django==2.0.5 pdfkit==0.6.1 configparser==3.5.0 -androguard==3.1.2 +androguard==3.2.0 lxml==4.2.1 rsa==3.4.2 git+https://github.com/MobSF/CapFuzz.git