关于Python代码混淆和加密技术
引言
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
# print "argvs:",sys.argv
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': # 在这里将找到的py文件进行编译成pyc,但是会指定到一个叫做__pycache__的文件夹中
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
检查项目

到此这篇关于关于Python代码混淆和加密技术的文章就介绍到这了,更多相关Python代码混淆和加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
通过conda把已有虚拟环境的python版本进行降级操作指南
当使用conda创建虚拟环境时,有时候可能会遇到python版本不对的问题,下面这篇文章主要给大家介绍了关于如何通过conda把已有虚拟环境的python版本进行降级操作的相关资料,需要的朋友可以参考下2024-05-05
python geopandas读取、创建shapefile文件的方法
shapefile是GIS中非常重要的一种数据类型,在ArcGIS中被称为要素类(Feature Class),主要包括点(point)、线(polyline)和多边形(polygon),本文重点给大家介绍python geopandas读取、创建shapefile文件的方法,需要的朋友参考下吧2021-06-06
python使用正则表达式(Regular Expression)方法超详细
这篇文章主要介绍了python使用正则表达式(Regular Expression)方法超详细,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-12-12
Python读取配置文件-ConfigParser的二次封装方法
这篇文章主要介绍了Python读取配置文件-ConfigParser的二次封装方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-02-02


最新评论