Python 是一种解释型语言,没有编译过程,发布程序的同时就相当于公开了源码,这也是其作为开源语言的一个特性。但在某些场景下,我们的源码是不想被别人看到的,例如开发商业软件、编写 0day 漏洞 POC/EXP、免杀 shellcode 等。
多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!??¤
QQ群:1057034340
以免杀为例,如果打包的源码没做任何处理,安全研究人员在捕获到样本后连分析的过程都省掉了,直接通过源码锁定特征,很快免杀就会失效,这显然不是我们想看到的。因此对源码做相应的保护还是有必要的。
注:本文代码只为介绍源码保护方法,不涉及免杀姿势。
目前保护 Python 代码主要有以下几种方式:
-
对代码进行混淆以降低源码可读性
-
将 py 文件编译为二进制 pyc 文件
-
使用 Pyinstaller 打包源码为二进制可执行文件
-
使用 PyArmor 加密脚本
-
将 py/pyc 文件使用 AES 加密为 pye 文件
-
将 py 文件转为 c 文件后编译为动态链接库文件
代码混淆
代码混淆是指在不改变代码逻辑的情况下,对代码结构进行变换,通过一些带有混淆性质的命名、注释等,使代码变得晦涩难懂,从而达到保护代码的作用。这里提供两种代码混淆的方式:
代码混淆库 pyobfuscate
pyobfuscate 会对代码中用户定义的类、函数、变量等进行重命名、更改代码缩进(默认1)、移除注释、添加不影响逻辑的代码语句,最终起到混淆的作用。不过 pyobfuscate 使用 Python2 编写,无法解析 Python3 中的 f-string 等特殊语法,因此使用前需要将源码进行一定程度的修改,当然也可以直接修改 pyobfuscate 库,增加对 Python3 版本的支持。
样例 (对 malicious.py 文件进行混淆):
python2 pyobfuscate.py malicious.py > malicious_obfuscated.py
效果如下图所示,左侧为一段从云端获取 shellcode 加载进内存执行的代码,右图为其混淆后的结果。
可以看出代码虽然进行了一定程度的变换,但代码结构基本还是原来的样子,并不能很有效的增加破解难度。
利用 AST 混淆源码
AST,即抽象语法树,它可以将源代码以树状结构表示。Python 内置了 ast 模块,该模块通过内置函数 compile() 和 parse() 将 Python 源代码解析为 AST,之后可以利用 ast 模块内的方法对 ast 节点进行