首页 / 专利库 / 专利权 / 优先权文件 / 一种Python脚本混淆、水印的方法及装置

一种Python脚本混淆、印的方法及装置

阅读:824发布:2020-05-23

专利汇可以提供一种Python脚本混淆、印的方法及装置专利检索,专利查询,专利分析的服务。并且本 发明 提供一种Python脚本混淆、 水 印的方法及装置,其中,一种Python脚本混淆、水印的装置,包括脚本源代码编译单元、解析单元、规则记录单元、优先权设定单元、co_varnames生成单元、封装单元、Loader生成单元、加密单元以及pyc文件生成单元,本发明还提供了一种Python脚本混淆、水印的方法,以提高python程序模 块 的安全性,并且保护编译后Python脚本不被反编译、水印不能被篡改,且兼容CPython、Jython、IronPython、PyPy等各种python解释器。,下面是一种Python脚本混淆、印的方法及装置专利的具体信息内容。

1.一种Python脚本混淆、印的方法,其特征在于,包括如下步骤:
第一步:根据要保护python脚本源代码编译单元生成所有PyCodeObject;
第二步:为PyCodeObject的字节码co_code利用解析单元按照解析的时间顺序依次生成若干OPBLOCK实例,判断OPBLOCK实例中的opcode是否具备跳转,并记录跳转规则;
第三步:依据记录的跳转规则以及生成的若干OPBLOCK实例,保留生成的OPBLOCK实例的时间顺序,将剩余的OPBLOCK实例随机排列;从物理空间上彻底打乱OPBLOCK实例,使反汇编工具无法顺序解析字节码;
第四步:获取PyCodeObject的局部变量名元组co_varnames,替换为不合法的变量名;
第五步:通过types.CodeType递归组装步骤三生成的co_code与步骤四生成的co_varnames;
第六步:生成混淆的Loader,对Loader源代码进行编译形成Loader+0,并再次对Loader+0的PyCodeObject进行压缩;并以Loader混淆后PyCodeObject的字节码co_code作为密钥对压缩后的数据进行加密,最终替换Loader中的compressed_encrypted_data以便Loader在启动后动态解密和解压;
第七步:生成混淆后的pyc文件。
2.根据权利要求1所述的Python脚本混淆、水印的方法,其特征在于,在第二步中跳转规则为:判断跳转是否为相对跳转或者是否直接跳转、跳转是否为无条件或者是否有条件跳转,按照OPBLOCK的跳转顺序和跳转的条件记录规则并设定优先权。
3.根据权利要求1所述的Python脚本混淆、水印的方法,其特征在于,在第三步中,按照第二步记录规则和设定优先权连接第二步的中OPBLOCK,若为非跳转OPBLOCK,则生成一个JUMP_ABSOLUTE连接其顺序并执行下一个OPBLOCK;若为无条件直接跳转OPBLOCK,则修正其直接跳转的位置;若为无条件相对跳转OPBLOCK,则将相对跳转修改为直接跳转并修正其直接跳转的位置;若为有条件跳转OPBLOCK,则计算其跳转的位置,生成新的直接跳转到该位置,并修改条件跳转到新直接跳转;若直接跳转超出65535则需要使用EXTENDED_ARG来扩展JUMP_ABSOLUTE指令;最后在跳转指令后填充0-5个随机JUNKCODE字节,通过指令乱序,将指令从物理空间上彻底打乱,是反汇编工具无法顺序解析字节码。
4.根据权利要求1所述的Python脚本混淆、水印的方法,其特征在于,在第七步中,生成混淆后的pyc文件的具体方法为:通过types.CodeType组装混淆后Loader的PyCodeObject,再通过marshal.dumps序列化为字符串,最后在头部添加imp.get_magic()和时间戳保存pyc文件。
5.一种Python脚本混淆、水印的装置,其特征在于,包括
脚本源代码编译单元,根据要保护python脚本源代码编译生成所有PyCodeObject,解析单元,对PyCodeObject的字节码co_code按照时间顺序依次解析生成若干OPBLOCK实例,
规则记录单元,记录OPBLOCK实例中的opcode跳转规则;
优先权设定单元,根据OPBLOCK实例中的opcode跳转规则设定OPBLOCK实例跳转权限,co_varnames生成单元,获取PyCodeObject的局部变量名元组co_varnames,封装单元,通过types.CodeType递归组装步骤三生成的co_code与步骤四生成的co_varnames,
Loader生成单元,依据封装单元组装的步骤三生成的co_code与步骤四生成的co_varnames生成Loader;
加密单元:对Loader源代码进行编译形成Loader+0,并再次对Loader+0的PyCodeObject进行压缩;并以Loader混淆后PyCodeObject的字节码co_code作为密钥对压缩后的数据进行加密,
pyc文件生成单元,生成混淆后的pyc文件。

说明书全文

一种Python脚本混淆、印的方法及装置

技术领域

