前言

这几天做了一个基于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,始终找不到原因。

当然这里面包含的原因有很多,比如:

  1. 使用精简版系统,一些核心的dll被删掉了。
  2. 被xx安全软件杀掉了。
  3. 没有装vc2015运行库(pyinstaller的壳用这套环境)。

然而老板的机器上,vc2015已经安装了,安全软件也关了,剩下的只可能是其系统有问题了。

那怎么办,我也很无奈呀,老板机器的系统总不能给你重装了吧。

windows不像linux系统那样使用包管理来安装、管理系统组件,丢文件,安装失败残余文件,被误删文件,这种情况鲜有发生。

像是python这种胶水,依托着各种各样的组件,只要缺了一个文件,导致哪个模块无法运行,那么整个程序都无法运行,然后崩溃。

所以python程序不适合作为那种无法操作目标运行环境的客户端软件,客户的操作系统是千奇百怪的(Windows的锅),而且文件过于零碎,缺了哪些也不知道,也没法修复。

而且,用户不可能因为你做的一个小程序,然后去安装整套python环境,还要用pip去安装各种模块,而且最重要的是,一般用户只知道有图标就能点,甚至在压缩包内打开程序,其他东西一概不会。

总结

python只适合做目标环境可控的软件,对于变幻莫测的客户端(仅限windows),是真的无能为力。

代码安全性堪忧,开发的软件一般只能自己用,发布出去=开源,当然如果你做的是开源软件的话,那就没关系啦。

当然,有这种安全性问题的并不只是python,什么java、c#之类的脚本语言,基本上都难逃反编译了。

所以如果要做闭源的商业软件,得上Qt/C++。