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)
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()
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"
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
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)
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