def parse(self, filepath: str, extended_processing: bool = True): """ :param filepath: path of the APK file :param extended_processing: (optional) whether should parse all information or only a summary. True by default. :return: the parsed APK file :raise: ApkParsingError if cannot parse the file as an APK """ self.logger.debug("Parsing APK file: filepath=\"%s\"", filepath) if not self.looks_like_apk(filepath): raise ApkParsingError file = self.file_parser.parse(filepath) cert = None manifest = None dex_files = [] other_files = [] with ZipFile(filepath) as apk: tmpdir = self.__create_temporary_directory(ApkParser.__TEMPORARY_DIR) for filename in apk.namelist(): entry_filepath = apk.extract(filename, tmpdir) self.logger.debug("Extracting APK resource %s to %s", filename, entry_filepath) try: if AndroidManifestParser.looks_like_manifest(filename): self.logger.debug("%s looks like an AndroidManifest.xml file", filename) manifest = self.manifest_parser.parse(entry_filepath, True, filepath, True) elif CertParser.looks_like_cert(filename): self.logger.debug("%s looks like a CERT file", filename) cert = self.__parse_cert(entry_filepath, filename, extended_processing) elif DexParser.looks_like_dex(filename): self.logger.debug("%s looks like a dex file", filename) dex = self.__parse_dex(entry_filepath, filename, extended_processing) dex_files.append(dex) else: self.logger.debug("%s looks like a generic file", filename) entry = self.__parse_file(entry_filepath, filename, extended_processing) if entry is not None: other_files.append(entry) except (AndroidManifestParsingError, CertParsingError, FileParsingError) as error: self.__remove_directory(tmpdir) raise ApkParsingError from error self.__remove_directory(tmpdir) if manifest is None or cert is None or not dex_files: raise ApkParsingError return APK( filename=file.get_file_name(), size=file.get_size(), md5hash=file.get_md5(), sha1hash=file.get_sha1(), sha256hash=file.get_sha256(), sha512hash=file.get_sha512(), app_name=Aapt.get_app_name(filepath), cert=cert, manifest=manifest, dex_files=dex_files, other_files=other_files )
def test_looks_like_cert(self, filename, expected): result = CertParser.looks_like_cert(filename) self.assertEqual(expected, result)