如何防止python反编译
如何防止python反编译?以下是对您的具体介绍:
python学习网,大量免费python视频教程,欢迎在线学习!
这里使用的工具:
exe反编译工具:pyinstxtractor.py:点击此处下载
pyc反编译工具:Easy Python 在线反编译pyc或Decompiler。
pyinstxtractor.将py放入exe文件的同一目录中,执行以下cmd命令:
pythonpyinstxtractor.pymain.exe
如果实施成功,将在同一目录下生成新的反编译文件夹——main.exe_extracted,如下图:
与此同时,我们可以在下图圈起的路径下找到当时我们exe引入的mylib模块,它是pyc格式。
相关推荐:Python基础教程
对于pyc格式的文件,反编译非常简单。使用前面提供的工具或在线找到一分钟的反编译。让我们来看看反编译的结果:
#!/usr/bin/envpython #visithttp://tool.lu/pyc/formoreinformation deftest(num): print('num={n},{n}^3={n2}'.format(n=num,n2=num**3)) if__name__='__main__': whileNone: try: num=input( '\xe6\x8fx90\xe7\xa4xba\xef\xbc\x9a\xe8\xbex93\xe5\x5"q"xe9\x80\xe5 \xbaxe7\xa8b\xe5\xba\x8fxe3\x82n\xe8\xafxb7\xe8xbex93\xe5\x5\xe4 xb8\x8xaaxe6\x5\xb5\xe5xad\x97\xef\xbc\x9a') ifnum.lower()='q': break num=float(num) print(num) except: None None None print( '\xe8\xbex93\xe5\x5\xe7\x9a\x84xe6\x5\xb5\xe5xadx97\xe4\xb8d\xe6\xad xa3\xe7\xaxae\xef\xbc\x81') continue
可以看出,源代码基本上是完美的反编译。由于编码问题,涉及中文的地方会发生变化。但非中文部分几乎完全相同。
将脚本编译成pyd,防止反编译
如何解决,可以考虑将模块py文件编译成动态链接库,这样解决难度会大大增加。其中,在python中,pyd格式是动态链接库。可以用cython编译。如果anaconda自带,有些python可能不带cython,可以安装:
pipinstallCython
我们在main.py所在的文件夹创建了一个新的py文件,这里我把它命名为build_pyd.py,内容如下:
#-*-coding:utf-8-*- fromdistutils.coreimportsetup fromCython.Buildimportcythonize setup( name='anywords...', ext_modules=cythonize(["mylib.py",]), )
执行以下cmd命令:
pythonbuild_pyd.pybuild_ext--inplace
操作过程和生成结果如下图所示,其中编译了红框的pyd文件。因为我是一个64位的系统和python,我们将生成amd64后缀。我们将删除并重新命名为mylib.pyd就可以了。
注:mylib同时存在.pyd和mylib.py时,引入优先级是pyd>py,所以不需要删除py文件,默认引入是pyd。
此时,我们删除build、disk文件夹,重复步骤2,然后编译成exe。
注:编译需要相关的VC环境,因为Python3.5是基于 VS14版本,所以我也安装在这里。不安装是无法编译的。
可验证:
再一次反编译main.exe之后,原路径exe:\t\dist\main.exe_extracted\out00-PYZ.pyz_extracted下找不到mylib.pyc了。
因为他不再是可以直接反编译的文件。
那他在哪里?他作为pyd存在于上层目录中。如下图所示:
pyd的反编译难度相当高,到目前为止,大功告成!