发明名称 一种基于模块钩子的Python字节码文件保护方法
摘要 本发明公开了一种基于模块钩子的Python字节码文件保护方法,包括:1对Python字节码文件进行加密处理;2设计Python模块钩子及其对应的注册脚本;3在客户端的Python解释器的源码文件中添加Python模块钩子及其对应的注册脚本;4开发者端将主程序和加密后的Python字节码文件发布给客户端,并提供新的Python解释器的源码文件;5客户端对添加Python模块钩子及其对应的注册脚本后的Python解释器的源码文件进行编译,得到编译后的Python解释器;6客户端利用编译后的Python解释器执行主程序。本发明能够有效抵抗反编译,提高对Python软件程序的保护强度。
申请公布号 CN106599628A 申请公布日期 2017.04.26
申请号 CN201611123379.0 申请日期 2016.12.08
申请人 合肥康捷信息科技有限公司 发明人 顾乃杰;陈悟;王小强;王岩
分类号 G06F21/14(2013.01)I 主分类号 G06F21/14(2013.01)I
代理机构 安徽省合肥新安专利代理有限责任公司 34101 代理人 陆丽莉;何梅生
主权项 一种基于模块钩子的Python字节码文件保护方法,是应用于开发者端和客户端之间;所述客户端利用Python解释器执行所述开发者端提供的Python应用程序的主程序;所述应用程序中包含所述主程序和若干个Python字节码文件;所述主程序在执行过程中按默认方式导入若干个Python字节码文件,从而得到所述Python应用程序的执行结果;其特征是,所述Python字节码文件保护方法是按如下步骤进行:步骤1、对所述开发者端提供的Python字节码文件进行加密处理,得到加密后的Python字节码文件;步骤1.1、使用随机数发生器生成对称密钥K;步骤1.2、根据所述对称密钥K,使用对称加密算法对所述Python字节码文件进行加密,得到密文F;步骤1.3、在所述密文F的前端添加识别标签,得到标签密文F′;步骤1.4、利用Shamir(t,n)门限方案将所述对称密钥K分解成n份影子信息;并将所述n份影子信息随机打乱后写入所述密文F和识别标签之间,从而得到混合密钥的密文F<sup>*</sup>作为加密后的Python字节码文件;步骤2、设计Python模块钩子及其对应的注册脚本;步骤2.1、根据所述Python模块钩子的协议规定,定义所述查找器为包含有查找所述混合密钥密文F<sup>*</sup>功能的find_module函数的类;定义所述加载器为包含有加载混合密钥密文F<sup>*</sup>功能的load_module函数的类;定义模块钩子的注册函数为能将实例化的查找器类插入到查找器的存储列表sys.meta_path中的函数;由所述查找器、加载器和模块钩子的注册函数组成所述Python模块钩子;步骤2.2、定义一个sitecustomize.py文件,在所述sitecustomize.py文件中添加导入所述Python模块钩子的语句,再添加调用所述模块钩子的注册函数的语句,从而得到所述Python模块钩子所对应的注册脚本;步骤3、在所述客户端的Python解释器的源码文件中添加所述Python模块钩子及其对应的注册脚本:步骤3.1、利用Cython工具将所述Python模块钩子转换为.c文件,再编译成.so共享库文件后,将所述.so共享库文件复制到Python解释器源码文件中的site‑package目录下;步骤3.2、将所述Python模块钩子所对应的注册脚本复制到所述Python解释器的源码文件中的site‑package目录下,从而得到新的Python解释器的源码文件;步骤4、所述开发者端将主程序和加密后的Python字节码文件发布给所述客户端,并将所述新的Python解释器的源码文件提供给所述客户端;步骤5、所述客户端对添加Python模块钩子及其对应的注册脚本后的Python解释器的源码文件进行编译,得到编译后的Python解释器;步骤6、所述客户端利用编译后的Python解释器执行所述主程序;步骤6.1、编译后的Python解释器执行所述Python模块钩子的注册脚本,从而在所述sys.meta_path列表中插入所述实例化的查找器类,完成所述Python模块钩子的注册;步骤6.2、在主程序在执行过程中导入若干个加密后的Python字节码文件时,触发所述sys.meta_path列表中实例化的查找器类;步骤6.3、所述查找器利用find_module函数对加密后的Python字节码文件进行判断,若加密后的Python字节码文件为混合密钥的密文F<sup>*</sup>,则利用所述加载器的load_module函数对所述混合密钥的密文F<sup>*</sup>进行加载后,执行步骤6.4;否则,按照默认方式进行加载和导入;步骤6.4、所述加载器的load_module函数在所述混合密钥密文F<sup>*</sup>中获取随机打乱后的n份影子信息,并在n份影子信息中随机获取t份影子信息后,利用Shamir(t,n)门限方案还原出对称密钥K;步骤6.5、所述加载器利用所对称密钥述K在内存中对所述密文F进行解密,得到所述Python字节码文件;步骤6.6、所述加载器在内存中提取所述Python字节码文件中的代码对象code object,从而完成所述加密后的Python字节码文件的加载和导入。
地址 230000 安徽省合肥市望江西路和创新大道交叉口中国科学技术大学先进技术研究院综合大楼A526