前言
这几天做了一个基于python的project,使用pyinstaller进行打包。
在项目即将完成之际,经过三台PC的测试,并没有什么问题。
但是,当放到老板的两台PC上,均出现了无法运行的问题!
于是乎,离deadline也就剩下两三天了,翻车翻车。
安全性
这种虚拟机语言的安全性当然是妙不可言了,能直接反编译成源代码。
网上那些所谓的加密成pyc什么的,都是胡扯,完全没有意义。
什么?用pyinstaller做成exe?抱歉,那也没用,pyinstaller只是把py编译成pyc,然后打包放进exe壳里(如下,这些壳里面我估计嵌了个python虚拟机)。
Ojo-Laptop:PyInstaller hsojo$ find bootloader -type f -name "*.exe"
bootloader/Windows-32bit/run.exe
bootloader/Windows-32bit/runw_d.exe
bootloader/Windows-32bit/runw.exe
bootloader/Windows-32bit/run_d.exe
bootloader/Windows-64bit/run.exe
bootloader/Windows-64bit/runw_d.exe
bootloader/Windows-64bit/runw.exe
bootloader/Windows-64bit/run_d.exe
使用pyinstxtractor就能把pyc包分离出来,然后使用uncompyle(可使用pip安装),就能把pyc反编译回源码。
我尝试使用evb(The Enigma Protector),对Directory方式打包的exe进行打包,以为能防住pyinstxtractor了,但结果还是不行。
由于pyinstaller是把数据写在文件尾部的,但evb打包,只是在文件资源部分做手脚(估计在文件头部-中部),尾部的数据没有进行保护,所以还是轻易的被pyinstxtractor解包了。
而且修改了exe尾部数据的话,会导致pyinstaller生成的exe无法加载其打包的脚本,也就是使用pyinstaller的话,你就没有办法对脚本进行加密。
如果要进行加密,首先,得把pyinstaller的壳(exe)改造一下并重新编译,然后修改pyinstaller打包的实现部分。
当然,这样子只能防住解包工具(也许别人能通过ollydbg之类的工具,从内存里把你解密的pyc文件导出来)。
如果要真正意义上的加密,那应该就要修改python源代码了,当然这很不现实(修改之后,对现有模块的兼容性呢?),而且修改之后还要给pyinstaller重新做一套壳,这tm不就扯淡么。
而且我做的项目,一般都是小项目呀,哪受得了这样子大动干戈呀。
兼容性
安全部分吹完了,轮到在Windows下的dog shit兼容性。
是的没错,就是说windows兼容性差,我在win7和win10的机器都测试过,pyinstaller+evb打包的程序能正常运行,当我放到老板机器上的win7和win10,就全部凉了,运行全部出错。
- win7:直接崩溃,由于没开那个什么问题报告服务,所以具体哪个组件出问题也不清楚。(后来排查发现是evb导致崩溃的,使用pyinstaller自带的File方式打包是没问题的。)
- win10:无法加载pyqt,始终找不到原因。
当然这里面包含的原因有很多,比如:
- 使用精简版系统,一些核心的dll被删掉了。
- 被xx安全软件杀掉了。
- 没有装vc2015运行库(pyinstaller的壳用这套环境)。
然而老板的机器上,vc2015已经安装了,安全软件也关了,剩下的只可能是其系统有问题了。
那怎么办,我也很无奈呀,老板机器的系统总不能给你重装了吧。
windows不像linux系统那样使用包管理来安装、管理系统组件,丢文件,安装失败残余文件,被误删文件,这种情况鲜有发生。
像是python这种胶水,依托着各种各样的组件,只要缺了一个文件,导致哪个模块无法运行,那么整个程序都无法运行,然后崩溃。
所以python程序不适合作为那种无法操作目标运行环境的客户端软件,客户的操作系统是千奇百怪的(Windows的锅),而且文件过于零碎,缺了哪些也不知道,也没法修复。
而且,用户不可能因为你做的一个小程序,然后去安装整套python环境,还要用pip去安装各种模块,而且最重要的是,一般用户只知道有图标就能点,甚至在压缩包内打开程序,其他东西一概不会。
总结
python只适合做目标环境可控的软件,对于变幻莫测的客户端(仅限windows),是真的无能为力。
代码安全性堪忧,开发的软件一般只能自己用,发布出去=开源,当然如果你做的是开源软件的话,那就没关系啦。
当然,有这种安全性问题的并不只是python,什么java、c#之类的脚本语言,基本上都难逃反编译了。
所以如果要做闭源的商业软件,得上Qt/C++。