[0001] 本发明属于Python脚本处理技术,具体涉及一种Python脚本混淆、水印的方法及装置。

背景技术

[0002] Python是一编程语言,具有开发速度快,第三方扩展完善,代码编写量少等优点,由于Python的上述优点符合对开发效率要求,故Python成为众多软件开发热门语言之一;一般情况下应用程序发布时会将Python代码编译,来加快处理速度和隐藏源代码,用以保证Python代码的安全性。
[0003] Python的上述优点,使得Python大大方便了软件的开发,但是,由于Python的源代码只能编译,而不能加密,而使得Python代码一直存在被盗用的问题;并且Python代码编译出的二进制文件可以使用第三方软件反编译回Python源代码,从而使得Python代码存在的被盗用的问题得不到有效的解决。

发明内容

[0004] 有鉴于此,本发明的主要目的是提供一种Python脚本混淆、水印的方法及装置。
[0005] 本发明采用的技术方案是:
[0006] 一种Python脚本混淆、水印的方法,包括如下步骤:
[0007] 第一步:根据要保护python脚本源代码编译单元生成所有PyCodeObject;
[0008] 第二步:为PyCodeObject的字节码co_code利用解析单元按照解析的时间顺序依次生成若干OPBLOCK实例,判断OPBLOCK实例中的opcode是否具备跳转,并记录跳转规则;
[0009] 第三步:依据记录的跳转规则以及生成的若干OPBLOCK实例,保留生成的OPBLOCK实例的时间顺序,将剩余的OPBLOCK实例随机排列;从物理空间上彻底打乱OPBLOCK实例,使反汇编工具无法顺序解析字节码;
[0010] 第四步:获取PyCodeObject的局部变量名元组co_varnames,替换为不合法的变量名;
[0011] 第五步:通过types.CodeType递归组装步骤三生成的co_code与步骤四生成的co_varnames;
[0012] 第六步:生成混淆的Loader,对Loader源代码进行编译形成Loader+0,并再次对Loader+0的PyCodeObject进行压缩;并以Loader混淆后PyCodeObject的字节码co_code作为密钥对压缩后的数据进行加密,最终替换Loader中的compressed_encrypted_data以便Loader在启动后动态解密和解压;
[0013] 第七步:生成混淆后的pyc文件。
[0014] 优选的,在第二步中跳转规则为:判断跳转是否为相对跳转或者是否直接跳转、跳转是否为无条件或者是否有条件跳转,按照OPBLOCK的跳转顺序和跳转的条件记录规则并设定优先权。
[0015] 优选的,在第三步中,按照第二步记录规则和设定优先权连接第二步的中OPBLOCK,若为非跳转OPBLOCK,则生成一个JUMP_ABSOLUTE连接其顺序并执行下一个OPBLOCK;若为无条件直接跳转OPBLOCK,则修正其直接跳转的位置;若为无条件相对跳转OPBLOCK,则将相对跳转修改为直接跳转并修正其直接跳转的位置;若为有条件跳转OPBLOCK,则计算其跳转的位置,生成新的直接跳转到该位置,并修改条件跳转到新直接跳转;若直接跳转超出65535则需要使用EXTENDED_ARG来扩展JUMP_ABSOLUTE指令;最后在跳转指令后填充0-5个随机JUNKCODE字节,通过指令乱序,将指令从物理空间上彻底打乱,是反汇编工具无法顺序解析字节码。
[0016] 优选的,在第七步中,生成混淆后的pyc文件的具体方法为:通过types.CodeType组装混淆后Loader的PyCodeObject,再通过marshal.dumps序列化为字符串,最后在头部添加imp.get_magic()和时间戳保存pyc文件。
[0017] 一种Python脚本混淆、水印的装置,包括
[0018] 脚本源代码编译单元,根据要保护python脚本源代码编译生成所有PyCodeObject,
[0019] 解析单元,对PyCodeObject的字节码co_code按照时间顺序依次解析生成若干OPBLOCK实例,
[0020] 规则记录单元,记录OPBLOCK实例中的opcode跳转规则;
[0021] 优先权设定单元,根据OPBLOCK实例中的opcode跳转规则设定OPBLOCK实例跳转权限,
[0022] co_varnames生成单元,获取PyCodeObject的局部变量名元组co_varnames,[0023] 封装单元,通过types.CodeType递归组装步骤三生成的co_code与步骤四生成的co_varnames,
[0024] Loader生成单元,依据封装单元组装的步骤三生成的co_code与步骤四生成的co_varnames生成Loader;
[0025] 加密单元:对Loader源代码进行编译形成Loader+0,并再次对Loader+0的PyCodeObject进行压缩;并以Loader混淆后PyCodeObject的字节码co_code作为密钥对压缩后的数据进行加密,
[0026] pyc文件生成单元,生成混淆后的pyc文件。
[0027] 本发明提供了一种Python脚本混淆、水印的方法和装置,以提高python程序模的安全性,并且保护编译后Python脚本不被反编译、水印不能被篡改,且兼容CPython、Jython、IronPython、PyPy等各种python解释器。附图说明
[0028] 图1为本发明中PyCodeObject的嵌套结构原理图;
[0029] 图2为本发明的方法流程图

