(19)中华人民共和国国家知识产权局
(12)发明专利申请
(10)申请公布号 (43)申请公布日 (21)申请号 201911189495.6
(22)申请日 2019.11.28
(71)申请人 施羊梦燊
地址 211899 江苏省南京市浦口区江浦街
道浦口海院路88号融侨观邸20栋3单
元705
申请人 费奕铭 鞠方舟
(72)发明人 施羊梦燊 费奕铭 鞠方舟 
(74)专利代理机构 济南诚智商标专利事务所有
限公司 37105
代理人 朱晓熹
(51)Int.Cl.
G06F  21/12(2013.01)
G06F  21/14(2013.01)
G06F  21/60(2013.01)
(54)发明名称
一种基于代码虚拟化的Python程序加密保
护系统与方法
(57)摘要
本发明提供了一种基于代码虚拟化的
Python程序加密保护系统与方法,本发明通过设
置pyc分析模块、code对象反汇编模块、加密虚拟
机生成模块、code对象后处理模块、code对象生
成模块以及pyc生成模块,在不对Python解释器
层进行任何修改以及不加载任何第三方dll、so
库的前提下,尽可能的高强度保护Python代码,
破坏原有pyc文件结构,致使通用反编译工具在
架构上无法应用于被加密后的pyc文件,提高程
序安全性,实现Python脚本语言所写软件防篡
改、
防伪造。权利要求书1页  说明书6页  附图1页CN 110929234 A 2020.03.27
C N  110929234
A
1.一种基于代码虚拟化的Python程序加密保护系统,其特征在于,所述系统包括:
pyc分析模块、code对象反汇编模块、加密虚拟机生成模块、code对象后处理模块、code 对象生成模块以及pyc生成模块;
所述pyc分析模块用于载入pyc文件,并反序列化读取code对象,从code对象的co_consts字段中递归读取pyc文件中包含的全部函数的code对象;
所述code对象反汇编模块用于将code对象中包含的opcode序列反汇编并拆分为相互独立的单条指令,并根据跳转语句对指令进行分块处理,得到多个不含跳转语句的顺序执行代码片段;
所述加密虚拟机生成模块用于生成虚拟机,并使用生成的虚拟机代码片段替换函数中的代码片段;
所述code对象后处理模块用于对每个函数的代码片段添加花指令,并对每个代码片段进行乱序重排序;
所述code对象生成模块用于对所有的代码片段重新组装为可正常执行的code对象;所述pyc生成模块用于将重新组装好的code对象打包或压缩,生成新的pyc文件。
2.根据权利要求1所述的一种基于代码虚拟化的Python程序加密保护系统,其特征在于,所述pyc文件为通过py_compile模块对py源码编译得到。
3.根据权利要求1所述的一种基于代码虚拟化的Python程序加密保护系统,其特征在于,所述pyc文件在载入后需裁剪头8个字节。
4.根据权利要求1所述的一种基于代码虚拟化的Python程序加密保护系统,其特征在于,所述新的pyc文件在打包或压缩前需追加pyc文件头。
5.一种基于代码虚拟化的Python程序加密保护方法,其特征在于,所述方法包括以下步骤:正则化匹配26个字母python
S1、载入pyc文件,并反序列化读取code对象,从code对象的co_consts字段中递归读取pyc文件中包含的全部函数的code对象;
S2、将code对象中包含的opcode序列反汇编并拆分为相互独立的单条指令,并根据跳转语句对指令进行分块处理,得到多个不含跳转语句的顺序执行代码片段;
S3、对于每个函数,查询对应的code对象中co_consts字段是否包含预设字符串常量,如果存在则生成虚拟机,并使用生成的虚拟机代码片段替换函数中的代码片段,否则不对函数进行处理;
S4、对每个函数的代码片段添加花指令,并对每个代码片段进行乱序重排序;
S5、对所有的代码片段重新组装为可正常执行的code对象;
S6、将重新组装好的code对象打包或压缩,生成新的pyc文件。
6.根据权利要求5所述的一种基于代码虚拟化的Python程序加密保护方法,其特征在于,所述pyc文件为通过py_compile模块对py源码编译得到。
7.根据权利要求5所述的一种基于代码虚拟化的Python程序加密保护方法,其特征在于,所述pyc文件在载入后需裁剪头8个字节。
8.根据权利要求5所述的一种基于代码虚拟化的Python程序加密保护方法,其特征在于,所述新的pyc文件在打包或压缩前需追加pyc文件头。
权 利 要 求 书1/1页CN 110929234 A
一种基于代码虚拟化的Python程序加密保护系统与方法
技术领域
[0001]本发明涉及软件程序加密技术领域,特别是一种基于代码虚拟化的Python程序加密保护系统与方法。
背景技术
[0002]目前,市面上使用的私有或公开商业化的Python代码保护方案,大致可分为以下几种类型:
[0003]1、对Python源代码进行变量名、函数名混淆,或进行加密处理后使用exec语句执行。该中方法没有改变源代码流程和结构本身,因为Python脚本语言的特殊性,被混淆的代码依然是明文存在,且可被直接查看。虽然丢失了标识符名称之后的Python脚本更加难以阅读,但依旧可以很容易出关键位置的算法,并可直接修改相关代码,起不到实质上的保护作用。对于将Python脚本进行加密并调用exec的方式,由于可以直接拦截compile与exec 语句,从而可以直接获得原始的Python源码。此方式虽然更大程度上加大了分析的复杂度,但相反的却更容易被完全解密,甚至是被做出通用解密工具,直接获取到完整的源码。[0004]2、将Python编译为pyc之后进行分发。由于目前业界对Python的研究较为成熟,而Python的编译机制存在着高度的规律性,因此目前市面上已有“pyretic”、“uncompyle”等通用pyc反编译工具,反编译准确率非常高。将Python编译成pyc之后依旧可以被简单的反编译,无实际保护作用。此方式可直接通过Python的自带模块py_compile完成,知晓率较高,但安全性几乎没有。
[0005]3、使用nuitka、pyinstaller、py2exe等第三方库打包成独立的可执行文件。该方式首先遇到的问题即为跨平台问题。例如,用py2exe打包的Python软件,将只能在Windows 平台上运行,无法用于Linux系统。同时,打包为可执行之后,因需要附带一个完整的Python 解释器以及相关Python自带模块,软件体积大幅度增大。且由于py2exe、pyinstaller等软件均为开源工具,其工作原理非常清晰明了。市面上甚至已经出现了如“pyinstaller rebuilder”等通用反编译、修改后重打包的工具,使得此类方法依旧没有很好的实际保护效果。
[0006]4、对pyc本身的co_varnames、co_names等字段混淆后,在co_code中增加花指令并重新生成pyc文件。此方式改良了pyc文件可被轻易反编译的弱点。被修改后的pyc文件不符合Python的正常编译结果,直接导致通用反编译工具报错退出。但这个过程往往是可逆的,即使原始的co_varnames、co_names字段已被抹去,依旧可以通过替换为如var_1、var_2等合法变量名的方式再进行二次处理;而对于co_code中的花指令,由于插花的类型是有限的,可以通过简单的正则表达式予以去除,之后将代码按照流程重排序并修复跳转地址,即可直接送入通用反编译工具进行正常反编译。此方式进一步提高了逆向分析的门槛,但依旧是没有解决原程序流程直接暴露的问题,导致二次处理即可直接反编译。
[0007]5、重新编译Python解释器,置换解释器主循环中的Opcode操作码的对应数字。此方式直接导致了pyc文件无法被正常识别和反编译。在接触不到被修改后的Python虚拟机
以及自带模块的情况下,此方法确实是无懈可击的。但由于Python自带模块大同小异,被编译后的自带模块虽然被替换了Opcode指令的对应关系,但结构上依旧和正常的模块是一致的。因此对于Python的自带模块,可以直接用一个正常的同名文件进行文件对比,重新出Opcode的对应关系,之后将Opcode对应关系重新恢复即可送入通用反编译工具进行反编译。此方式也同样对pyc文件的逆向分析造成了干扰,但依旧没有改变pyc的原始结构,导致存在不少的漏洞可以作为切入点。
[0008]6、加载第三方dll(或so库),拦截python的import过程,在pyc脚本被加载前先通过自己的dll进行解
密。该方式首先带来的问题依旧是跨平台问题。一些代码保护库只有dll版本或只有so版本,致使无法在所有的操作系统上都可以正常加载。其次,由于第三方dll的不规范性,往往一些过多的反调试、反分析方式会造成杀毒软件的报警,或者需要过多的系统权限,这些无不对用户体验造成严重的不良影响。且此方法依然没有解决根本问题,简单拦截Python的import,或使用Python自带的反射功能,都能够获取到被解密之后的原始code对象,进而直接写到文件进行反编译。
发明内容
[0009]本发明的目的是提供一种基于代码虚拟化的Python程序加密保护系统与方法,旨在解决现有技术中Python脚本语言所写软件存在安全性低的问题,实现在不对Python解释器层进行任何修改以及不加载任何第三方dll、so库的前提下,提高程序安全性。
[0010]为达到上述技术目的,本发明提供了一种基于代码虚拟化的Python程序加密保护系统,所述系统包括:
[0011]pyc分析模块、code对象反汇编模块、加密虚拟机生成模块、code对象后处理模块、code对象生成模块以及pyc生成模块;
[0012]所述pyc分析模块用于载入pyc文件,并反序列化读取code对象,从code对象的co_ consts字段中递归读取pyc文件中包含的全部函数的code对象;
[0013]所述code对象反汇编模块用于将code对象中包含的opcode序列反汇编并拆分为相互独立的单条指令,并根据跳转语句对指令进行分块处理,得到多个不含跳转语句的顺序执行代码片段;
[0014]所述加密虚拟机生成模块用于生成虚拟机,并使用生成的虚拟机代码片段替换函数中的代码片段;
[0015]所述code对象后处理模块用于对每个函数的代码片段添加花指令,并对每个代码片段进行乱序重排序;
[0016]所述code对象生成模块用于对所有的代码片段重新组装为可正常执行的code对象;
[0017]所述pyc生成模块用于将重新组装好的code对象打包或压缩,生成新的pyc文件。[0018]优选地,所述pyc文件为通过py_compile模块对py源码编译得到。
[0019]优选地,所述pyc文件在载入后需裁剪头8个字节。
[0020]优选地,所述新的pyc文件在打包或压缩前需追加pyc文件头。
[0021]本发明还提供了一种基于代码虚拟化的Python程序加密保护方法,所述方法包括以下步骤:
[0022]S1、载入pyc文件,并反序列化读取code对象,从code对象的co_consts字段中递归读取pyc文件中包含的全部函数的code对象;
[0023]S2、将code对象中包含的opcode序列反汇编并拆分为相互独立的单条指令,并根据跳转语句对指令进行分块处理,得到多个不含跳转语句的顺序执行代码片段;
[0024]S3、对于每个函数,查询对应的code对象中co_consts字段是否包含预设字符串常量,如果存在则生成虚拟机,并使用生成的虚拟机代码片段替换函数中的代码片段,否则不对函数进行处理;
[0025]S4、对每个函数的代码片段添加花指令,并对每个代码片段进行乱序重排序;[0026]S5、对所有的代码片段重新组装为可正常执行的code对象;
[0027]S6、将重新组装好的code对象打包或压缩,生成新的pyc文件。
[0028]优选地,所述pyc文件为通过py_compile模块对py源码编译得到。
[0029]优选地,所述pyc文件在载入后需裁剪头8个字节。
[0030]优选地,所述新的pyc文件在打包或压缩前需追加pyc文件头。
[0031]发明内容中提供的效果仅仅是实施例的效果,而不是发明所有的全部效果,上述技术方案中的一个技术方案具有如下优点或有益效果:
[0032]与现有技术相比,本发明无需使用第三方dll或so库,保留了Python语言的跨平台性;使用代码虚拟化技术保护Python代码,使得加密后的Python代码无法通过拦截Python 运行时提取;即使Python代码被提取,依旧需要对加密虚拟机本身进行完整逆向才能分析提取的Python代码,而由于加密虚拟机的高度随机性和复杂性,逆向加密虚拟机极为困难,工作成本远超过被保护代码本身的成本;加密虚拟机使用多种自校验算法与运行时动态解密算法,使加密虚拟机本身难以被篡改、调试、破解,修改虚拟机的任何一项数据都将直接导致自解密失败或上下文紊乱,使被保护的Python代码无法成功读取,算法上保护了被保护代码的安全;即使加密虚拟机被攻破或未使用虚拟化保护功能,被保护的Python代码依旧被插入了大量花指令,并进行了乱序排序混淆,仍然无法直接反编译,且干扰反汇编工具的正常执行;由于是算法本身上的防护,而非拦截系统api进行的调试器对抗检测,因此保护效果要更加可靠,同时与杀毒软件、主动防护程序、权限控制程序都有良好的兼容性;由于使用了编译性质的处理,因此源代码始终没有出现在加密后文件的任何一部分,因此在架构上杜绝了通过拦截Python运行时直接获取到源码的严重安全问题。
附图说明
[0033]图1为本发明实施例中所提供的一种基于代码虚拟化的Python程序加密保护系统框图;
[0034]图2为本发明实施例中所提供的一种基于代码虚拟化的Python程序加密保护方法流程图。
具体实施方式
[0035]为了能清楚说明本方案的技术特点,下面通过具体实施方式,并结合其附图,对本发明进行详细阐述。下文的公开提供了许多不同的实施例或例子用来实现本发明的不同结构。为了简化本发明的公开,下文中对特定例子的部件和设置进行描述。此外,本发明可以

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。