Ejemplo n.º 1
0
def main(options, arguments):
    if options.input != None:
        buff = ""

        arscobj = None
        ret_type = androconf.is_android(options.input)
        if ret_type == "APK":
            a = apk.APK(options.input)
            arscobj = a.get_android_resources()
        elif ret_type == "ARSC":
            arscobj = apk.ARSCParser(read(options.input))
        else:
            # print("Unknown file type")
            return

        if not options.package and not options.type and not options.locale:
            buff = ""
            for package in arscobj.get_packages_names():
                buff += package + "\n"
                for locale in arscobj.get_locales(package):
                    buff += "\t" + repr(locale) + "\n"
                    for ttype in arscobj.get_types(package, locale):
                        buff += "\t\t" + ttype + "\n"

        else:
            package = options.package or arscobj.get_packages_names()[0]
            ttype = options.type or "public"
            locale = options.locale or '\x00\x00'

            buff = minidom.parseString(
                getattr(arscobj,
                        "get_" + ttype + "_resources")(package,
                                                       locale)).toprettyxml()

        if options.output != None:
            fd = codecs.open(options.output, "w", "utf-8")
            fd.write(buff)
            fd.close()
        else:
            # print(buff)
            psdd

    elif options.version != None:
        # print("Androarsc version %s" % androconf.ANDROGUARD_VERSION)
        pass
Ejemplo n.º 2
0
def getInfo():
    global targeApk
    #### 用列表搜集需要的信息
    cell_List = []
    targeApk = apk.APK(rawFile, True)
    targeDex = targeApk.get_dex()
    apkMd5 = hashlib.md5(rawFile).hexdigest().upper()
    ##文件名称、文件MD5、DEX MD5、文件大小
    fileName = apkMd5 + ".apk"
    cell_List.append(fileName)
    cell_List.append(apkMd5)
    dexMd5 = hashlib.md5(targeDex).hexdigest().upper()
    cell_List.append(dexMd5)
    fileSize = format(os.path.getsize(f.name), ',') + " 字节"
    cell_List.append(fileSize.lstrip())
    ##app名称、包名、签名(issuer)、证书串号、公钥MD5、公钥SHA1、
    apkName = targeApk.get_app_name()
    cell_List.append(apkName)
    apkPackageName = targeApk.get_package()
    cell_List.append(apkPackageName)
    apkSign = getSign()  ###一段蹩脚的签名获取方法,后去可用keytool工具直接获取
    cell_List.append(apkSign["Issuer"])
    cell_List.append(apkSign["SerialNumber"])
    cell_List.append(apkSign["signMd5"])
    cell_List.append(apkSign["signSha1"])

    ###  操作word
    doc = Document("test.docx")
    table = doc.tables[0]
    #table.rows[1].cells[2].text = fileName    这种方式废弃
    #table.rows[2].cells[2].text = apkMd5
    #table.rows[3].cells[2].text = dexMd5

    for i in range(1, 11):
        run = table.rows[i].cells[2].paragraphs[0].add_run(
            cell_List[i - 1])  ###或者写成  table.rows(i, 2)
        run.font.name = '仿宋_GB2312'
        run.font.size = 175000

    doc.save("test1.docx")
    ###是否结束?清理工作
    print("everything is done, exit?")
    _ = input()
    f.close()
    return
Ejemplo n.º 3
0
    def predict(self, apk_path):
        # if apk_path is APK
        ret_type = androconf.is_android(apk_path)
        if ret_type == "APK":
            try:
                a = apk.APK(apk_path)
                if a.is_valid_APK():

                    apk_permissions = self.get_permission_from_apk(a)
                    predict_vector = self.create_permission_vector(
                        self.stand_permissions, apk_permissions)
                    return self.predictor.predict([predict_vector])
                else:
                    logger.info("INVALID")
                    raise AdDetectorException('There is not a valid apk!!!')

            except Exception, e:
                logger.info(e.message)
Ejemplo n.º 4
0
def get_icon(apk_path, res_dir):
    """Returns a dict with isHidden boolean and a relative path
        path is a full path (not relative to resource folder) """
    try:
        print("[INFO] Fetching icon path")
        a = apk.APK(apk_path)
        icon_name = a.get_app_icon(max_dpi=65536)
        if len(icon_name) > 0:
            return {
                'path': os.path.join(os.path.dirname(apk_path), icon_name),
                'hidden': False
            }
        return {
            'path': guess_icon_path(res_dir),
            'hidden': True
        }
    except:
        PrintException("[ERROR] Fetching icon function")
Ejemplo n.º 5
0
    def __init__(self, path_to_apk: str):
        self.path_to_apk = path_to_apk
        self.androlyzed_apk = apk.APK(self.path_to_apk)
        self.package_name = self.androlyzed_apk.get_package()
        self.main_activity = self.androlyzed_apk.get_main_activity()

        # used for strace and artist
        self.x86 = self.check_x86_version()

        # entrypoints used by Androguard
        # IMPORTANT!!! androguard removes from this list, no guarantee that all entrypoints are contained
        self.activities = None
        self.services = None
        self.receivers = None

        self.act_count = 0
        self.service_count = 0
        self.receiver_count = 0
Ejemplo n.º 6
0
 def extract_config(self, apkfile):
     self.apkfile = apkfile
     a = apk.APK(self.apkfile)
     d = dvm.DalvikVMFormat(a.get_dex())
     bLegit = False
     for cls in d.get_classes():
         c2 = ""
         szVersion = ""
         szPrefix = ""
         szNum = ""
         string = None
         bFound = False
         if 'Constants;'.lower() in cls.get_name().lower():
             for method in cls.get_methods():
                 if '<clinit>'.lower() in str(
                         method).lower() and bFound == False:
                     for inst in method.get_instructions():
                         if inst.get_name() == 'const-string':
                             string = inst.get_output().split(
                                 ',')[-1].strip(" '")
                             szTemp = string
                         if inst.get_name() == 'const/4':
                             string = inst.get_output().split(
                                 ',')[-1].strip(" '")
                             szNum = string
                         if inst.get_name() == 'sput-object':
                             if "SERVER" in inst.get_output():
                                 c2 = szTemp
                             if "VERSION" in inst.get_output():
                                 szVersion = szTemp
                         if inst.get_name() == 'sput':
                             if 'PREFIX_ID' in inst.get_output():
                                 szPrefix = szNum
                                 bFound = True
             if self.isNotEmpty(c2):
                 _log('[+] Extracting from %s' % self.apkfile)
                 _log('[+] C&C: [ %s ]' % c2)
                 _log('[+] Version : [ %s ]' % szVersion)
                 _log('[+] Prefix ID : [ %s ]' % szPrefix)
                 return True
     if bFound == False:
         _log('[-] This is probably not Flex Botnet or a variant : %s' %
              self.apkfile)
         return False
Ejemplo n.º 7
0
def strings_from_apk(app_file, app_dir, elf_strings):
    """Extract the strings from an app."""
    try:
        logger.info('Extracting Strings from APK')
        dat = []
        secrets = []
        apk_file = os.path.join(app_dir, app_file)
        and_a = apk.APK(apk_file)
        rsrc = and_a.get_android_resources()
        pkg = rsrc.get_packages_names()[0]
        rsrc.get_strings_resources()
        for i in rsrc.values[pkg].keys():
            res_string = rsrc.values[pkg][i].get('string')
            if res_string:
                for duo in res_string:
                    cap_str = '"' + duo[0] + '" : "' + duo[1] + '"'
                    if is_secret(duo[0] + '"'):
                        secrets.append(cap_str)
                    dat.append(cap_str)
        data_string = ''.join(dat)
        urls, urls_nf, emails_nf = url_n_email_extract(
            data_string, 'Android String Resource')
        if elf_strings:
            for solib in elf_strings:
                for so, str_list in solib.items():
                    # add to strings from jar
                    dat.extend(str_list)
                    # extract url, email
                    so_str = ' '.join(str_list)
                    su, suf, sem = url_n_email_extract(so_str, so)
                    urls.extend(su)
                    urls_nf.extend(suf)
                    emails_nf.extend(sem)
        strings_dat = list(set(dat))
        return {
            'strings': strings_dat,
            'urls_list': urls,
            'url_nf': urls_nf,
            'emails_nf': emails_nf,
            'secrets': secrets,
        }
    except Exception:
        logger.exception('Extracting Strings from APK')
        return {}
