pyinstaller打包成exe
- –onefile 将结果打包成一个可执行文件
- –onedir 将所有结果打包到一个文件夹中,该文件夹包括一个可执行文件和可执行文件执行时需要的依赖文件(默认)
- –paths=DIR 设置导入路径
- –distpath=DIR 设置将打包的结果文件放置的路径
- –specpath=DIR 设置将spec文件放置的路径
- –windowed 使用windows子系统执行,不会打开命令行(只对windows有效)
- –nowindowed 使用控制台子系统执行(默认)(只对windows有效)
- –icon=<FILE.ICO> 将file.ico添加为可执行文件的资源(只对windows有效)
pyc文件
pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,而且pyc是一种跨平台的字节码,是由python的虚拟机来执行的,这个是类似于JAVA或者.NET的虚拟机的概念。pyc的内容,是跟python的版本相关的,不同版本编译后的pyc文件是不同的,2.5编译的pyc文件,2.4版本的 python是无法执行的。
pyo文件
pyo是优化编译后的程序
python -O 源文件即可将源程序编译为pyo文件
pyd文件
pyd是python的动态链接库
编译后exe
字符串特征
会看到__main__和__file__以及一堆以py开头的函数。
源码为:print(“hello word”), 明明只写了一个hello world,为什么会有这么多字符串呢?这是因为python是个解释型语言,pyinstaller打包的时候实际上是将python的解释器和py文件一起打包成了一个exe。所以这个字符串特征几乎是不可避免的
入口特征
在32位编译后exe第一个函数的else分支连续调用四个系统函数
编译器特征
可以看到hello.exe的编译器为VS14.0,这是因为python是基于VS14版本的,这也可以作为一个辨识的特征
反编译
首先由exe获取pyc文件,再由pyc获取py文件。
反编译python生成的exe需要用到pyinstaller库里的archive_viewer.py脚本。archive_viewer.py一共有四个可用命令:
U: go Up one level
O <name>: open embedded archive name
X <name>: extract name
Q: quit
由exe获取pyc
python archive_viewer.py C:\hello.exe
用pyinstaller打包后,pyc文件的前8个字节会被抹掉,所以最后要自己添加回去。前四个字节为python编译的版本,后四个字节为时间戳,时间戳可以任意,编译器版本python2.7 为03 f3 0d 0a,python3.4 为ee 0c 0d 0a
由pyc获取py
使用easy python decompiler将pyc转化为py文件
python代码混淆
python代码的混淆相对会比较简单,只是单纯利用宏替换的原理修改变量和函数名,这个网站是目前用的最多的python代码混淆工具:http://pyob.oxyry.com/,变量名被换掉了之外几乎没有任何改变。
替换变量名可修改混淆。