0x00. 前置学习
简单了解
python为什么要打包成exe文件?在日常生活中的应用是因为传输源文件以及源代码给他人是需要配置好一定的环境才能进行编译操作,而打包成exe文件就可以跟电脑软件一样打开就可以运行也可以分享给他人。
而对于ctf比赛来说,是为了给新手增加解题难度,增加游戏的难度。
在反编译前,先了解几种常见的python文件格式:
.py: 源代码文件,可以用文本编辑器查看和编辑;
.pyc: 源代码py文件编译后生成的二进制文件,无法用文本编辑器进行编辑,由python的虚拟机来执行,pyc文件的内容跟python版本相关;
.pyo: 源代码py文件优化编译后生成的二进制文件,无法用文本编辑器进行编辑,Python3.5之后,不再使用.pyo文件名,而是使用类似"xxx.opt-n.pyc的文件名;
.pyd: python的动态链接库(dll),允许程序共享执行特殊任务所必需的代码和其他资源;
.pyz: zipapp打包文件(类似于pyinstaller打包成exe文件)
0x01.PyInstaller
这里主要利用了工具有pyinstxtractor.py,还有在线转换工具(http://tools.bugscaner.com/decompyle/)把pyc转为py。
步骤:使用pyinstxtractor.py工具可以将pyinstaller
生成的exe文件解包成pyc文件,将下载的pyinstxtractor.py文件拷到exe相同的目录,执行命令:
python pyinstxtractor.py checkme.exe(文件名)
执行结果将生成"checkme(文件名).exe _extracted"的文件夹
需要的工具:
这里主要利用了工具有pyinstxtractor.py,还有在线转换工具(http://tools.bugscaner.com/decompyle/)把pyc转为py。
步骤:使用pyinstxtractor.py工具可以将pyinstaller
生成的exe文件解包成pyc文件,将下载的pyinstxtractor.py文件拷到exe相同的目录,执行命令:
python pyinstxtractor.py checkme.exe(文件名)
执行结果将生成"checkme(文件名).exe _extracted"的文件夹
在生成的文件夹中找到在根目录下,包括checkme二进制文件(对应原来checkme.py)
我们将checkme 与strust文件用010edit(winhex也可)打开,对比,发现pyc文件缺少前12个字节,补充上另存为checkme.pyc
因为pyc是二进制文件,无法直接查看和编译,需要转换成py文件。可以使用在线的工具:http://tools.bugscaner.com/decompyle/
PyInstaller的原理
1.PyInstaller工具可以把python解析器和脚本打包成一个可执行的文件,并不是编译成真正的机器码,打包成一个可执行文件后运行效率可能会降低,好处就是在使用者的机器上可以不用安装python和你的脚本依赖的库。2.利用PyInstaller对指定的的脚本打包时,会先分析脚本所依赖的其他脚本,然后根据导包路径去查找,把所有相关的脚本收集起来,包括Python解析器,然后根据你的命令参数可分别生成文件夹,或者打包成一个可执行文件。3.无论是生成的文件夹里的可执行文件或者只打包成一个可执行文件都可以直接运行,前者需要把整个文件夹都给别人。
常用参数:
-F 指只生成一个exe文件,不生成其他dll文件
-w 不弹出交互窗口,如果你想程序运行的时候,与程序进行交互,则不加该参数
-i 设定程序图标 ,其后面的xxx.ico文件就是程序小图标
dev.py 要打包的程序,如果你不是在dev.py同一级目录下执行的打包命令,这里得写上dev.p