(10)申请公布号 (43)申请公布日 2013.07.24C N 103218551 A (21)申请号 201310159747.7
(22)申请日 2013.05.03
G06F 21/14(2013.01)
(71)申请人飞天诚信科技股份有限公司
地址100085 北京市海淀区学清路9号汇智
大厦B 楼17层
(72)发明人陆舟
于华章
(54)发明名称
一种保护java 程序的方法
(57)摘要
本发明公开一种保护java 程序的方法,属
于软件保护领域。所述方法包括:java 虚拟机装
载class 文件,当class 文件中的java 类方法对
应的java 指令符合预设可移植指令条件时,将
java 类方法对应的java 指令移植到预设缓冲区
中,获取java 类方法的最大栈深度和最大局部变
量个数,并用获取栈和局部变量的java 类方法、
执行加密锁内虚拟机的java 类方法、修改栈和局
部变量的java 类方法填充class 文件中被移植
的java 指令的位置。采用本发明的技术方案,将
部分java 程序移植到加密锁中,修改了被保护的
java 程序,使得程序逻辑不完整,无法还原原始
java 程序,提高了java 程序的安全性。
(51)Int.Cl.
权利要求书3页 说明书15页 附图2页
(19)中华人民共和国国家知识产权局(12)发明专利申请权利要求书3页 说明书15页 附图2页(10)申请公布号CN 103218551 A
*CN103218551A*
1.一种保护java程序的方法,其特征在于,包括:
步骤A:java虚拟机装载class文件,并判断所述class文件是否是合法的文件,如果是,则执行步骤B,否则返回错误信息,结束;
步骤B:所述java虚拟机获取所述class文件中java类方法的总个数和java类方法的起始位置,根据所述起始位置到当前java类方法;
步骤C:所述java虚拟机解析当前java类方法对应的java指令,并判断是否解析成功,如果是,则执行步骤D,否则返回错误信息,结束;
步骤D:所述java虚拟机判断所述当前java类方法对应的java指令是否符合预设可移植指令条件,如果是,则将所述当前java类方法对应的java指令移植并保存到预设缓冲区中,执行步骤E,否则执行步骤G;
步骤E:所述java虚拟机获取当前java类方法的最大java虚拟机栈深度和最大局部变量个数;
步骤F:所述java虚拟机根据所述最大java虚拟机栈深度和最大局部变量个数,用获取栈和局部变量的java类方法、执行加密锁内虚拟机的java类方法与修改栈和局部变量的java类方法填充所述class文件中被移植的java指令的位置,执行步骤G;
步骤G:所述java虚拟机判断已解析的java类方法的个数是否达到所述class文件中java类方法的总个数,如果是,则将所述预设缓冲区中的当前java类方法对应的java 指令移植到加密锁内,结束,否则继续获取下一java类方法作为当前java类方法,返回执行步骤C。
2.根据权利要求1所述的方法,其特征在于,所述步骤A中,所述判断所述class文件是否是合法的文件,具体为:获取并判断class文件的文件头是否为预设字符串,如果是,则表示所述class文件是合法的文件,否则表示所述class文件是不合法的文件。
3.根据权利要求1所述的方法,其特征在于,所述步骤C中,所述解析当前java类方法对应的java指令,具体为:
步骤C-1:所述java虚拟机获取所述class文件中常量池的个数和常量池的起始位置;
步骤C-2:所述java虚拟机根据当前java类方法的第一成员变量和第二成员变量,从所述常量池中获取java类方法名称和java类方法描述符,并判断是否获取成功,如果是,则执行步骤C-3,否则返回错误信息,结束;
步骤C-3:所述java虚拟机根据当前java类方法的第三成员变量和第四成员变量,获取当前java类方法的附加属性,并判断是否获取成功,如果是,则执行步骤D,否则返回错误信息,结束。
4.根据权利要求3所述的方法,其特征在于,所述当前java类方法的第一成员变量是对所述常量池中的java类方法名称的索引;所述当前java类方法的第二成员变量是对所述常量池中java类方法描述符的索引;所述当前java类方法的第三成员变量为当前java 类方法的附加属性的个数;所述当前java类方法的第四成员变量为当前java类方法的附加属性的起始位置。
5.根据权利要求3或4所述的方法,其特征在于,所述附加属性包括code属性,code 属性中包括当前java类方法的java指令和当前java类方法的java指令的长度。
6.根据权利要求3所述的方法,其特征在于,所述步骤C与所述步骤D之间包括:
步骤A-1:所述java虚拟机显示class文件的当前java类方法和当前java类方法对应的java指令;
步骤B-1:所述java虚拟机判断已解析的java类方法的个数是否超过所述class文件中java类方法的总个数,如果是,则执行步骤C-1,否则将下一java类方法作为当前java 类方法,返回执行步骤C;
步骤C-1:所述java虚拟机接收用户对显示的java类方法和java类方法对应的java 指令的选择,根据所述附加属性,获取用户选择的java类方法对应的java指令的起始位置,根据所述起始位置,到当前java
类方法对应的java指令,执行步骤D。
7.根据权利要求3所述的方法,其特征在于,所述步骤D具体为:
步骤A-2:所述java虚拟机判断当前java类方法对应的java指令是否符合预设可移植指令条件,如果是,则执行步骤B-2,否则执行步骤G;
步骤B-2:所述java虚拟机显示java文件的当前java类方法和当前java类方法对应的java指令;
字符串常量池和运行时常量池的联系步骤C-2::所述java虚拟机判断已解析的java类方法的个数是否超过class文件中java类方法的总个数,如果是,则执行步骤D-2,否则将下一java类方法作为当前java 类方法,返回执行步骤C;
步骤D-2:所述java虚拟机接收用户对显示的java类方法和java类方法对应的java 指令的选择,根据附加属性,获取被选择的java指令的起始位置,将起始位置的java指令作为当前java指令,将所述当前java指令移植并保存到预设缓冲区中,执行步骤E。
8.根据权利要求1或6或7中任意一项所述的方法,其特征在于,所述判断当前java 类方法对应的java指令是否符合预设可移植指令条件,具体为:
步骤D-1:所述java虚拟机判断当前java类方法对应的java指令的类型是否存在于预设可移植java指令类型集合中,如果是,则执行步骤D-2,否则表示当前指令不可被移植,执行步骤G;
步骤D-2:所述java虚拟机判断当前java类方法对应的java指令是否存在于预设引用常量池指令集合中,如果是,则表示当前指令不可被移植,执行步骤G,否则执行步骤D-3;
步骤D-3:所述java虚拟机判断当前java类方法对应的java指令是否涉及内存操作,如果是,则表示当前指令不可被移植,执行步骤G,否则执行步骤D-4;
步骤D-4:所述java虚拟机判断当前java类方法对应的java指令是否对class文件结构体的成员变量进行操作,如果是,则表示当前指令不可被移植,执行步骤G,否则执行步骤D-5;
步骤D-5:所述java虚拟机判断当前java类方法对应的java指令是否调用外部java 类方法,如果是,则表示当前指令不可被移植,执行步骤G,否则执行步骤E。
9.根据权利要求8所述的方法,其特征在于,所述预设可移植java指令类型集合,包括栈操作指令类型、逻辑运算指令类型、位操作指令类型、算数运算指令类型。
10.根据权利要求1所述的方法,其特征在于,所述步骤F中,所述用获取栈和局部变量的java类方法填充所述class文件中被移植的java指令的位置,具体为:
步骤F-11:所述java虚拟机定位到被移植的当前java类方法的位置;
步骤F-12:所述java虚拟机创建当前java类方法的常量池的索引;
步骤F-13:所述java虚拟机将获取栈和局部变量的java类方法与所述常量池的索引填充到被移植的当前java类方法的位置。
11.根据权利要求1所述的方法,其特征在于,所述步骤F中,所述用执行加密锁内虚拟机的java类方法填充所述class文件中被移植的java指令的位置,具体为:步骤F-21:所述java虚拟机定位到被移植的当前java类方法的位置;
步骤F-22:所述java虚拟机创建当前java类方法的常量池的索引;
步骤F-23:所述java虚拟机将执行加密锁内虚拟机的java类方法与所述常量池的索引填充到被移植的当前java类方法的位置。
12.根据权利要求1所述的方法,其特征在于,所述步骤F中,所述用修改栈和局部变量的java类方法填充所述class文化中被移植的java指令的位置,具体为:步骤F-31:所述java虚拟机定位到被移植的当前java类方法的位置;
步骤F-32:所述java虚拟机创建当前java类方法的常量池的索引;
步骤F-33:所述java虚拟机将修改栈和局部变量的java类方法与所述常量池的索引填充到所述class文化中被移植的当前java类方法的位置。
1/15页
一种保护java 程序的方法 技术领域
[0001] 本发明涉及软件保护领域,尤其涉及一种保护java 程序的方法。
背景技术
[0002]
Java 语言是一种解释型语言。Java 源代码经过编译,生成java 指令文件,所生
成的java 指令文件在Java 虚拟机(JVM) 中解释执行。这种解释执行的运行机制导致Java 源代码很容易被反编译。目前这种反编译工具很多,并且反编译的效果也很好,使得任何使用Java 软件的用户都可以很容易地反编译和重构产品的源代码,从而使所有基于Java 语言的授权认证许可变得毫无意义。
[0003] 因此,保证Java 软件程序不被反编译和重构或者提高反编译和重构的难度,是基于Java 语言的软件保护领域需要解决的一个重要问题。 发明内容
[0004] 本发明的目的是为了克服现有技术的不足,提供了一种保护java 程序的方法。
[0005] 本发明采用的技术方案是:一种保护java 程序的方法,包括:
[0006] 步骤A :java 虚拟机装载class 文件,并判断所述class 文件是否是合法的文件,如果是,则执行步骤B ,否则返回错误信息,结束;
[0007] 步骤B :所述java 虚拟机获取所述class 文件中java 类方法的总个数和java 类方法的起始位置,根据所述起始位置到当前java 类方法;
[0008] 步骤C :所述java 虚拟机解析当前java 类方法对应的java 指令,并判断是否解析成功,如果是,则执行步骤D ,否则返回错误信息,结束;
[0009] 步骤D :所述java 虚拟机判断所述当前java 类方法对应的java 指令是否符合预设可移植指令条件,如果是,则将所述当前java 类方法对应的java 指令移植并保存到预设缓冲区中,执行步骤E ,否则执行步骤G ;
[0010] 步骤E :所述java 虚拟机获取当前java 类方法的最大java 虚拟机栈深度和最大局部变量个数;
[0011] 步骤F :所述java 虚拟机根据所述最大java 虚拟机栈深度和最大局部变量个数,用获取栈和局部变量的java 类方法、执行加密锁内虚拟机的java 类方法与修改栈和局部变量的java 类方法填充所述class 文件中被移植的java 指令的位置,执行步骤G ;
[0012] 步骤G :所述java 虚拟机判断已解析的java 类方法的个数是否达到所述class 文件中java 类方法的总个数,如果是,则将所述预设缓冲区中的当前java 类方法对应的java 指令移植到加密锁内,结束,否则继续获取下一java 类方法作为当前java 类方法,返回执行步骤C ;
[0013] 所述步骤A 中,所述判断所述class 文件是否是合法的文件,具体为:获取并判断class 文件的文件头是否为预设字符串,如果是,则表示所述class 文件是合法的文件,否则表示所述class 文件是不合法的文件; 说 明 书CN 103218551 A
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论