def test_parse_without_filename( self, mock_file, mock_isfile, mock_access, mock_getsize, mock_md5, mock_sha1, mock_sha256, mock_sha512 ): mock_isfile.return_value = True mock_access.return_value = True mock_getsize.return_value = self.ANY_FILE_SIZE mock_md5.return_value.hexdigest.return_value = self.ANY_FILE_MD5 mock_sha1.return_value.hexdigest.return_value = self.ANY_FILE_SHA1 mock_sha256.return_value.hexdigest.return_value = self.ANY_FILE_SHA256 mock_sha512.return_value.hexdigest.return_value = self.ANY_FILE_SHA512 file = self.sut.parse("any-file-path") mock_file.assert_called_with("any-file-path", "rb") assert_file_equal( self, expected=any_file( filename="any-file-path", size=self.ANY_FILE_SIZE, md5=self.ANY_FILE_MD5, sha1=self.ANY_FILE_SHA1, sha256=self.ANY_FILE_SHA256, sha512=self.ANY_FILE_SHA512 ), actual=file )
def test_parse_when_minidom_fails_with_apk_path_and_extended_processing( self, mock_file, mock_file_parser, mock_minidom, mock_aapt): file = any_file(filename="AndroidManifest.xml") mock_parser_instance = any_file_parser(file=file) mock_file_parser.return_value = mock_parser_instance mock_minidom.parse.side_effect = ExpatError() mock_aapt.get_apk_info.return_value = self.any_aapt_apk_info( package_name="any-package-name", version_code=1, version_name="any-version-name", sdk_max="20", sdk_min="10", sdk_target="15") mock_aapt.get_app_permissions.return_value = [ "any-permission-0", "any-permission-1", "any-permission-2" ] mock_aapt.get_manifest_info.return_value = self.any_aapt_manifest_info( activities=["any-activity-name"], services=["any-service-name"], receivers=["any-broadcast-receiver-name"]) manifest = self.sut.parse(filepath="any-file-path", binary=False, apk_path="any_apk_path", extended_processing=True) assert_file_parser_called_once_with(mock_parser_instance, filepath="any-file-path", filename="AndroidManifest.xml") mock_file.assert_called_with("any-file-path", "rb") mock_minidom.parse.assert_called_with("any-file-path") mock_aapt.get_apk_info.assert_called_with("any_apk_path") mock_aapt.get_app_permissions.assert_called_with("any_apk_path") mock_aapt.get_manifest_info.assert_called_with("any_apk_path") assert_file_equal(self, expected=file, actual=manifest) self.assert_manifest_equal( manifest=manifest, package_name="any-package-name", version=AppVersion(code=1, name="any-version-name"), sdk=AppSdk(min_version="10", target_version="15", max_version="20"), permissions=[ "any-permission-0", "any-permission-1", "any-permission-2" ], activities=[AppActivity(name="any-activity-name")], services=[AppService(name="any-service-name")], receivers=[ AppBroadcastReceiver(name="any-broadcast-receiver-name") ])
def test_parse_with_extended_processing(self, mock_zipfile, mock_mkdtemp, mock_rmtree, mock_file_parser, mock_manifest_parser, mock_cert_parser, mock_dex_parser, mock_aapt): tmp_directory = Mock() file = any_file(filename="any-apk-file") manifest = any_file(filename="any-manifest-file-name") cert = any_file(filename="any-cert-file-name") dex = any_file(filename="any-dex-file-name") resource = any_file(filename="any-resource-file") mock_zipfile.return_value.__enter__.return_value.namelist.return_value = [ "any-manifest-file-name", "any-cert-file-name", "any-dex-file-name", "any-resource-file", "any-resource-directory" ] mock_mkdtemp.return_value = tmp_directory mock_file_parser.is_zip_file.return_value = True mock_file_parser.is_directory.side_effect = [False, True] mock_file_parser.return_value.parse.side_effect = [file, resource] mock_manifest_parser.looks_like_manifest.side_effect = [ True, False, False, False, False ] mock_manifest_parser.return_value.parse.return_value = manifest mock_cert_parser.looks_like_cert.side_effect = [ True, False, False, False ] mock_cert_parser.return_value.parse.return_value = cert mock_dex_parser.looks_like_dex.side_effect = [True, False, False] mock_dex_parser.return_value.parse.return_value = dex mock_aapt.get_app_name.return_value = "any-app-name" apk = ApkParser().parse("any-file-path", extended_processing=True) mock_mkdtemp.assert_called_with(".ninjadroid") mock_zipfile.assert_called_with("any-file-path") mock_rmtree.assert_called_with(tmp_directory) assert_file_equal(self, expected=file, actual=apk) self.assert_apk_equal(apk=apk, app_name="any-app-name", manifest=manifest, cert=cert, dex_files=[dex], other_files=[resource])
def test_parse_binary(self, mock_file, mock_file_parser, mock_axmlprinter, mock_minidom): file = any_file(filename="AndroidManifest.xml") mock_parser_instance = any_file_parser(file=file) mock_file_parser.return_value = mock_parser_instance mock_axmlprinter.return_value = self.any_axmlprinter() mock_minidom.parseString.return_value = self.any_axmlprinter_xml( package_name="any-package-name", version_code="1", version_name="any-version-name", sdk_max="20", sdk_min="10", sdk_target="15", permissions=[ "any-permission-1", "any-permission-2", "any-permission-0" ]) manifest = self.sut.parse(filepath="any-file-path", binary=True, apk_path=None, extended_processing=False) assert_file_parser_called_once_with(mock_parser_instance, filepath="any-file-path", filename="AndroidManifest.xml") mock_file.assert_called_with("any-file-path", "rb") mock_axmlprinter.assert_called_with(ANY) mock_minidom.parseString.assert_called_with("any-axml-raw-value") assert_file_equal(self, expected=file, actual=manifest) self.assert_manifest_equal(manifest=manifest, package_name="any-package-name", version=AppVersion(code=1, name="any-version-name"), sdk=AppSdk(min_version="10", target_version="15", max_version="20"), permissions=[ "any-permission-0", "any-permission-1", "any-permission-2" ], activities=[], services=[], receivers=[])
def test_parse(self, mock_file_parser, mock_popen, mock_uri_signature, mock_shell_signature): file = any_file() mock_parser_instance = any_file_parser(file=file) mock_file_parser.return_value = mock_parser_instance mock_popen.return_value = any_popen( b"any-string\nany-url\nany-command") mock_uri_signature.return_value = self.any_signature( matches=[(None, False), ("any-url", True), (None, False)]) mock_shell_signature.return_value = self.any_signature( matches=[(None, False), (None, False), ("any-command", True)]) dex = DexParser().parse("any-file-path", "any-file-name") assert_file_parser_called_once_with(mock_parser_instance, filepath="any-file-path", filename="any-file-name") assert_popen_called_once_with(mock_popen, "strings any-file-path") assert_file_equal(self, expected=file, actual=dex) self.assertEqual(["any-command", "any-string", "any-url"], dex.get_strings()) self.assertEqual(["any-url"], dex.get_urls()) self.assertEqual(["any-command"], dex.get_shell_commands()) self.assertEqual([], dex.get_custom_signatures())
def test_init(self, mock_file_parser, mock_get_localzone, mock_popen): file = any_file() mock_parser_instance = any_file_parser(file=file) mock_file_parser.return_value = mock_parser_instance mock_popen.return_value = any_popen( response=b"Owner: CN=OwnerName, OU=OwnerUnit, O=OwnerOrganization, L=OwnerCity, ST=OwnerState, C=OwnerCountry\n" \ b"Issuer: CN=IssuerName, OU=IssuerUnit, O=IssuerOrganization, L=IssuerCity, ST=IssuerState, C=IssuerCountry\n" \ b"Serial number: 558e7595\n" \ b"Valid from: Sat Jun 27 12:06:13 CEST 2015 until: Tue Feb 26 11:06:13 CET 2515\n" \ b"Certificate fingerprints:\n" \ b"\t MD5: 90:22:EF:0C:DB:C3:78:87:7B:C3:A3:6C:5A:68:E6:45\n" \ b"\t SHA1: 5A:C0:6C:32:63:7F:5D:BE:CA:F9:38:38:4C:FA:FF:ED:20:52:43:B6\n" \ b"\t SHA256: E5:15:CC:BC:5E:BF:B2:9D:A6:13:03:63:CF:19:33:FA:CE:AF:DC:ED:5D:2F:F5:98:7C:CE:37:13:64:4A:CF:77\n" \ b"Signature algorithm name: SHA1withRSA\n" \ b"Subject Public Key Algorithm: 1024-bit RSA key\n" \ b"Version: 3" ) mock_get_localzone.return_value.localize.side_effect = ValueError() cert = self.sut.parse("any-file-path", "any-file-name") assert_file_parser_called_once_with(mock_parser_instance, filepath="any-file-path", filename="any-file-name") assert_popen_called_once_with(mock_popen, "keytool -printcert -file any-file-path") assert_file_equal(self, expected=file, actual=cert) self.assertEqual("558e7595", cert.get_serial_number()) self.assertEqual( CertValidity(valid_from="Sat Jun 27 12:06:13 CEST 2015", valid_to="Tue Feb 26 11:06:13 CET 2515"), cert.get_validity() ) self.assertEqual( CertFingerprint( md5="90:22:EF:0C:DB:C3:78:87:7B:C3:A3:6C:5A:68:E6:45", sha1="5A:C0:6C:32:63:7F:5D:BE:CA:F9:38:38:4C:FA:FF:ED:20:52:43:B6", sha256="E5:15:CC:BC:5E:BF:B2:9D:A6:13:03:63:CF:19:33:FA:CE:AF:DC:ED:5D:2F:F5:98:7C:CE:37:13:64:4A:CF:77", signature="SHA1withRSA", version="3" ), cert.get_fingerprint() ) self.assertEqual( CertParticipant( name="OwnerName", email="", unit="OwnerUnit", organization="OwnerOrganization", city="OwnerCity", state="OwnerState", country="OwnerCountry", domain="" ), cert.get_owner() ) self.assertEqual( CertParticipant( name="IssuerName", email="", unit="IssuerUnit", organization="IssuerOrganization", city="IssuerCity", state="IssuerState", country="IssuerCountry", domain="" ), cert.get_issuer() )