def set_name_map(self, old_full_path, new_full_path): assert old_full_path not in self._names_map self._names_map[old_full_path] = new_full_path self._names_map_r[new_full_path] = old_full_path print('[Module] {0} -> {1}'.format( filepath2module(old_full_path), filepath2module(new_full_path) ))
def generate(self, src_path, old_filename, dst_path): # 收集旧类文件信息 old_class_meta = self.collect_old_meta(src_path, old_filename) # 生成新类名信息 new_class_meta = {} relative_path = os.path.relpath(dst_path, self.root_paths['dst']) while True: new_class_meta['name'] = ( random.choice(FuzzyClassnameGenerator.NAME_FIRST_CH_SET) + ''.join( random.choice(FuzzyClassnameGenerator.NAME_SET) for _ in range(FuzzyClassnameGenerator.FUZZY_LENGTH - 1)) ) if relative_path == '.': new_class_meta['full_path'] = new_class_meta['name'] new_class_meta['full_name'] = new_class_meta['name'] else: new_class_meta['full_path'] = os.path.join( relative_path, new_class_meta['name'] ) new_class_meta['full_name'] = filepath2module(new_class_meta['full_path']) if new_class_meta['full_path'] not in self._names_map_r: break # 标记此classname已经被使用 self.set_name_map(old_class_meta['full_path'], new_class_meta['full_path']) return new_class_meta, old_class_meta
def __init__(self, packages, names_map): super(SWFFileReplacer, self).__init__() self.packages = packages self.names_map = { 'module': {}, 'class': {}, 'method': names_map['method'], } for key in names_map['module']: self.names_map['module'][filepath2module(key)] = filepath2module( names_map['module'][key] ) for key in names_map['class']: self.names_map['class'][filepath2module(key)] = filepath2module( names_map['class'][key] ) self.symbols = {}
def collect_old_meta(self, src_path, old_module_name): # 收集旧module信息 old_module_meta = { 'name': old_module_name, 'full_path': os.path.relpath( os.path.join(src_path, old_module_name), self.root_paths['src'] ), 'full_name': None, } old_module_meta['full_name'] = filepath2module(old_module_meta['full_path']) return old_module_meta
def collect_old_meta(self, src_path, old_filename): # 收集旧类文件信息 # noinspection PyDictCreation old_class_meta = {} old_class_meta['name'], old_class_meta['ext'] = os.path.splitext(old_filename) relative_path = os.path.relpath(src_path, self.root_paths['src']) if relative_path == '.': old_class_meta['full_path'] = old_class_meta['name'] old_class_meta['full_name'] = old_class_meta['name'] else: old_class_meta['full_path'] = os.path.join( relative_path, old_class_meta['name'] ) old_class_meta['full_name'] = filepath2module(old_class_meta['full_path']) return old_class_meta
def generate(self, src_path, old_module_name, dst_path): # 收集旧module信息 old_meta = self.collect_old_meta(src_path, old_module_name) # 生成新module信息 new_meta = {} while True: new_meta['name'] = ''.join([ random.choice(FuzzyModulenameGenerator.NAME_SET) for _ in range(FuzzyModulenameGenerator.FUZZY_LENGTH) ]) new_meta['full_path'] = os.path.relpath( os.path.join(dst_path, new_meta['name']), self.root_paths['dst'] ) new_meta['full_name'] = filepath2module(new_meta['full_path']) if new_meta['full_path'] not in self._names_map_r: break # 标记此module已经被使用 self.set_name_map(old_meta['full_path'], new_meta['full_path']) return new_meta, old_meta
def _reproduce_file(self, src_root, dst_root, filename, is_move_files): """ 对文件进行处理 """ old_cls_meta = self._classname_generator.collect_old_meta(src_root, filename) if old_cls_meta['full_name'] in self._ignore_classes: print('ignore class:', os.path.join(src_root, filename)) # 忽略的类, 直接复制到目标文件夹下 if is_move_files: shutil.copy2( os.path.join(src_root, filename), dst_root ) return if old_cls_meta['ext'].lower() not in ('.as', '.mxml'): # 非 .as .mxml, 直接复制文件到目标文件夹下 if is_move_files: shutil.copy2( os.path.join(src_root, filename), dst_root ) return elif old_cls_meta['ext'].lower() == '.mxml': # mxml 文件 self._builder.addMXMLSource( os.path.join(src_root, filename), pkgname=filepath2module( os.path.split(old_cls_meta['full_path'])[0] ) ) # mxml 文件类名保持不变 self._classname_generator.set_name_map( old_cls_meta['full_path'], old_cls_meta['full_path'] ) if src_root != self._paths['src']: # 框架生成的 WatcherSetupUtil 类, 把其加入swf文件中处理二进制中的包名/类名 watcher_class = get_dummy_watcher_class(old_cls_meta['full_name']) print('Generate Class', watcher_class.full_name) if watcher_class.full_name not in self._classname_generator.names_map: self._builder.packages[''].classes[watcher_class.name] = watcher_class self._classname_generator.set_name_map( watcher_class.full_name, watcher_class.full_name ) if is_move_files: shutil.copy2( os.path.join(src_root, filename), dst_root ) return else: # as 文件 self._builder.addSource(os.path.join(src_root, filename)) if (filename in self._keep_classname_classes or (old_cls_meta['full_name'].startswith('_') and old_cls_meta['full_name'].endswith('WatcherSetupUtil'))): # 保持类名不变 self._classname_generator.set_name_map( old_cls_meta['full_path'], old_cls_meta['full_path'] ) new_cls_meta = {'name': old_cls_meta['name']} else: # 生成新的类名 new_cls_meta, _ = \ self._classname_generator.generate(src_root, filename, dst_root) if is_move_files: # 拼接目标文件名称 new_path_name = os.path.join( dst_root, new_cls_meta['name'] + old_cls_meta['ext'] ) shutil.copy2( os.path.join(src_root, filename), new_path_name ) return
def generate(cls, modulepath, original_cls, cls_names_map): method_names_map = {} print('Generate fuzzy information of {0}({1})'.format( original_cls.name, original_cls.full_name, ), end='') fuzzy = copy.deepcopy(original_cls) fuzzy.full_name = filepath2module(cls_names_map[ module2filepath(original_cls.full_name) ]) fuzzy.name = fuzzy.full_name.split('.')[-1] print(' -> {0}({1})'.format(fuzzy.name, fuzzy.full_name)) if original_cls.isInterface: return fuzzy, method_names_map # 方法名进行混淆 used_fuzzy_method_names = set([]) for method in fuzzy.methods.values(): # 覆盖函数不再重命名 if method.isOverride: # print('override function ', method.name) used_fuzzy_method_names.add(method.name) continue # 构造函数, 重命名为跟混淆后的类名一致 if method.name == original_cls.name: method_names_map[method.name] = fuzzy.name method.name = fuzzy.name used_fuzzy_method_names.add(method.name) continue # 私有函数 if method.visibility == 'private': # 在generate方法中已经把生成的名字加入集合中, # 后面不再用 used_fuzzy_method_names.add(method.name) name = cls._generate_fuzzy_method_name(used_fuzzy_method_names) # print(u'private method {0} -> {1}'.format(method.name, name)) method_names_map[method.name] = name method.name = name # TODO 公有函数 ''' # getter/setter # FIXME: 默认getter/setter成对出现 for method_name, method in fuzzy.getter_methods.items(): while True: name = ''.join([ random.choice(cls.NAMESET['method']) for _ in range(3) ]) if name not in used_fuzzy_method_names: used_fuzzy_method_names.add(name) break method.name = name # 对 setter 设置为一样的名称 fuzzy.setter_methods[method_name].name = name ''' # 成员变量名进行混淆 used_fuzzy_variable_names = set([]) for var in fuzzy.variables.values(): if var.visibility == 'private': # 私有变量 var.name = cls._generate_fuzzy_var_name(used_fuzzy_variable_names) elif var.isConstant and var.isStatic: # 公有静态常量 var.name = cls._generate_fuzzy_var_name(used_fuzzy_variable_names) # TODO 公有成员变量/常量 return fuzzy, method_names_map