背景
Python进行商业开发时, 需要有一定的安全意识, 为了不被轻易的逆向还原. 混淆和加密就有所必要了.
代码混淆是将程序中的代码以某种规则转换为难以阅读和理解的代码的一种行为。
1. 混淆
- 减少py文件的注释、对代码顺序进行重排:混淆力度不够
- 设计规则编写脚本或者使用现成的混淆工具,将对应的变量、函数、文件名、类名等进行不同程度的无意义的字符串替换:
单个文件或许可行,整个项目处理起来问题较多,涉及模块引用,配置引用的问题(配置无法同步混淆,到时读取出错)
2. 加密
- 只发行 pyc: 可以用现成工具复原
- 用打包 exe 打包: 可以用现成工具复原
- cython: 要加密单一的模块 /特制算法很有效,不过对很多模块的源代码容易出问题
- 改字节码的 python: 未丢失信息,容易复原
pyc文件
介绍
pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高。 而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。 pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的。
编写脚本
生成 pyc_create.py 文件 注:43行 的 ‘cpython-38’ 需要根据python版本来改,3.8为38 3.7为37
import os
import sys
import shutil
from py_compile import compile
if len(sys.argv) == 3:
comd = sys.argv[1]
path = sys.argv[2]
if os.path.exists(path) and os.path.isdir(path):
for parent, dirname, filename in os.walk(path):
for cfile in filename:
fullname = os.path.join(parent, cfile)
if comd == 'clean' and cfile[-4:] == '.pyc':
try:
os.remove(fullname)
print("Success remove file:%s" % fullname)
except:
print("Can't remove file:%s" % fullname)
if comd == 'compile' and cfile[-3:] == '.py':
try:
compile(fullname)
print("Success compile file:%s" % fullname)
except:
print("Can't compile file:%s" % fullname)
if comd == 'remove' and cfile[-3:] == '.py' and cfile != 'settings.py' and cfile != 'wsgi.py':
try:
os.remove(fullname)
print("Success remove file:%s" % fullname)
except:
print("Can't remove file:%s" % fullname)
if comd == 'copy' and cfile[-4:] == '.pyc':
parent_list = parent.split("\\")[:-1]
parent_up_path = ''
for i in range(len(parent_list)):
parent_up_path += parent_list[i] + '\\'
shutil.copy(fullname, parent_up_path)
print('update the dir of file successfully')
if comd == 'cpython' and cfile[-4:] == '.pyc':
cfile_name = ''
cfile_list = cfile.split('.')
for i in range(len(cfile_list)):
if cfile_list[i] == 'cpython-38':
continue
cfile_name += cfile_list[i]
if i == len(cfile_list) - 1:
continue
cfile_name += '.'
shutil.move(fullname, os.path.join(parent, cfile_name))
print('update the name of the file successfully')
else:
print("Not an directory or Direcotry doesn't exist!")
else:
print("Usage:")
print("\tpython compile_pyc.py clean PATH\t\t#To clean all pyc files")
print("\tpython compile_pyc.py compile PATH\t\t#To generate pyc files")
以此执行脚本命令
注!!!备份代码
C:\Users\周天震\PycharmProjects\Confuse 为我的项目目录。
1、生成pyc文件
python pyc_create.py compile C:\Users\周天震\PycharmProjects\Confuse
2、移动pyc文件
python pyc_create.py copy C:\Users\周天震\PycharmProjects\Confuse
3、删除py文件
python pyc_create.py remove C:\Users\周天震\PycharmProjects\Confuse
4、修改文件名称
生成的pyc文件样式为:manage.cpython-38.pyc 需要修改为 manage.pyc
python pyc_create.py cpython C:\Users\周天震\PycharmProjects\Confuse
检查项目
|