Ejemplo n.º 8
0
def extract_config(apkfile):
    """
    This extracts the C&C information from Fanta or Gugi.
    """
    a = apk.APK(apkfile)
    d = dvm.DalvikVMFormat(a.get_dex())
    for cls in d.get_classes():
        if 'Lcom/fanta/services/SocketService;'.lower() in cls.get_name(
        ).lower():
            c2 = ""
            string = None
            for method in cls.get_methods():
                if 'Lcom/fanta/services/SocketService;->b()V' in str(method):
                    for inst in method.get_instructions():
                        if inst.get_name() == 'const-string':
                            string = inst.get_output().split(',')[-1].strip(
                                " '")
                            if ":" in string:
                                c2 = string
                elif 'init' in method.name:
                    for inst in method.get_instructions():
                        if inst.get_name() == 'const-string':
                            string = inst.get_output().split(',')[-1].strip(
                                " '")
                            if ":" in string:
                                c2 = string
            if isNotEmpty(c2):
                log.debug('Extracting from %s' % apkfile)
                log.debug('C&C: [ %s ]' % c2)
        elif 'Lru/drink/lime/a/d;'.lower() in cls.get_name().lower():
            c2 = ""
            string = None
            for method in cls.get_methods():
                if 'a(Landroid/database/sqlite/SQLiteDatabase;)' in str(
                        method):
                    for inst in method.get_instructions():
                        if inst.get_name() == 'const-string':
                            string = inst.get_output().split(',')[-1].strip(
                                " '")
                            if ":" in string:
                                c2 = string
            if isNotEmpty(c2):
                log.debug('Extracting from %s' % apkfile)
                log.debug('C&C: [ %s ]' % c2)
Ejemplo n.º 9
0
def get_base_info(apk_path):
    app = apk.APK(apk_path)
    detail_dir = apk_path + "_info"
    if not (os.path.exists(detail_dir) and os.path.isdir(detail_dir)):
        os.makedirs(detail_dir)

    if not apk_path.endswith(".apk"):
        apk_name = apk_path.split("\\")[-1]
        tmp_path = os.path.join(detail_dir, apk_name + ".apk")
        shutil.copy(apk_path, tmp_path)
        apk_path = tmp_path
    base_info = {
        "packagename": app.get_package(),
        "application_name": app.get_app_name(),
        "main_activity": app.get_main_activity(),
        "apk_path": apk_path,
        "detail_dir": detail_dir
    }
    return base_info
Ejemplo n.º 10
0
def makefeeder(filein, fileout):
    root = etree.Element("root")

    app = apk.APK(filein)
    addElement(root, 'sdkmin', app.get_min_sdk_version())
    addElement(root, 'sdktarget', app.get_target_sdk_version())

    #print "****************the .apk contents are************"

    #for afile in app.get_files():
    #print afile

    #print "**************************************************"
    #print "the sdk version and permissions needed are"
    #print ""

    for areceiver in app.get_receivers():
        #print areceiver
        addElement(root, 'receiver', areceiver)

    for act in app.get_elements("activity", "android:name"):
        #print act
        addElement(root, 'activity', act)

    for action in app.get_elements("action", "android:name"):
        #print action
        addElement(root, 'action', action)

    dx = analysis.VMAnalysis(dvm.DalvikVMFormat(app.get_dex()))
    for perm in dx.get_permissions([]):
        #print perm
        addElement(root, 'rint', perm)

    for perm in app.get_permissions():
        #print perm
        addElement(root, 'permission', perm)

    addElement(root, 'package', app.get_package())

    feed = open(fileout, 'w')
    s = etree.tostring(root, pretty_print=True)
    feed.write(s)
    feed.close()
Ejemplo n.º 11
0
def strings_jar(app_file, app_dir):
    """Extract the strings from an app."""
    try:
        logger.info("Extracting Strings from APK")
        dat = []
        apk_file = os.path.join(app_dir, app_file)
        and_a = apk.APK(apk_file)
        rsrc = and_a.get_android_resources() 
        pkg = rsrc.get_packages_names()[0]
        rsrc.get_strings_resources()
        for i in rsrc.values[pkg].keys():
            string = rsrc.values[pkg][i].get('string')
            if string is None:
                return dat
            for duo in string:
                dat.append('"'+duo[0]+'" : "'+duo[1]+'"') 
        return dat
    except:
        PrintException("[ERROR] Extracting Strings from APK")
