Python 代码混淆和加密技术

1. 背景

Python进行商业开发时, 需要有一定的安全意识, 为了不被轻易的逆向还原. 混淆和加密就有所必要了.

2. 目前的混淆和加密方案

2.1 混淆
  • 减少py文件的注释、对代码顺序进行重排:混淆力度不够
  • 设计规则编写脚本或者使用现成的混淆工具,将对应的变量、函数、文件名、类名等进行不同程度的无意义的字符串替换:
    单个文件或许可行,整个项目处理起来问题较多,涉及模块引用,配置引用的问题(配置无法同步混淆,到时读取出错)
2.2 加密
  • 只发行 pyc: 可以用现成工具复原
  • 用打包 exe 打包: 可以用现成工具复原
  • cython: 要加密单一的模块 /特制算法很有效,不过对很多模块的源代码容易出问题
  • 改字节码的 python: 未丢失信息,容易复原

3. 现有混淆和加密工具介绍

3.1 混淆工具

pyminifier

pyminifier是一个对Python文件进行压缩、混淆的工具,项目地址 https://github.com/liftoff/pyminifier

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZlbJBjnL-1626917811900)(./images/mix/pyminifier.png)]

pip 安装

pip install pyminifier

运行命令,把混淆后的输出重定向文件即可

pyminifier ./helloWorld.py > new.py

默认命令只是对代码顺序进行重排和减少注释,如果需要混淆代码需要加上参数

# O 为大写
pyminifier -O ./helloWorld.py > new.py

注: 目前pyminifier只能处理单个文件,而且部分脚本混淆后不可运行,需要手动测试

Oxyry Python Obfuscator

Oxyry Python Obfuscator是一个在线混淆代码的工具,地址是 http://pyob.oxyry.com/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sjghm1VZ-1626917811902)(./images/mix/oxyry.png)]

注:目前Oxyry也只能混淆单个Python文件,测试过混淆后代码可用

Opy

Opy也是一个代码混淆工具,可以对整个目录的Python文件进行混淆处理,并且支持定义混淆格式,项目地址 https://github.com/QQuick/Opy

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mm3OjM38-1626917811907)(./images/mix/opy.png)]

注:经过测试,混淆后的Python项目不可直接执行,不建议使用

ZFJPyMix

ZFJPyMix具有混淆文件名、混淆类名、混淆属性变量名、混淆方法名和删除注释来混淆Python源码,具体功能结构图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ML6yEUxz-1626917811918)(./images/mix/ZFJPyMix.jpg)]

具体可以看博客 : https://zfj1128.blog.csdn.net/article/details/102825025

总结:混淆的方式,只要是开源的代码,就有被逆转的可能,且整个项目混淆后,可以运行起来的可能性微乎其微

3.2 加密工具

compile、compileall

compile、compileall 是python 自带的工具,可以将py 文件编译成 pyc 、pyo 文件,
py是源文件,pyc是源文件编译后的文件,pyo是源文件优化编译后的文件。

# compile
import py_compile
py_compile.compile(r'H:/game/test.py')
# compileall 批量编译
import compileall
compileall.compile_dir(r'H:/game')

cython 官方文档

Cython是属于Python的超集,Cython可以将 Python文件转换成c, 并编译成pyd文件(Linux 或 Mac 下为 so 文件)。一般将核心模块编译成pyd, 这样被破解的风险就大大降低了.

安装

pip install Cython

准备要加密的 py 文件 (test.py)

def hello_world():print("hello world!!!")

编写 setup.py 脚本

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["test.py"]))

执行完就会得到一份 pyd / so 文件, 然后创建另一份文件 (test_helloWorld.py)

# 引入
from test import hello_world
# 调用
hello_world()

命令行执行 test_helloWorld.py

python test_helloWorld.py# 输出
hello world!!!

总结:加密的方式,对比混淆的方式,被破解的风险大大降低,但需要自行编写脚本,成本高,加密后的项目还不一定能够成功运行

Wefe 项目python 模块的代码加密就是基于 cython进行的,由于cython 本身的一些限制,结合项目,在加密过程中也遇到过一些问题,部分跟序列化相关的文件
无法进行加密,最后采用 cython + compile 的方式,把无法转为 pyd 的py文件,转成pyc ,也能一定程度上保护项目的代码

