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

在这里分享一些技巧和经验给你们。辛苦撰文分享,转载或引用请保留本文做者信息及文章连接。html

做者的环境:python

win7+python3.5(anaconda3)微信

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

 

1、基础脚本

首先咱们构建一个简单的脚本,好比输出一串数字、文本之类,这里咱们输出一串文字的同时计算一下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"退出程序。\n请输入一个数字:')
            if num.lower() == 'q':
                break
            num = float(num)
            print(num)
        except:
            print('输入的数字不正确!')
            continue
        
        test(num)

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

能够看到,脚本正常运行了。ui

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

 

# -*- coding: utf-8 -*-

from mylib import *


while 1:
    try:
        num = input('提示:输入"q"退出程序。\n请输入一个数字:')
        if num.lower() == 'q':
            break
        num = float(num)
        print(num)
    except:
        print('输入的数字不正确!')
        continue
    
    test(num)

2、使用PyInstaller打包为exe

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

pyinstaller -F main.py

打包过程以下:.net

E:\t>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:\t\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:\anaconda3\python.exe
6956 INFO: Caching module hooks...
6956 INFO: Analyzing E:\t\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:\anaconda3\python35.dll
7720 INFO: Found binding redirects:
[]
7720 INFO: Warnings written to E:\t\build\main\warnmain.txt
7751 INFO: Graph cross-reference written to E:\t\build\main\xref-main.html
7767 INFO: checking PYZ
7767 INFO: Building PYZ because out00-PYZ.toc is non existent
7767 INFO: Building PYZ (ZlibArchive) E:\t\build\main\out00-PYZ.pyz
8345 INFO: Building PYZ (ZlibArchive) E:\t\build\main\out00-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:\anaconda3\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.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:\t\dist\main.exe
9954 INFO: Building EXE from out00-EXE.toc completed successfully.

E:\t>

 

 

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

3、反编译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(
                '\xe6\x8f\x90\xe7\xa4\xba\xef\xbc\x9a\xe8\xbe\x93\xe5\x85\xa5"q"\xe9\x80\x80\xe5\x87\xba\xe7\xa8\x8b\xe5\xba\x8f\xe3\x80\x82\n\xe8\xaf\xb7\xe8\xbe\x93\xe5\x85\xa5\xe4\xb8\x80\xe4\xb8\xaa\xe6\x95\xb0\xe5\xad\x97\xef\xbc\x9a')
            if num.lower() == 'q':
                break
            num = float(num)
            print(num)
        except:
            None
            None
            None
            print(
                '\xe8\xbe\x93\xe5\x85\xa5\xe7\x9a\x84\xe6\x95\xb0\xe5\xad\x97\xe4\xb8\x8d\xe6\xad\xa3\xe7\xa1\xae\xef\xbc\x81')
            continue

能够看到,基本上完美的把源码反编译出来了。其中涉及到中文的地方,会由于编码问题有所改变。可是非中文部分,几乎如出一辙。

就问你怕不怕!!!

4、将脚本编译为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:\t\dist\main.exe_extracted\out00-PYZ.pyz_extracted之下,已经找不到mylib.pyc了。

由于他已经不是能够直接反编译出来的文件了。

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

 

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

 

      

                                                                    技术交流、商务合做请直接联系博主

                                                                           扫码或搜索:猿说python

 

python教程公众号

                                                                                  猿说python

                                                                                微信公众号 扫一扫关注