Ejemplo n.º 12
0
def main(options, arguments) :
    sessionip = "127.0.0.1"
    sessionport = 31415
    
    if options.remotehost :
        sessionip = options.remotehost

    if options.port :
        sessionport = int(options.port)

    newsession = Session(sessionip, sessionport, "bind")

    # Check if connection can be established
    if newsession.executeCommand("core", "ping", None).data == "pong":
      
        if options.list :
            request = {'filter': options.list, 'permissions': None }
            apks_info = newsession.executeCommand("packages", "info", {}).getPaddedErrorOrData()
            print apks_info

        elif options.input and options.output :
            s = None
            if options.database != None or options.config != None :
                s = dalvik_elsign.MSignature( options.database, options.config, options.verbose != None, ps = dalvik_elsign.PublicSignature)
            
            request = {'filter': options.input, 'permissions': None }
            apks_info = newsession.executeCommand("packages", "info", request).getPaddedErrorOrData()
            print apks_info

            for i in apks_info.split("\n") :
                if re.match("APK path:", i) != None :
                    name_app = i.split(":")[1][1:]
                    print name_app,
                    response = newsession.downloadFile(name_app, options.output)
                    print response.data, response.error,
                    
                    if s != None :
                        a = apk.APK( options.output + "/" + os.path.basename(name_app) )
                        if a.is_valid_APK() :
                            display( s.check_apk( a ), options.verbose )
                    print
    else:
        print "\n**Network Error** Could not connect to " + sessionip + ":" + str(sessionport) + "\n"
def get_app_name(app_path, app_dir, tools_dir, is_apk):
    """Get app name."""
    if is_apk:
        a = apk.APK(app_path)
        real_name = a.get_app_name()
        return real_name
    else:
        strings_path = os.path.join(app_dir, 'app/src/main/res/values/')
        eclipse_path = os.path.join(app_dir, 'res/values/')
        if os.path.exists(strings_path):
            strings_dir = strings_path
        elif os.path.exists(eclipse_path):
            strings_dir = eclipse_path
        else:
            strings_dir = ''
    if not os.path.exists(strings_dir):
        logger.warning('Cannot find values folder.')
        return ''
    return get_app_name_from_values_folder(strings_dir)
 def get_permission(self, apk_path, label):
     permission = []
     labels = []
     merge_permission = {}
     for temp in os.listdir(apk_path):
         path = os.path.join(apk_path, temp)
         ret_type = androconf.is_android(path)
         if ret_type == "APK":
             a = apk.APK(path)
             if a.is_valid_APK():
                 permissions = a.get_requested_permissions()
                 temp_l = []
                 for i in permissions:
                     temp_l.append(i.split(".")[-1])
                 permission.append(self.conver_vector(temp_l))
                 labels.append(label)
         merge_permission[temp] = temp_l
     # return merge_permission
     return [permission, labels]
Ejemplo n.º 15
0
    def execute(self):
        """ 
        Executes the static analysis of APK using the androguard framework.
        First parses the APK the get corresponding python object.
        Then calls the androguard methods on the built object.
        """
        sys.path.append(self.androguardPath)
        from androguard.core.bytecodes import dvm
        from androguard.core.bytecodes import apk

        self._logger.info("Analyzing {0} with androguard...".format(
            self.apkToAnalyze))

        # Parse APK
        parsedAPK = apk.APK(self.apkToAnalyze)
        if parsedAPK is None:
            raise Exception("Parsed APK is null, quitting StaticAnalysis.")

        # Info: setters are dealing with None returns
        try:
            self.androidVersionCode = parsedAPK.get_androidversion_code()
            self.androidVersionName = parsedAPK.get_androidversion_name()
            self.mainActivity = parsedAPK.get_main_activity()
            self.maxSDKVersion = parsedAPK.get_max_sdk_version()
            if self.maxSDKVersion == "n/c":
                self.maxSDKVersion = -1

            self.minSDKVersion = parsedAPK.get_min_sdk_version()
            if self.minSDKVersion == "n/c":
                self.minSDKVersion = -1

            self.packageName = parsedAPK.get_package()
            self.timestamp = str(int(round(time.time() * 1000)))
            self.activities = parsedAPK.get_activities()
            self.permissions = parsedAPK.get_permissions()
            self.providers = parsedAPK.get_providers()
            self.receivers = parsedAPK.get_receivers()
            self.services = parsedAPK.get_services()
            self.libraries = parsedAPK.get_libraries()
        except Exception, e:
            self._logger.warn(
                "An error occured while executing the static analysis of APK {0}: {1}"
                .format(self.apkToAnalyze, e))
