关于Python代码混淆和加密技术

 更新时间:2023年07月27日 10:16:09   作者:小白地瓜  
这篇文章主要介绍了关于Python代码混淆和加密技术,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代码混淆和加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python中的切片函数Slice详解

    Python中的切片函数Slice详解

    这篇文章主要介绍了Python中的切片函数Slice详解,切片是对有序的集合而言,意思从有序集合里提取数据构成子集集合,给定提取的起点start、终点end以及方向上的步长step,能否切出非空子集,起点start需能沿步长方向上到达终点,需要的朋友可以参考下
    2023-09-09
  • Python Flask结合前端Fetch搞定表单提交和页面刷新

    Python Flask结合前端Fetch搞定表单提交和页面刷新

    本文带你深入理解现代前端 Fetch API 的工作原理,并手把手教你如何与 Flask 后端优雅结合,实现无刷新登录、数据动态增删改查等交互,感兴趣的小伙伴可以了解下
    2025-12-12
  • Python检测生僻字的实现方法

    Python检测生僻字的实现方法

    最近在工作中碰到一个需求,要求检测字段是否包含生僻字以及一些非法字符如 ~!@#$%^&*。通过网上的查找资料解决了,现在将解决的过程和示例代码分享给大家,有需要的可以参考借鉴。下面来一起看看吧。
    2016-10-10
  • python系列 文件操作的代码

    python系列 文件操作的代码

    这篇文章主要介绍了python系列 文件操作的代码,主要是使用了python的open、read、write是些打开、读取、写入,导入numpy主要是用到数组操作,需要的朋友可以参考下
    2019-10-10
  • Python最好的日期处理库pendulum的使用指南

    Python最好的日期处理库pendulum的使用指南

    关于日期处理,Python 提供了很多的库,比如标准库 datetime、第三方库 dateutil、arrow 等等。本文将为大家介绍一个小编最喜欢的库 pendulum,用起来可以说非常的方便,任何对日期的操作它都能满足
    2022-07-07
  • Python实现向好友发送微信消息优化篇

    Python实现向好友发送微信消息优化篇

    利用python可以实现微信消息发送功能,怎么实现呢?你肯定会想着很复杂,但是python的好处就是很多人已经把接口打包做好了,只需要调用即可,今天通过本文给大家分享使用 Python 实现微信消息发送的思路代码,一起看看吧
    2022-06-06
  • python实现将多个文件分配到多个文件夹的方法

    python实现将多个文件分配到多个文件夹的方法

    今天小编就为大家分享一篇python实现将多个文件分配到多个文件夹的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python中使用PyQt把网页转换成PDF操作代码实例

    Python中使用PyQt把网页转换成PDF操作代码实例

    这篇文章主要介绍了Python中使用PyQt把网页转换成PDF操作代码实例,本文直接给出实现代码,需要的朋友可以参考下
    2015-04-04
  • Anaconda多环境多版本python配置操作方法

    Anaconda多环境多版本python配置操作方法

    下面小编就为大家带来一篇Anaconda多环境多版本python配置操作方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • python操作redis数据库的三种方法

    python操作redis数据库的三种方法

    这篇文章主要介绍了python操作redis数据库的三种方法,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2020-09-09

最新评论