def obfuscate(self, obfuscation_info: Obfuscation): self.logger.info('Running "{0}" obfuscator'.format( self.__class__.__name__)) try: # There is a method limit for dex files. max_methods_to_add = obfuscation_info.get_remaining_methods_per_obfuscator( ) if obfuscation_info.is_multidex(): for index, dex_smali_files in enumerate( util.show_list_progress( obfuscation_info.get_multidex_smali_files(), interactive=obfuscation_info.interactive, unit='dex', description='Processing multidex')): max_methods_to_add = obfuscation_info.get_remaining_methods_per_obfuscator( )[index] self.add_call_indirections(dex_smali_files, max_methods_to_add, obfuscation_info.interactive) else: self.add_call_indirections(obfuscation_info.get_smali_files(), max_methods_to_add, obfuscation_info.interactive) except Exception as e: self.logger.error( 'Error during execution of "{0}" obfuscator: {1}'.format( self.__class__.__name__, e)) raise finally: obfuscation_info.used_obfuscators.append(self.__class__.__name__)
def obfuscate(self, obfuscation_info: Obfuscation): self.logger.info('Running "{0}" obfuscator'.format( self.__class__.__name__)) try: android_class_names: Set[str] = set(util.get_android_class_names()) parent_class_names: Set[str] = self.get_parent_class_names( obfuscation_info.get_smali_files()) # Methods in parent classes belonging to the Android framework should # be ignored. classes_to_ignore: Set[str] = parent_class_names.intersection( android_class_names) methods_to_ignore: Set[str] = self.get_methods_to_ignore( obfuscation_info.get_smali_files(), classes_to_ignore) # There is a method limit for dex files. max_methods_to_add = obfuscation_info.get_remaining_methods_per_obfuscator( ) if obfuscation_info.is_multidex(): for index, dex_smali_files in enumerate( util.show_list_progress( obfuscation_info.get_multidex_smali_files(), interactive=obfuscation_info.interactive, unit="dex", description="Processing multidex", )): max_methods_to_add = obfuscation_info.get_remaining_methods_per_obfuscator( )[index] self.add_method_overloads( dex_smali_files, methods_to_ignore, max_methods_to_add, obfuscation_info.interactive, ) else: self.add_method_overloads( obfuscation_info.get_smali_files(), methods_to_ignore, max_methods_to_add, obfuscation_info.interactive, ) except Exception as e: self.logger.error( 'Error during execution of "{0}" obfuscator: {1}'.format( self.__class__.__name__, e)) raise finally: obfuscation_info.used_obfuscators.append(self.__class__.__name__)
def obfuscate(self, obfuscation_info: Obfuscation): self.logger.info('Running "{0}" obfuscator'.format( self.__class__.__name__)) try: # NOTE: only direct methods (methods that are by nature non-overridable, # namely private instance methods, constructors and static methods) will be # overloaded. android_class_names: Set[str] = set(util.get_android_class_names()) # There is a method limit for dex files. max_methods_to_add = obfuscation_info.get_remaining_methods_per_obfuscator( ) if obfuscation_info.is_multidex(): for index, dex_smali_files in enumerate( util.show_list_progress( obfuscation_info.get_multidex_smali_files(), interactive=obfuscation_info.interactive, unit="dex", description="Processing multidex", )): max_methods_to_add = ( obfuscation_info.get_remaining_methods_per_obfuscator( )[index]) self.add_method_overloads( dex_smali_files, android_class_names, max_methods_to_add, obfuscation_info.interactive, ) else: self.add_method_overloads( obfuscation_info.get_smali_files(), android_class_names, max_methods_to_add, obfuscation_info.interactive, ) except Exception as e: self.logger.error( 'Error during execution of "{0}" obfuscator: {1}'.format( self.__class__.__name__, e)) raise finally: obfuscation_info.used_obfuscators.append(self.__class__.__name__)
def test_obfuscation_remaining_methods_per_obfuscator( self, tmp_demo_apk_v10_original_path: str): obfuscation = Obfuscation(tmp_demo_apk_v10_original_path) obfuscators_adding_methods = 3 obfuscation.obfuscators_adding_methods = obfuscators_adding_methods result = obfuscation.get_remaining_methods_per_obfuscator() assert isinstance(result, int) assert (result == obfuscation._get_remaining_methods() // obfuscators_adding_methods)