Python 代码混淆和加密技术简述相关推荐

  1. Python 代码混淆和加密技术

    动机 Python进行商业开发时, 需要有一定的安全意识, 为了不被轻易的逆向. 混淆和加密就有所必要了. 混淆 为了增加代码阅读的难度, 源代码的混淆非常必要, 一个在线的Python代码混淆网站. ...

  2. Python代码混淆和加密技术

    背景 Python进行商业开发时, 需要有一定的安全意识, 为了不被轻易的逆向还原. 混淆和加密就有所必要了. 代码混淆是将程序中的代码以某种规则转换为难以阅读和理解的代码的一种行为. 1. 混淆 减 ...

  3. Python代码混淆技术

    Python代码混淆技术 1. .py代码混淆技术 我们一般对反汇编代码进行还原时,默认CALL就是对一个函数的调用,碰到RET就是函数返回,条件分支两侧的代码都有可能被执行.而代码混淆就是打破了这种 ...

  4. python 代码混淆 代码保护 pyminifier

    python 代码混淆 pyminifier 文章目录 python 代码混淆 pyminifier 安装 修改源码 混淆 python 代码 网站混淆 常用命令 安装 pip install pym ...

  5. Java代码混淆和加密--Jocky

    原文地址为: Java代码混淆和加密--Jocky 1.1 什么是Jocky? 我们知道,Java是一种跨平台的编程语言,其源码(.java文件)被编译成与平台无关的字节码(.class文件),然后在 ...

  6. Python代码加壳加密pyinstaller生成的exe反编译

    Python代码加壳加密反编译 phthon加壳 pyinstaller生成的exe反编译 加壳 pyinstaller 版本高于3.0 命令行: pyinstaller -F -key=xxxxxx ...

  7. APP加密,ios代码混淆工具,虚拟化技术 适用于移动应用程序的虚拟化加密软件

    概述: KiwiVM是用于移动应用程序的虚拟化加密软件. 它基于Clang编译器扩展,并且在编译项目时虚拟化指定的函数.借助自定义CPU指令的功能,一旦对代码进行加密并且从未解密,攻击者将无法恢复代码 ...

  8. JAVA项目实现离线授权日期授权解决方案 代码混淆 字符串加密 支持JDK16

    通常项目是通过 <系统名称 + 物理地址+硬盘序号+当前时间>等等一些能区别服务器的参数作为源,来加密成一个申请码,然后通过授权码的方式进行授权的方式 但是这里有一个问题,如果项目是离线放 ...

  9. 【如何给iOS APP加固】之代码混淆及加密 第一章【附代码】

    为了给iOS app加固,我们可以采取以下几种方式: 1.代码混淆 代码混淆是通过修改源代码结构和变量名,使得代码难以被理解和反编译.这可以防止黑客获取应用程序的代码,因为即使他们能够获得源代码,也会 ...

最新文章

  1. OpenGL 帧缓冲区
  2. 内存数据库服务运营之路
  3. Unity3D安卓程序中常用静态方法封装
  4. android152 笔记 2
  5. 《Java程序员,上班那点事儿》书名的由来
  6. javascript学习代码
  7. 2021 年 JavaScript 大事记
  8. 在Teams app代码中enable nullable
  9. 【案例分享】利用Python识别图片中的文字
  10. 《SAP从入门到精通》——第1章 SAP系统基本概念 1.1 SAP公司及其产品介绍
  11. 金士顿优盘不被电脑识别的小技巧
  12. 计算机电工电子怎么学,计算机在电子电工课中的应用
  13. 163邮箱提示: 535 Error: authentication failed
  14. warning: control reaches end of non-void function [-Wreturn-type]
  15. 如何协助企业IT架构转型
  16. php微信转发无法显示标题图片,解决微信公众号分享朋友圈不显示标题图片描述的方法...
  17. 资深投资人全力反击: VC增值平台从来就不是一坨狗屎
  18. JavaScript学习二
  19. Ubuntu16.04中python升级到3.6版本后Terminal打不开的解决方法
  20. linux(CentOS7)服务器环境搭建之-supervisor

热门文章

  1. win10任务管理器快捷键_你都知道吗?Win10 任务管理器到底藏了多少 “小秘密”...
  2. android手机上图像分类技术的研究,用图片分类技术实现“拍照识花”的原理详解...
  3. 在过去有关电信版iPhone4S的上市传闻中
  4. 关于Visual Studio Code找不到工作区设置的问题
  5. torch.nn.functional.normalize
  6. html 获取视频文件的宽高尺寸,怎么获取视频的宽度-解决方案
  7. Java打印实心和空心钻石
  8. js基于echarts制作日历考勤表代码
  9. ffmpeg录屏及截图
  10. 2019年蓝桥杯每周一练题目练习