def get_icon(apk_path, res_dir):
    """Returns a dict with isHidden boolean and a relative path
        path is a full path (not relative to resource folder) """
    try:
        logger.info("Fetching icon path")
        a = apk.APK(apk_path)
        icon_resolution = 0xFFFE - 1
        icon_name = a.get_app_icon(max_dpi=icon_resolution)
        if icon_name:
            if '.xml' in icon_name:
                return {'path': guess_icon_path(res_dir), 'hidden': False}
            else:
                return {
                    'path': os.path.join(os.path.dirname(apk_path), icon_name),
                    'hidden': False
                }
        return {'path': guess_icon_path(res_dir), 'hidden': True}
    except:
        PrintException("Fetching icon function")
Ejemplo n.º 17
0
def check_one_directory(directory):
    for root, dirs, files in os.walk(directory, followlinks=True):
        if files != []:
            for f in files:
                real_filename = root
                if real_filename[-1] != "/":
                    real_filename += "/"
                real_filename += f

                print("filename: %s ..." % real_filename)
                ret_type = androconf.is_android(real_filename)
                if ret_type == "APK":
                    a = apk.APK(real_filename)
                    d1 = dvm.DalvikVMFormat(a.get_dex())
                elif ret_type == "DEX":
                    d1 = dvm.DalvikVMFormat(read(real_filename))

                dx1 = analysis.VMAnalysis(d1)
                check_one_file(d1, dx1)
Ejemplo n.º 18
0
    def __init__(self, name):
        """

        :param name: filename to load
        """
        self.vma = analysis.Analysis()

        # Proper detection which supports multidex inside APK
        ftype = androconf.is_android(name)
        if ftype == 'APK':
            for d in apk.APK(name).get_all_dex():
                self.vma.add(dvm.DalvikVMFormat(d))
        elif ftype == 'DEX':
            self.vma.add(dvm.DalvikVMFormat(read(name)))
        elif ftype == 'DEY':
            self.vma.add(dvm.DalvikOdexVMFormat(read(name)))
        else:
            raise ValueError("Format not recognised for filename '%s'" % name)

        self.classes = {dvclass.orig_class.get_name(): dvclass.orig_class for dvclass in self.vma.get_classes()}
Ejemplo n.º 19
0
    def androguard_load_from_path(apk_file_path):
        ''' Load a FastApk from path with the help of androguard.

        Notes
        -----
        Androguard cannot read data properly from manifest files which do not have the android prefix.

        Parameters
        ----------
        apk_file_path: str
            path of apk

        Returns
        -------
        apk: FastApk
        '''
        from androguard.core.bytecodes import apk as androapk
        aapk = androapk.APK(apk_file_path)
        return FastApk(aapk.get_package(), aapk.get_androidversion_name(),
                       apk_file_path)
Ejemplo n.º 20
0
def get_permissions(path):
    """
  Get the permissions from an app.

  Parameters:
    path - The path of the app to be decompiled

  Returns:
    A sorted list of permissions

  """

    app = apk.APK(path)
    perms = app.get_permissions()

    # Make sure there is no redundancies, and then sort the list.
    perms = list(set(perms))
    perms.sort()

    return perms
Ejemplo n.º 21
0
 def verifyWhiteBroad(self, apkfile):
     self.apkfile = apkfile
     iNum = 0
     a = apk.APK(apkfile)
     szPackageName = a.get_package()
     if szPackageName == "com.red.rainbow":
         bRes = self.extract_config(self.apkfile)
         return bRes
     elif "com.android.hellon" in szPackageName:
         bRes = self.extract_config2(self.apkfile)
         return bRes
     elif "cn.close.vcl.play" in szPackageName:
         bRes = self.extract_config(self.apkfile)
         return bRes
     else:
         szPermissions = " ".join(a.get_permissions())
         matchObj = re.search(r'android\.permission\.INTERNET',
                              szPermissions,
                              re.DOTALL | re.UNICODE | re.M | re.I)
         if matchObj:
             iNum += 1
         szActivities = "".join(a.get_activities())
         matchObj = re.search(r'activity\.MainActivity', szActivities,
                              re.DOTALL | re.UNICODE | re.M | re.I)
         if matchObj:
             iNum += 1
         szReceivers = "".join(a.get_receivers())
         matchObj = re.search(r'receiver\.ShowReceiver', szReceivers,
                              re.DOTALL | re.UNICODE | re.M | re.I)
         if matchObj:
             iNum += 1
         szServices = "".join(a.get_services())
         matchObj = re.search(r'call\.service\.New1Services', szServices,
                              re.DOTALL | re.UNICODE | re.M | re.I)
         if matchObj:
             iNum += 1
         if iNum == 4:
             bRes = self.extract_config(self.apkfile)
             return bRes
         else:
             _log("[-] This is not WhiteBroad")
