Commit 084f18f0 by sikang

update

parent 2fe74124
# The default ``config.py``
# flake8: noqa
def set_prefs(prefs):
"""This function is called before opening the project"""
# Specify which files and folders to ignore in the project.
# Changes to ignored resources are not added to the history and
# VCSs. Also they are not returned in `Project.get_files()`.
# Note that ``?`` and ``*`` match all characters but slashes.
# '*.pyc': matches 'test.pyc' and 'pkg/test.pyc'
# 'mod*.pyc': matches 'test/mod1.pyc' but not 'mod/1.pyc'
# '.svn': matches 'pkg/.svn' and all of its children
# 'build/*.o': matches 'build/lib.o' but not 'build/sub/lib.o'
# 'build//*.o': matches 'build/lib.o' and 'build/sub/lib.o'
prefs['ignored_resources'] = ['*.pyc', '*~', '.ropeproject',
'.hg', '.svn', '_svn', '.git', '.tox']
# Specifies which files should be considered python files. It is
# useful when you have scripts inside your project. Only files
# ending with ``.py`` are considered to be python files by
# default.
# prefs['python_files'] = ['*.py']
# Custom source folders: By default rope searches the project
# for finding source folders (folders that should be searched
# for finding modules). You can add paths to that list. Note
# that rope guesses project source folders correctly most of the
# time; use this if you have any problems.
# The folders should be relative to project root and use '/' for
# separating folders regardless of the platform rope is running on.
# 'src/my_source_folder' for instance.
# prefs.add('source_folders', 'src')
# You can extend python path for looking up modules
# prefs.add('python_path', '~/python/')
# Should rope save object information or not.
prefs['save_objectdb'] = True
prefs['compress_objectdb'] = False
# If `True`, rope analyzes each module when it is being saved.
prefs['automatic_soa'] = True
# The depth of calls to follow in static object analysis
prefs['soa_followed_calls'] = 0
# If `False` when running modules or unit tests "dynamic object
# analysis" is turned off. This makes them much faster.
prefs['perform_doa'] = True
# Rope can check the validity of its object DB when running.
prefs['validate_objectdb'] = True
# How many undos to hold?
prefs['max_history_items'] = 32
# Shows whether to save history across sessions.
prefs['save_history'] = True
prefs['compress_history'] = False
# Set the number spaces used for indenting. According to
# :PEP:`8`, it is best to use 4 spaces. Since most of rope's
# unit-tests use 4 spaces it is more reliable, too.
prefs['indent_size'] = 4
# Builtin and c-extension modules that are allowed to be imported
# and inspected by rope.
prefs['extension_modules'] = []
# Add all standard c-extensions to extension_modules list.
prefs['import_dynload_stdmods'] = True
# If `True` modules with syntax errors are considered to be empty.
# The default value is `False`; When `False` syntax errors raise
# `rope.base.exceptions.ModuleSyntaxError` exception.
prefs['ignore_syntax_errors'] = False
# If `True`, rope ignores unresolvable imports. Otherwise, they
# appear in the importing namespace.
prefs['ignore_bad_imports'] = False
# If `True`, rope will insert new module imports as
# `from <package> import <module>` by default.
prefs['prefer_module_from_imports'] = False
# If `True`, rope will transform a comma list of imports into
# multiple separate import statements when organizing
# imports.
prefs['split_imports'] = False
# If `True`, rope will remove all top-level import statements and
# reinsert them at the top of the module when making changes.
prefs['pull_imports_to_top'] = True
# If `True`, rope will sort imports alphabetically by module name instead
# of alphabetically by import statement, with from imports after normal
# imports.
prefs['sort_imports_alphabetically'] = False
# Location of implementation of
# rope.base.oi.type_hinting.interfaces.ITypeHintingFactory In general
# case, you don't have to change this value, unless you're an rope expert.
# Change this value to inject you own implementations of interfaces
# listed in module rope.base.oi.type_hinting.providers.interfaces
# For example, you can add you own providers for Django Models, or disable
# the search type-hinting in a class hierarchy, etc.
prefs['type_hinting_factory'] = (
'rope.base.oi.type_hinting.factory.default_type_hinting_factory')
def project_opened(project):
"""This function is called after opening the project"""
# Do whatever you like here!
# -*-coding:utf-8-*-
import glob, os
import string
import random
class ActivityGarble:
target = [
"Activity.java",
"Bean.java",
"Fragment.java",
"Receiver.java",
"CertifyActiviy.java",
"BaseApplication.java",
"ContactEntity.java",
"SmsEntity.java",
"ActivityCenter.java",
"Service.java",
"Collector.java",
"BannerMessageDto.java",
"BasicAck.java",
"InviteResult.java",
"LoanAppBeanFatherStatusLogs.java",
"LoanRange.java",
"PhotoInfo.java",
"IncomeMessageProto.java",
"ResponseErrorBody.java",
"RecordFilesResponse.java",
"TotalAmount.java",
"UserBankInfo.java",
"YWUser.java",
"TDChannel.java"
]
used_names = []
activity_mapping = {}
#随机串
def __gen_rand_str(self):
rand_str = ''.join(random.choices(string.ascii_uppercase + string.ascii_lowercase, k=8))
while rand_str in self.used_names:
rand_str = ''.join(random.choices(string.ascii_uppercase + string.ascii_lowercase, k=8))
self.used_names.append(rand_str)
return rand_str
#替换文件内容
def __process_file_content(self, path, file_name):
# print("processing content: %s..."%path)
with open(path, "rt") as fin:
file_content = fin.read()
# replace the file content based on mangle settings
for (src, dst) in self.activity_mapping.items():
separator = [" ", ".", "\"", "{", "}", "(", ")", "[", "]","<",">", ":", ";", ","]
for sep in separator:
file_content = file_content.replace(src + sep, dst + sep)
ext = os.path.splitext(file_name)[1]
if ext == '.java':
comment = "// machine renamed: %s\n" % file_name
file_content = "%s%s" % (comment, file_content)
with open(path, "wt") as fout:
fout.write(file_content)
return
#查找所有待混淆类 并重命名
def __find_pkgs(self,path):
for root, dirs, files in os.walk(path):
for dir in dirs:
directory = os.path.join(os.getcwd(), root)
for file in files:
is_activity = False
for file_name in self.target:
if file.endswith(file_name):
is_activity = True
if is_activity:
name = os.path.splitext(file)[0]
if name not in self.activity_mapping.keys():
self.activity_mapping[name] = self.__gen_rand_str()
src = os.path.join(directory, file)
dst = os.path.join(directory, "%s.java" % self.activity_mapping[name])
os.rename(src, dst)
#遍历混淆文件
def __process_files(self,path):
for root, dirs, files in os.walk(path):
directory = os.path.join(os.getcwd(), root)
for file in files:
if file.endswith(".java"):
self.__process_file_content(os.path.join(directory, file),file)
#四大组件混淆
def activity_garble(self,config):
#遍历包
print("find activity...")
self.__find_pkgs("%s/app/src/main/java"% config['root'])
self.__find_pkgs("%s/lib_base/src/main/java"% config['root'])
#开始混淆
print("start garble .java...")
self.__process_files("%s/app/src/main"% config['root'])
self.__process_files("%s/lib_base/src/main"% config['root'])
#混淆AndroidManifest.xml
print("start garble 混淆AndroidManifest.xml ...")
manifest_path = os.path.join("%s/app/src/main/"% config['root'], "AndroidManifest.xml")
self.__process_file_content(manifest_path,"AndroidManifest.xml")
lib_manifest_path = os.path.join("%s/lib_base/src/main/"% config['root'], "AndroidManifest.xml")
self.__process_file_content(lib_manifest_path,"AndroidManifest.xml")
print("done")
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment