V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
jh623
V2EX  ›  Python

Python 代码不能加密?

  •  
  •   jh623 · Mar 19, 2017 · 11896 views
    This topic created in 3326 days ago, the information mentioned may be changed or developed.
    廖雪峰说 Python 代码不能加密,转换成 exe 加壳不算加密么?
    如果不算,那怎么把转换的 exe 里的源码提取出来呢?
    23 replies    2018-11-17 17:21:49 +08:00
    wevsty
        1
    wevsty  
       Mar 19, 2017
    Python 不能直接编译成二进制文件,所谓的转换成 exe ,其实就是跟压缩软件打包一样,把代码打包在一起罢了。
    loading
        2
    loading  
       Mar 19, 2017
    你用记事本打开看看,然后看一下其他语言编译的。
    ty89
        3
    ty89  
       Mar 19, 2017
    自己翻一下书、 google 一下就能搞明白的事情
    a87150
        4
    a87150  
       Mar 19, 2017
    pyc
    liantian
        5
    liantian  
       Mar 19, 2017
    可以用 pyminifier 混淆代码
    https://pypi.python.org/pypi/pyminifier
    clino
        6
    clino  
       Mar 19, 2017
    我们一个工具因为怕被解密改用 go 写了,感觉不错
    jh623
        7
    jh623  
    OP
       Mar 19, 2017
    @wevsty 那怎么解包呢?
    jh623
        8
    jh623  
    OP
       Mar 19, 2017
    @a87150 pyc 就看到几行无关紧要的代码
    jh623
        9
    jh623  
    OP
       Mar 19, 2017
    @loading 我小白不懂啊,打开 exe 是十六进制的
    wevsty
        10
    wevsty  
       Mar 19, 2017
    @jh623 那取决于你的打包方式
    xialdj
        11
    xialdj  
       Mar 19, 2017 via iPhone
    @jh623 exe 文件是可以解压的 本质上也是压缩包
    phrack
        12
    phrack  
       Mar 19, 2017 via Android   ❤️ 19
    可以。

    我专门研究过这个问题, python 代码加密甚至可以做到比用汇编手写混淆,用 c 手写混淆更加难以解密。具体做法略复杂仅简单说个过程。

    第一级别是源码级别的混淆,用 ast 和 astor ,再自己手写一个混淆器,三五百行的脚本直接混淆到几万行,整个文件面目全非,基本可以做到就算直接放脚本给你拿去逆,除非你再写出来一个逆向前面的混淆算法的脚本来逆(在熟悉 python 的情况下需要花几天,且不说需要了解程序构造原理),手动去调试脚本几乎达到不可行的地步(话费时间再乘以 2 )

    第二级别是个性化定制 pyinstaller , pyinstaller 会打包所有需要的库,将脚本也包含进打包的 exe ,但是, pyinstaller 有一个 stub ,相当于一个启动器,需要由这个启动器来解密脚本和导入模块,外面有直接导出脚本的工具,但是那是针对 pyinstaller 自带的启动器做的,完全可以自己修改这个启动器再编译,这样逆向者就必须手动调试找到 main 模块。配合第一级别加密,呵呵,中国就算是最顶尖的逆向专家也要花个一两周,来破解我们的程序逻辑了,就我所知,实际上国内对于 py 程序的逆向研究不多。

    第三级别是再上一层,将 py 翻译为 c 再直接编译 c 为 dll ,配合第一阶段先混淆再转 c 再编译,在第一步混淆之后,会产生非常多垃圾(中间层)函数,这些中间层函数在 c 这里会和 py 解释器互相调用,脚本和二进制之间交叉运行,本身混淆之后的源码就极难复原,再混合这一层,想逆向,难。

    第四级别是利用 py 的动态特性,绝大多数逆向者都是 c ,汇编出身,对于程序的第一直觉就是,程序就是一条一条的指令,后一条指令必然在这一条指令后面,然而, py 的动态特性可以让代码逻辑根本就不在程序里面,这一点不想多讲,涉及到我一个项目里的深度加密。

    第五级别,数学做墙。了解过比特币原理的知道要想用挖比特币就得提供大量算力去帮网络计算 hash ,这个成为 pow ,那么既然已经采用 py 了估计已经不考虑太多 cpu 利用率了,那就可以采用 pow (还有其他的手段)确保程序运行时拥有大量算力,如果程序被单步调试,呵呵,一秒钟你也跑不出来几个 hash 直接拉黑这个 ip (这个说法可能比较难理解,因为我第四层的加密没有说明,不过意思就是拒绝执行就对了)
    phrack
        13
    phrack  
       Mar 19, 2017 via Android
    以上讨论基于 windows py2.7 ,不过基本具有通用性,其他平台和版本处理步奏一样。
    Daniel65536
        14
    Daniel65536  
       Mar 19, 2017 via iPhone
    https://zhuanlan.zhihu.com/p/25850970

    改 opcode 也是一个思路
    PythonAnswer
        15
    PythonAnswer  
       Mar 19, 2017 via Android
    一般来说,混淆一下,然后 cython 编译,基本够用了。
    Allenqjy
        16
    Allenqjy  
       Mar 19, 2017
    @PythonAnswer 请问 python 编译过后性能和未编译过是否有区别?当然是在都不好的基础上。
    HowardMei
        17
    HowardMei  
       Mar 19, 2017 via Android
    @phrack 好复杂的样子, Google 的 Grumpy 可以把一般的 python 程序转译到 Go
    PythonAnswer
        18
    PythonAnswer  
       Mar 19, 2017
    @Allenqjy 计算密集型的过程,会加速,因为变成 c 代码编译了。你就当顺便提了个速。
    loading
        19
    loading  
       Mar 19, 2017 via Android
    关键代码还是建议换语言写,然后调用。普通的程序无所谓了,你把 python 的空格搅乱我就不想看了……
    woodrat
        20
    woodrat  
       Mar 19, 2017
    15 楼的方法亲测可行,而且成本比较低,写个脚本每次从源码生成 ELF 。不过代码里不能动态加路径到 sys.path ,记得 cython 好像不会处理这种情况,不知道是不是记错了。
    est
        21
    est  
       Mar 19, 2017
    廖雪峰 for president
    NoAnyLove
        22
    NoAnyLove  
       Mar 20, 2017
    以前在什么地方逛到过一个叫做 Nuitka ( http://nuitka.net/pages/overview.html )的东西,通过将 Python 代码编译成 C 程序,并通过调用 libpython 来实现,我没用过,但应该也可以起到一定混淆和加密的作用吧
    virbox
        23
    virbox  
       Nov 17, 2018
    加密方式

    对 Python 加密时可能会有两种形式,一种是对 Python 转成的 exe 进行保护,另一种是直接对.py 或者.pyc 文件进行保护,下面将列举两种形式的保护流程。

    1、 对 python 转 exe 加壳

    下载最新版 Virbox Protector 加壳工具,使用加壳工具直接对 demo.exe 进行加壳操作

    2、对.py/.pyc 加密

    第一步,使用加壳工具对 python 安装目录下的 python.exe 进行加壳,将 python.exe 拖入到加壳工具 VirboxProtector 中,配置后直接点击加壳。

    第二步,对.py/.pyc 进行加密,使用 DSProtector 对.py/.pyc 进行保护。


    安全技术:

    l 虚拟机外壳:精锐 5 的外壳保护工具,创新性的引入了预分析和自动优化引擎,有效的解决了虚拟化保护代码时的安全性和性能平衡问题。

    l 碎片代码执行:利用自身成熟的外壳中的代码提取技术,抽取大量、大段代码,加密混淆后在安全环境中执行,最大程度上减少加密锁底层技术和功能的依赖,同时大量大段地移植又保证了更高的安全性。

    l Virbox 加密编译引擎:集编译、混淆等安全功能于一身,由于在编译阶段介入,可优化空间是普遍虚拟化技术无法比拟的,对代码、变量的混淆程度也有了根本的提升。

    l 反黑引擎:内置 R0 级核心态反黑引擎,基于黑客行为特征 的(反黑数据库)反制手段。精准打击调试、注入、内存修改等黑客行为,由被动挨打到主动防护。

    加密之后再尝试解压 log322.exe 失败,已经无法进行反编译,使用常规反编译工具也是无法进行分析的。


    欢迎加群交流加密技术,获取 python 加密工具及文档:群号 730803578
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1481 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 17:06 · PVG 01:06 · LAX 10:06 · JFK 13:06
    ♥ Do have faith in what you're doing.