Ejemplo n.º 22
0
def main(options, arguments):
    if options.input is not None:
        ret_type = androconf.is_android(options.input)
        if ret_type == "APK":
            a = apk.APK(options.input)
            axml = a.get_android_manifest_xml()
        elif ".xml" in options.input:
            axml = apk.AXMLPrinter(read(options.input)).get_xml_obj()
        else:
            print("Unknown file type")
            return

        buff = etree.tostring(axml, pretty_print=True)
        if options.output:
            with open(options.output, "wb") as fd:
                fd.write(buff)
        else:
            print(buff.decode("UTF-8"))

    elif options.version is not None:
        print("Androaxml version %s" % androconf.ANDROGUARD_VERSION)
Ejemplo n.º 23
0
 def extract_config(self, apkfile):
     self.apkfile = apkfile
     a = apk.APK(self.apkfile)
     d = dvm.DalvikVMFormat(a.get_dex())
     for cls in d.get_classes():
         if 'update/app/a;'.lower() in cls.get_name().lower():
             _log("[+] It's APT-C-23")
             c2 = []
             string = None
             for method in cls.get_methods():
                 if 'a;-><clinit>()v'.lower() in str(method).lower():
                     for inst in method.get_instructions():
                         if inst.get_name() == 'const-string':
                             string = inst.get_output().split(',')[-1].strip(" '")
                             if "http://" in string:
                                 c2.append(string)
             if self.isNotEmpty(c2[0]):
                 _log('[+] Extracting from %s' % (self.apkfile))
                 for CC in c2:
                     _log("[+] Extracted C2: %s" % CC)
                 return True
Ejemplo n.º 24
0
def main(options, arguments) :
    if options.input != None  and options.output != None and options.name != None and options.subname != None :
        edi = ElsimDBIn( options.output )

        ret_type = androconf.is_android( options.input )
        if ret_type == "APK" :
            a = apk.APK( options.input )
            d1 = dvm.DalvikVMFormat( a.get_dex() )
        elif ret_type == "DEX" :
            d1 = dvm.DalvikVMFormat( open(options.input, "rb").read() )

        dx1 = analysis.VMAnalysis( d1 )

        regexp_pattern = None
        regexp_exclude_pattern = None

        edi.add( d1, dx1, options.name, options.sname, regexp_pattern, regexp_exclude_pattern)
        edi.save()

    elif options.version != None :
        print "Androapptodb version %s" % androconf.ANDROGUARD_VERSION
Ejemplo n.º 25
0
    def _analyze(self):
        for i in self.__files:
            ret_type = androconf.is_android(i)
            if ret_type == "APK":
                x = apk.APK(i)
                bc = dvm.DalvikVMFormat(x.get_dex())
            elif ret_type == "DEX":
                bc = dvm.DalvikVMFormat(open(i, "rb").read())
            elif ret_type == "DEY":
                bc = dvm.DalvikOdexVMFormat(open(i, "rb").read())
            elif ret_type == "ELF":
                from androguard.core.binaries import elf
                bc = elf.ELF(open(i, "rb").read())
            else:
                raise ("Unknown format")

            if isinstance(bc, list):
                for j in bc:
                    self.__bc.append((j[0], BC(jvm.JVMFormat(j[1]))))
            else:
                self.__bc.append((i, BC(bc)))
Ejemplo n.º 26
0
def _use_check_ad():
    for root, dirs, files in os.walk(TRAIN_APK_PATH, followlinks=True):
        if files:
            for f in files:
                real_filename = root
                if real_filename[-1] != "/":
                    real_filename += "/"
                real_filename += f
                ret_type = androconf.is_android(real_filename)
                if ret_type == "APK":
                    logger.info(os.path.basename(real_filename) + ':')
                    try:
                        a = apk.APK(real_filename)
                        if a.is_valid_APK():
                            check_adware_from_config(a)
                        else:
                            logger.info("INVALID")
                    except Exception, e:
                        logger.info(e)
        else:
            logger.error("directory not exits!!!")
