• 反编译pyinstaller打包的exe安装包


    PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译

    在这里分享一些技巧和经验给大家。辛苦撰文分享,转载或引用请保留本文作者信息及文章链接。

    作者的环境:

    win7+python3.5(anaconda3)

    理论上,win7及以上的系统和python任意版本均可。

     

    一、基础脚本

    首先我们构建一个简单的脚本,比如输出一串数字、文本之类,这里我们输出一串文字的同时计算一下3次方好了。

    # -*- coding: utf-8 -*-
    """
    Created on Wed Aug 29 09:18:13 2018
    
    @author: Li Zeng hai
    """
    
    
    
    def test(num):
        print('num={n}, {n}^3={n2}'.format(n=num, n2=num**3))
        
        
    if __name__ == '__main__':
        while 1:
            try:
                num = input('提示:输入"q"退出程序。
    请输入一个数字:')
                if num.lower() == 'q':
                    break
                num = float(num)
                print(num)
            except:
                print('输入的数字不正确!')
                continue
            
            test(num)

    把这段脚本保存为mylib.py,运行一下这个脚本:

    可以看到,脚本正常运行了。

    为了演示,我们把下面的脚本新建到main.py脚本文件中,并且从mylib中引入测试函数。

    # -*- coding: utf-8 -*-
    
    from mylib import *
    
    
    while 1:
        try:
            num = input('提示:输入"q"退出程序。
    请输入一个数字:')
            if num.lower() == 'q':
                break
            num = float(num)
            print(num)
        except:
            print('输入的数字不正确!')
            continue
        
        test(num)

    二、使用PyInstaller打包为exe

    使用如下命令,将其打包为单一exe(去掉-F则不是单一exe)

    pyinstaller -F main.py

    打包过程如下:

    E:	>pyinstaller -F main.py
    505 INFO: PyInstaller: 3.3.1
    505 INFO: Python: 3.5.5
    505 INFO: Platform: Windows-7-6.1.7601-SP1
    505 INFO: wrote E:	main.spec
    505 INFO: UPX is not available.
    505 INFO: Extending PYTHONPATH with paths
    ['E:\t', 'E:\t']
    505 INFO: checking Analysis
    505 INFO: Building Analysis because out00-Analysis.toc is non existent
    505 INFO: Initializing module dependency graph...
    521 INFO: Initializing module graph hooks...
    521 INFO: Analyzing base_library.zip ...
    6269 INFO: running Analysis out00-Analysis.toc
    6269 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
      required by d:anaconda3python.exe
    6956 INFO: Caching module hooks...
    6956 INFO: Analyzing E:	main.py
    6956 INFO: Loading module hooks...
    6956 INFO: Loading module hook "hook-pydoc.py"...
    6956 INFO: Loading module hook "hook-xml.py"...
    7283 INFO: Loading module hook "hook-encodings.py"...
    7533 INFO: Looking for ctypes DLLs
    7549 INFO: Analyzing run-time hooks ...
    7549 INFO: Looking for dynamic libraries
    7720 INFO: Looking for eggs
    7720 INFO: Using Python library d:anaconda3python35.dll
    7720 INFO: Found binding redirects:
    []
    7720 INFO: Warnings written to E:	uildmainwarnmain.txt
    7751 INFO: Graph cross-reference written to E:	uildmainxref-main.html
    7767 INFO: checking PYZ
    7767 INFO: Building PYZ because out00-PYZ.toc is non existent
    7767 INFO: Building PYZ (ZlibArchive) E:	uildmainout00-PYZ.pyz
    8345 INFO: Building PYZ (ZlibArchive) E:	uildmainout00-PYZ.pyz completed successfully.
    8345 INFO: checking PKG
    8345 INFO: Building PKG because out00-PKG.toc is non existent
    8345 INFO: Building PKG (CArchive) out00-PKG.pkg
    9954 INFO: Building PKG (CArchive) out00-PKG.pkg completed successfully.
    9954 INFO: Bootloader d:anaconda3libsite-packagesPyInstallerootloaderWindows-64bit
    un.exe
    9954 INFO: checking EXE
    9954 INFO: Building EXE because out00-EXE.toc is non existent
    9954 INFO: Building EXE from out00-EXE.toc
    9954 INFO: Appending archive to EXE E:	distmain.exe
    9954 INFO: Building EXE from out00-EXE.toc completed successfully.
    
    E:	>

    最终在目录下生成build、disk文件夹。其中exe文件在disk中。运行正常。如下图:

    三、反编译Pyinstaller打包的exe

    这样的exe已经可以被迁移到别的电脑上使用了,如果是为了方便其他电脑使用,到这一步就已经结束了。但有时候,我们可能是把这个功能给很多人用,但如果不想开源或者被别人破解,到这一步是还不够的。

    因为到这一步的exe是可以被别人反编译出源码的。

    此处用到的工具:

    exe反编译工具:pyinstxtractor.py:点击此处去下载

    pyc反编译工具:Easy Python Decompiler 或者在线反编译pyc。

    将pyinstxtractor.py放到exe文件相同目录,执行以下cmd命令:

    python pyinstxtractor.py main.exe

    如果成功执行,将在同目录下生成新的反编译文件夹——main.exe_extracted,如下图:

    同时,我们可以在下图圈起来的路径下,找到当时我们exe引入的mylib模块,其为pyc格式。

    pyc格式的文件,反编译起来就非常简单了。用前文提供的工具或者网上找个在线的分分钟反编译出来,我们看下反编译的结果:

    #!/usr/bin/env python
    # visit http://tool.lu/pyc/ for more information
    '''
    Created on Wed Aug 29 09:18:13 2018
    
    @author: Li Zeng hai
    '''
    
    
    def test(num):
        print('num={n}, {n}^3={n2}'.format(n=num, n2=num ** 3))
    
    
    if __name__ == '__main__':
        while None:
    
            try:
                num = input(
                    'xe6x8fx90xe7xa4xbaxefxbcx9axe8xbex93xe5x85xa5"q"xe9x80x80xe5x87xbaxe7xa8x8bxe5xbax8fxe3x80x82
    xe8xafxb7xe8xbex93xe5x85xa5xe4xb8x80xe4xb8xaaxe6x95xb0xe5xadx97xefxbcx9a')
                if num.lower() == 'q':
                    break
                num = float(num)
                print(num)
            except:
                None
                None
                None
                print(
                    'xe8xbex93xe5x85xa5xe7x9ax84xe6x95xb0xe5xadx97xe4xb8x8dxe6xadxa3xe7xa1xaexefxbcx81')
                continue
    

    可以看到,基本上完美的把源码反编译出来了。其中涉及到中文的地方,会因为编码问题有所改变。但是非中文部分,几乎一模一样。

    就问你怕不怕!!!

    四、将脚本编译为pyd以防止反编译

    好怕怕 ,哈哈。

    如何解决呢,可以考虑将模块py文件编译为动态链接库,这样破解难度将大大增加。其中,在python里,pyd格式即动态链接库。使用cython即可编译,如果是anaconda是自带,python有的可能不带cython,安装即可:

    pip install Cython

    我们在main.py所在的文件夹新建py文件,在此处我命名为build_pyd.py,其内容如下:

    # -*- coding: utf-8 -*-
    """
    Created on Wed Aug 29 13:33:20 2018
    
    @author: Li Zeng hai
    """
    
    
    from distutils.core import setup
    from Cython.Build import cythonize
     
    setup(
      name = 'any words.....',
      ext_modules = cythonize(["mylib.py",
    
                               
                               ]
      ),
    )

    然后执行以下cmd命令:

    python build_pyd.py build_ext --inplace

    运行过程及生成结果如下图,其中红框的pyd文件即编译好了。因为我是64位的系统和python,所以会生成amd64后缀,我们把这个删掉重命名为mylib.pyd即可。

    注:当同时存在mylib.pyd和mylib.py时,引入优先级是pyd>py,所以不用移除py文件,默认引入时就是pyd。

    此时,我们删除build、disk文件夹,重复步骤二,再次编译为exe即可。

    注意:编译需要相关的VC环境,因为python3.5是基于 VS14版本的,所以我这里安装的也是。不安装是无法编译的。

    可以验证一下:

    再次反编译main.exe后,原来的路径E: distmain.exe_extractedout00-PYZ.pyz_extracted之下,已经找不到mylib.pyc了。

    因为他已经不是可以直接反编译出来的文件了。

    那么他在哪呢,他是作为pyd存在于上层目录中了。如下图:

    pyd的反编译难度是相当高的,至此,就大功告成了!

    参考链接:https://www.lizenghai.com/archives/898.html

         https://blog.csdn.net/zy841958835/article/details/79446871

           https://blog.csdn.net/HW140701/article/details/93494869   (pyinstaller -F --key=***** 加密pyc防止反编译     在这个过程中需要安装pycropto,这个的安装比较麻烦 可以参考: https://www.cnblogs.com/xiohao/p/11216271.html)

  • 相关阅读:
    springboot中,使用redisTemplate操作redis
    【转】手把手教你 Mockito 的使用
    【转】Java JUnit 单元测试小结
    【转】如何使用MAT分析内存泄漏
    free命令中的buffer和cached的比较(转)
    【转】java comparator 升序、降序、倒序从源码角度理解
    打印日志的10个建议
    hadoop控制map个数(转)
    Java工具库:
    Scala工具库
  • 原文地址:https://www.cnblogs.com/xiohao/p/11286461.html
Copyright © 2020-2023  润新知