具体实施方式

[0030] 下面将结合附图以及具体实施例来详细说明本发明,在此本发明的示意性实施例以及说明用来解释本发明,但并不作为对本发明的限定。
[0031] 参照图1,本发明提供了一种Python脚本混淆、水印的装置,包括[0032] 脚本源代码编译单元,根据要保护python脚本源代码编译生成所有PyCodeObject,
[0033] 解析单元,对PyCodeObject的字节码co_code按照时间顺序依次解析生成若干OPBLOCK实例,
[0034] 规则记录单元,记录OPBLOCK实例中的opcode跳转规则;
[0035] 优先权设定单元,根据OPBLOCK实例中的opcode跳转规则设定OPBLOCK实例跳转权限,
[0036] co_varnames生成单元,获取PyCodeObject的局部变量名元组co_varnames,[0037] 封装单元,通过types.CodeType递归组装步骤三生成的co_code与步骤四生成的co_varnames,
[0038] Loader生成单元,依据封装单元组装的步骤三生成的co_code与步骤四生成的co_varnames生成Loader;
[0039] 加密单元:对Loader源代码进行编译,并再次对Loader+0的PyCodeObject进行压缩;并以Loader混淆后PyCodeObject的字节码co_code作为密钥对压缩后的数据进行加密,[0040] pyc文件生成单元,生成混淆后的pyc文件。
[0041] 本发明还提供了一种Python脚本混淆、水印的方法,包括如下步骤:
[0042] 第一步:根据要保护python脚本源代码编译单元生成所有PyCodeObject;
[0043] 第二步:为PyCodeObject的字节码co_code利用解析单元按照解析的时间顺序依次生成若干OPBLOCK实例,判断OPBLOCK实例中的opcode是否具备跳转,并记录跳转规则;参照表1,在第二步中跳转规则为:判断跳转是否为相对跳转或者是否直接跳转、跳转是否为无条件或者是否有条件跳转,按照OPBLOCK的跳转顺序和跳转的条件记录规则并设定优先权。
[0044] 表1为跳转指令列表
[0045]
[0046] 第三步:参照表2和表3,表2乱序前源码对应指令,表3为乱序后源码对应指令,依据记录的跳转规则以及生成的若干OPBLOCK实例,保留生成的OPBLOCK实例的时间顺序,将剩余的OPBLOCK实例随机排列;从物理空间上彻底打乱OPBLOCK实例,使反汇编工具无法顺序解析字节码;在第三步中,按照第二步记录规则和设定优先权连接第二步的中OPBLOCK,若为非跳转OPBLOCK,则生成一个JUMP_ABSOLUTE连接其顺序并执行下一个OPBLOCK;若为无条件直接跳转OPBLOCK,则修正其直接跳转的位置;若为无条件相对跳转OPBLOCK,则将相对跳转修改为直接跳转并修正其直接跳转的位置;若为有条件跳转OPBLOCK,则计算其跳转的位置,生成新的直接跳转到该位置,并修改条件跳转到新直接跳转;若直接跳转超出65535则需要使用EXTENDED_ARG来扩展JUMP_ABSOLUTE指令;最后在跳转指令后填充0-5个随机JUNKCODE字节,通过指令乱序,将指令从物理空间上彻底打乱,是反汇编工具无法顺序解析字节码。
[0047] 表2乱序前源码对应指令
[0048]
[0049]
[0050] 表3为乱序后源码对应指令举例
[0051]
[0052] 第四步:获取PyCodeObject的局部变量名元组co_varnames,替换为不合法的变量名;参照表4,表4提供了变量名混淆的实施例。
[0053] 表4提供了变量名混淆的实施例
[0054]
[0055] 第五步:通过types.CodeType递归组装步骤三生成的co_code与步骤四生成的co_varnames;
[0056] 第六步:生成混淆的Loader,对Loader源代码进行编译形成Loader+0,并再次对Loader+0的PyCodeObject进行压缩;并以Loader混淆后PyCodeObject的字节码co_code作为密钥对压缩后的数据进行加密,最终替换Loader中的compressed_encrypted_data以便Loader在启动后动态解密和解压;
[0057] 第七步:生成混淆后的pyc文件。在第七步中,生成混淆后的pyc文件的具体方法为:通过types.CodeType组装混淆后Loader的PyCodeObject,再通过marshal.dumps序列化为字符串,最后在头部添加imp.get_magic()和时间戳保存pyc文件。
[0058] 以上对本发明实施例所公开的技术方案进行了详细介绍,本文中应用了具体实施例对本发明实施例的原理以及实施方式进行了阐述,以上实施例的说明只适用于帮助理解本发明实施例的原理;同时,对于本领域的一般技术人员,依据本发明实施例,在具体实施方式以及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