手动方案1
方案1
要求不高的话,上面你将 script 目录内的 .py 文件打包成 script.egg,直接就可以发布了,至少不会满目录的 .py 文件。要求高一点的话,把 .py 先转换成 .pyc 再压缩成 script.egg,然后把关键几个模块用 cython 之类的工具转换成 .pyd 即可。上面基础加密基本够用了,个人开发者可以就此止步,如果你是一个团队,要发布面向百万以上用户产品级的东西,追求比 PyInstaller 更安全的加密方式可以继续往下。
高级加密
第一层:pyc 加密,自己写一个 importer,放到 PyStand.int 里初始化,作用是加载自定义的 .pz 文件,而 .pz 文件是根据 .pyo 文件加密得到,你的 importer 负责解密并加载这些字节码,把这个 importer 添加到 sys.path_hooks 里面,这样 python 就能 import .pz 文件了,再写个批处理,把项目文件全部编译转换成 .pz 压缩成 script.egg。
第二层:zip 文件加密码,参考 python 自带的 zipimporter 实现一个 zipimporter2,支持 zip 文件加密码,只要在 sys.path.append('script.egg@12345') 类似这样的路径,就可以按给定密码 import zip 内的东西,当然密码可以写的不那么明显,还可以支持 7zip 导入。
第三层:将 .dll/.pyd 封装近 python38.zip 或者 script.egg 内,这里你会用到 py2exe 的两个子模块:MemoryModule:
https://github.com/py2exe/py2exe/tree/master/source可以用来从内存加载 dll/pyd,然后还有一个 zipdllimporter 的脚本,可以从内存/zip 文件直接加载 pyd/dll,这样你的所有的 pyd/dll 都可以塞到 .zip/.egg 文件里了,根本不用暴露。
第四层:源代码重新编译 Python,将很多东西直接编译进去,比如上面说的各种 importer 实现,memory importer,加密 zip 文件之类的,并且支持加密的 http://PyStand.int。
第五层:修改字节码,找到 python 源代码的 include/opcode.h:自己魔改一遍,基本反编译的程序都蒙圈了,再到 Include/internal/pycore_ast.h 下面修改一些结构体的内部顺序,这样只要对方没有你的头文件,想从进程内存级别 intercept 进来获取字节码或者 ast 的都会非常麻烦。第六层:静态编译,把所有第三方库和 python 自己静态编译成一个 exe 或者 dll,没有任何依赖,不暴露任何 dll 接口,集成上面说过的所有功能。由于你全部依赖都静态编译了,所以可以给 PyObject 里加两个无关的成员,调整一下已有成员顺序,别人就是进程截取 PyObject 的指针,由于没有头文件,内部结构不知道,所以它也没有任何办法。第七层:你的可执行每次启动会检测可执行文件末尾,是否有添加的内容,如果有,把他视为一个加密的压缩包,在内存里解密并 import 对应模块,这样你上面的单个程序就可以和具体逻辑相分离,有了新的逻辑代码,压缩加密后添加在唯一可执行尾部即可。。。。。。还有很多类似的方法,这里仅仅抛砖引玉,没有绝对的安全,就是看你愿意投入多少人力,可以做到哪一层,个人的话,上面基础加密足够了,公司团队的话,安排人搞个一两个月,基本也就搞定了。