当前位置: 首页>房源搜索> 正文

python反编译和防破解

2025-10-07148

python是一种解释型语言,但是与javascript这种纯脚本语言不同,python提供了一种编译成字节码运行的方法,编译之后就得到pyc文件,这点和java编译成class文件再用jvm解释运行很类似,但是与java不同的是,python编译字节码不是一个强制的操作,事实上,编译是一个自动的过程,一般不会在意它的存在。

编译成字节码可以节省加载模块的时间,提高效率。除了效率之外,字节码的形式也增加了反向工程的难度,可以保护源代码。这个只是一定程度上的保护,反编译还是可以的。

pypycpyopyd分别是什么文件

py:python脚本源文件。

pyc:python源文件经过编译得到的字节码,二进制文件。

pyo:python脚本文件开启优化编译(-O)得到的字节码,二进制文件()。

pyd:python的动态链接库,WindowsDLL文件。

编译py文件生成pyc

我们编写两个py脚本

:包含一个函数,打印一行文字.

defkeyFun():print("keyFunisrunning")

:程序运行入口,调用mylib种的keyFun函数

frommylibimportkeyFunif__name__=="__main__":keyFun()

编译所有文件,在脚本目录执行以下命令:

python-mcompileall.

可以看到生成了相对应的两个pyc文件

编译生成pyc文件

此时执行会提示找不到mylib模块,需要将文件名中的.cpython-38删掉.

执行pyc文件

反编译pyc

反编译pyc的工具很多,我用的是,这里介绍几种可以反编译的工具.

在线反编译网站:

python-decompile3工具:

EasyPythonDecompiler:

本文作为演示,使用在线网站反编译,可以看到下图反编译代码与实际代码一模一样.

反编译pyc结果

反编译pyinstaller打包的exe文件

我们使用pyinstaller将打包成exe文件

pyinstaller打包exe并执行

反编译pyinstaller打包的exe需要用到pyinstxtractor().

将复制到pyinstxtractor文件夹,执行

反编译exe

可以看到pyinstxtractor已经提示入口文件为我们反编译就可以看到pyc引入可哪些模块,这个例子可以从反编译代码中看到引入了mylib模块,再接着反编译就可以了.

Cython编译pyd文件

从上面的反编译pyc文件结果可以看出,pyc很容易就被反编译,无法保护我们的代码.这里我们介绍使用Cython将python文件编译成pyd文件的方法.

首先安装Cython(Anaconda自带Cython的话不需要安装)

pipinstallCython

在所在目录新建build_文件

(ext_modules=cythonize([""]),)2.再把.cp38-win_amd64删掉pythonrenamepyd_

执行pythonbuild__ext--inplace.将会为生成对应的.c文件和.pyd文件

Cython生成pyd文件

与上文提到的pyc文件无法直接执行一样,pyd文件也需要删除文件名中的.cp38-win_amd64.这样才能找到对应的

importoslists=("./")foriteminlists:try:if".cp38-win_"initem:#重命名文件fileName=("cp38-win_amd64.","")files=(item,fileName)exceptExceptionase:print(e)

执行,此时引用的是编译后的如果修改了中的代码,需要删除pyd文件后调试,不然不会看到改动后的效果.

编译成pyd后再用pyinstaller打包

使用上文中的方法将python文件编译为pyd文件后,再用pynstaller打包,这时候我们反编译就只能看到pyd文件了,要想破解pyd文件就需要使用汇编级别的破解技术,如果你的代码需要别人这样去破解的话,那恭喜你了,哈哈.

需要注意的是,编译为pyd再用pyinstaller打包,可能会出现模块无法被打包进去的情况,这时候需要编辑spec文件,将mylib模块添加到hiddenimports中.

a=Analysis([''],pathex=['E:\\playground\\decompiletest'],binaries=[],datas=[],//这里引入mylib模块hiddenimports=['mylib'],hookspath=[],runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher,noarchive=False)

更多pyinstaller的高级技巧可以看我之前的一篇文章pyinstaller打包python程序高级技巧

版权所有©Copyright © 2022-2030 宜居易览网

备案号:粤ICP备13047055号

网站地图