Exemple #1
0
    def start(self):
        # 准备工作,解压反编译
        logging.info("start sdk scan..")
        if not FileUtils.is_file_exit(self.sdk_path):
            logging.error("sdk文件不存在")
            return
        pix = os.path.splitext(self.sdk_path)[1]

        if not pix == '.aar' and not pix == '.jar':
            logging.error("sdk文件格式错误")
            return

        sdkinfo.sdk_path = self.sdk_path

        is_aar = pix == '.aar'
        if is_aar:
            logging.info("start unzip..")
            if not ZipUtils.unzip(sdkinfo.sdk_path, config.unzip_path):
                logging.error("unzip error")
                return

            config.jar_path = os.path.join(config.unzip_path, "classes.jar")
            config.res_path = os.path.join(config.unzip_path, "res")
            config.xml_path = os.path.join(config.unzip_path,
                                           "AndroidManifest.xml")
            config.jni_path = os.path.join(config.unzip_path, "jni")
            config.assets_path = os.path.join(config.unzip_path, "assets")
            config.libs_path = os.path.join(config.unzip_path, "libs")

            if not FileUtils.is_file_exit(
                    config.jar_path) or not FileUtils.is_file_exit(
                        config.xml_path):
                logging.info("unzip fail,no jar or xml file.")
                return
            logging.info("unzip success.")
        else:
            config.jar_path = os.path.join(config.unzip_path, "classes.jar")
            shutil.copy(config.sdk_path, config.jar_path)

        logging.info("start decompile java.")
        count = self.get_class_file(config.jar_path)
        if self.cfr_decompile(config.jar_path, count):
            logging.info("decompile java success.")
        else:
            logging.info("decompile java error.")

        logging.info("start decompile smali.")
        if self.smali_decompile(config.jar_path):
            logging.info("decompile smali success.")
        else:
            logging.info("decompile smali error.")

        self.scan(is_aar)
Exemple #2
0
    def scan(self):
        if not FileUtils.is_file_exit(config.POLICY_PERMISSION_PATH):
            logging.error("POLICY_TXT not in.")
            return

        if FileUtils.is_file_exit(config.xml_path):
            self.find_permission_policy()
            if int(sdkinfo.target_sdk_version) < 28:
                self.target_sdk = True
        else:
            logging.info("no xml")

        self.so_policy()

        self.find_api_policy()
Exemple #3
0
    def get_info(self):
        sdkinfo.sdk_name = os.path.splitext(os.path.basename(
            sdkinfo.sdk_path))[0]
        sdkinfo.sdk_size = str(int(os.path.getsize(sdkinfo.sdk_path) / 1024))
        if not FileUtils.is_file_exit(config.xml_path):
            return

        with open(config.xml_path, 'r', encoding='utf-8') as file:
            lines = file.readlines()
            for line in lines:
                if line.find('package=') > -1:
                    re_name = re.compile(r"package=\"(.*?)\"\s")
                    sdkinfo.package_name = re_name.findall(line)[0]
                if line.find('versionName') > -1:
                    re_version = re.compile(r"versionName=\"(.*?)\"\s")
                    sdkinfo.version_name = re_version.findall(line)[0]
                if line.find('uses-permission') > -1:
                    re_per = re.compile(r"android:name=\"(.*?)\"\s")
                    permission = re_per.findall(line)[0]
                    sdkinfo.permissions.append(permission)
                if line.find('minSdkVersion') > -1:
                    re_min = re.compile(r"android:minSdkVersion=\"(.*?)\"\s")
                    sdkinfo.min_sdk_version = re_min.findall(line)[0]
                if line.find('targetSdkVersion') > -1:
                    re_target = re.compile(
                        r"android:targetSdkVersion=\"(.*?)\"\s")
                    sdkinfo.target_sdk_version = re_target.findall(line)[0]
                if line.find("android:allowBackup") > -1:
                    re_allow = re.compile(r"android:allowBackup=\"(.*?)\"\s")
                    sdkinfo.allow_back_up = re_allow.findall(
                        line)[0].lower() == "true"
                if line.find("android:debuggable") > -1:
                    re_debug = re.compile(r"android:debuggable=\"(.*?)\"\s")
                    sdkinfo.debuggable = re_debug.findall(
                        line)[0].lower() == "true"
Exemple #4
0
    def smali_decompile(self, jar_path):
        dx_path = os.path.join(config.TOOL_PATH, "dx.jar")
        dex_path = os.path.join(config.unzip_path, "classes.dex")
        baksmali_jar_path = os.path.join(config.TOOL_PATH, "baksmali.jar")

        process = subprocess.Popen(
            ["java", "-jar", dx_path, "--dex", "--output", dex_path, jar_path],
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT)
        process.communicate()

        if FileUtils.is_file_exit(dex_path):
            try:
                command = 'java -jar \"%s\" -o \"%s\" \"%s\"' % (
                    baksmali_jar_path, config.smali_path, dex_path)
                p = subprocess.Popen(command,
                                     stdin=subprocess.PIPE,
                                     stdout=subprocess.PIPE,
                                     stderr=subprocess.PIPE,
                                     shell=True)
                ret = p.communicate()
                if FileUtils.is_dir_empty(config.smali_path):
                    logging.error(u"反编译smali失败")
                    return False
            except Exception as e:
                logging.error(u"反编译smali失败,原因:%s", e)
                return False

        return True
Exemple #5
0
 def get_assets(self):
     if FileUtils.is_file_exit(config.assets_path):
         for home, dir, filenames in os.walk(config.libs_path):
             for filename in filenames:
                 sdkinfo.assets_files.append(filename)
Exemple #6
0
 def get_soname(self):
     if FileUtils.is_file_exit(config.jni_path):
         for dirpath, dirnames, filenames in os.walk(config.unzip_path):
             for filename in filenames:
                 if filename.endswith(".so"):
                     sdkinfo.sdk_soname = filename