Ejemplo n.º 27
0
def main():

    _args = _parseargs()

    _a = apk.APK(_args.file)
    print("Analyse file: {:s}".format(_args.file))
    print("Package name: {:s}".format(_a.get_package()))

    _vm = dvm.DalvikVMFormat(_a.get_dex())
    _vmx = uVMAnalysis(_vm)

    if 'INTERNET' in _vmx.get_permissions([]):
        print "App requires INTERNET permission. Continue analysis..."

        _vm.create_python_export()
        _gx = GVMAnalysis(_vmx, None)

        _vm.set_vmanalysis(_vmx)
        _vm.set_gvmanalysis(_gx)
        _vm.create_dref(_vmx)
        _vm.create_xref(_vmx)

        _result = {
            'trustmanager': [],
            'hostnameverifier': [],
            'onreceivedsslerror': []
        }
        _result = _check_all(_vm, _vmx, _gx)

        if not _args.xml:
            _print_result(_result, _java=_args.java)
        else:
            _xml_result(_a, _result)

        if _args.dir:
            print "Store decompiled Java code in {:s}".format(_args.dir)
            _store_java(_vm, _args)
    else:
        print "App does not require INTERNET permission. No need to worry about SSL misuse... Abort!"
Ejemplo n.º 28
0
def initStatic(APKFile):
    a = apk.APK(APKFile)
    d = dvm.DalvikVMFormat(a.get_dex())
    dx = analysis.VMAnalysis(d)
    vm = dx.get_vm()
    cm = vm.get_class_manager()
    per = a.get_permissions()
    pa = dx.get_permissions([])
    USE = [p for p in SPECIAL_PERMS if "android.permission." + p in per]
    specialPath = dx.get_tainted_packages().search_methods(
        "Landroid/content/ContentResolver;", ".", ".")
    specialPath += dx.get_tainted_packages().search_methods(
        "Landroid/content/ContentProvider;", ".", ".")
    specialPath += dx.get_tainted_packages().search_methods(
        "Landroid/content/ContentProviderClient;", ".", ".")
    specialPath += dx.get_tainted_packages().search_methods(
        "Landroid/net/Uri;", "parse", ".")
    if len(specialPath) > 0 and len(USE) > 0:
        for i in USE:
            pa[i] = specialPath

    for i in pa:
        if i in PERM_DESCRIPTION:
            met = set()
            for j in pa[i]:
                t = returnMethod(j, cm)
                if t != 0:
                    met.add(t)
            permap[i] = met

    execPath = dx.get_tainted_packages().search_methods(
        "Ljava/lang/Runtime;", "exec", ".")
    if len(execPath) > 0:
        met = set()
        for j in execPath:
            t = returnMethod(j, cm)
            if t != 0:
                met.add(t)
        permap['CMD_EXEC'] = met
Ejemplo n.º 29
0
    def __init__(self, apkFile):
        self.sha256 = self.sha256CheckSum(apkFile)
        print("[-] Parsing APK")
        self.a = apk.APK(apkFile)
        print("[-] Baksmaling DEX files")
        self.baksmali(apkFile)
        self.manifest = self.a.get_android_manifest_axml().get_xml_obj()
        self.application = self.manifest.findall("application")[0]
        print("[+] Gathering Information")
        self.extractActivitiesWithExcludeFromRecents()
        self.extractActivitiesWithoutSecureFlag()
        print("   [-] Package Properties")
        self.extractPackageProperties()
        print("   [-] Exported Components")
        self.extractExportedComponents()
        print("   [-] Permissions")
        self.extractPermissions()
        print("   [-] Files")
        self.extractFiles()

        print("[-] Exporting analysis")
        self.exportAnalysis()
Ejemplo n.º 30
0
def main(options, arguments):
    if options.input != None and options.database != None:
        ret_type = androconf.is_android(options.input)
        if ret_type == "APK":
            a = apk.APK(options.input)
            d1 = dvm.DalvikVMFormat(a.get_dex())
        elif ret_type == "DEX":
            d1 = dvm.DalvikVMFormat(read(options.input))

        dx1 = analysis.VMAnalysis(d1)

        check_one_file(d1, dx1)

    elif options.directory != None and options.database != None:
        check_one_directory(options.directory)

    elif options.database != None and options.listdatabase != None:
        db = DBFormat(options.database)
        db.show()

    elif options.version != None:
        print("Androappindb version %s" % androconf.ANDROGUARD_VERSION)