예제 #1
0
 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)
     ))
예제 #2
0
 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
예제 #3
0
 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 = {}
예제 #4
0
 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
예제 #5
0
 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
예제 #6
0
 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
예제 #7
0
 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
예제 #8
0
    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