pyinstaller反编译随笔记录

发布时间 2023-06-13 15:36:30作者: 搬砖菜鸡

原因:最近用pyinstaller打包了自己的程序,然后突然看到网上大佬们的一篇博客,用pyinstaller -D main.py(这是我自己的程序入口)打包出来的文件是很容易被人反编译出来的,于是为了证明大佬说的话是对的,在网上查找了很多反编译的教程,尝试反编译自己的程序。于是便有了以下的记录

1、打包自己的程序:pyinstaller -D main.py ,没有pyinstaller的先安装,这样子打包之后会在当前目录下出现一个dist目录,里面就是我们打包后的文件和依赖库,其中有一个main.exe(名字跟main.py一致),它就是我们要反编译的对象

pip install pyinstaller

2、下载pyinstxtractor.py,地址:https://nchc.dl.sourceforge.net/project/pyinstallerextractor/dist/pyinstxtractor.py,然后将pyinstxtractor.py和main.exe放在同一级目录底下,如图

 3、在该目录下打开cmd,输入:python pyinstxtractor.py main.exe,就会得到一个文件夹,里面存着程序的字节码文件.pyc(通俗的说,有字节码文件就很容易被反编译,因为它是直接由源码转换而来的),如下图,一般来说这个过程不会报错,如果报错请自行问度娘解决

 4、如果此时我们尝试用网上在线反编译工具来反编译任意一个.pyc文件,你就会发现出错了,原因是因为这些.pyc文件还缺少一个magic number 的东西,它的作用是标识了python版本和编译时间,所以为了搞清楚这个magic number,我们用一个16进制文本软件(这里我用的是wxmedit,我也是参考其他大佬的)任意打开其中一个.pyc文件,如下图,我们发现它在 E3 字符之前其实已经有值了,我在网上也查了很多教程,有部分人的pyc文件在E3之前完全没有值,就完全是以E3开头的,而有一部分则是像我这样,E3之前有值,但是还是反编译不出来,后来经过查找原因,原来是这个前面这个16进制码是不对的,我们需要把它更换成正确的magic number才能完整反编译出来

 

5、如果你觉得查找完整的16进制码很麻烦,那你可以直接在现有的基础上直接补0即可,虽然这样不能被完全反编译,但是可以被反编译一部分代码。由此我们可以证明,该打包方式确实存在被反编译的风险

 

7、那好奇的同学可能就要问了,那你反编译的软件又是哪个呢,在这里我也告诉大家,其实就是一个依赖库,名字叫:uncompyle6,直接pip安装即可

pip install uncompyle6  

# 使用方法也很简单,如下
uncompyle6 xxx.pyc

下图就是我反编译出来的部分代码,为啥是一部分代码呢,因为这是一个错误的magic number ,它只能反编译出一部分,如果有同学需要正确的magic number,需要自己查查其他教程。至于我为什么我不写出来呢,因为我也不会,网上很多教程都不能正确的查找出完整且正确的magic number。