著录项信息
专利名称 | Java源代码的保护方法和系统 |
申请号 | CN201110288519.0 | 申请日期 | 2011-09-26 |
法律状态 | 授权 | 申报国家 | 中国 |
公开/公告日 | 2012-02-22 | 公开/公告号 | CN102360412A |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F21/14 | IPC分类号 | G;0;6;F;2;1;/;1;4查看分类表>
|
申请人 | 飞天诚信科技股份有限公司 | 申请人地址 | 北京市海淀区学清路9号汇智大厦B座17层
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 飞天诚信科技股份有限公司 | 当前权利人 | 飞天诚信科技股份有限公司 |
发明人 | 陆舟;于华章 |
代理机构 | 北京康信知识产权代理有限责任公司 | 代理人 | 吴贵明;余刚 |
摘要
本发明公开了一种Java源代码的保护方法和系统。在第一启动类被调用时,该方法包括以下步骤,其中,第一启动类为Java程序的启动类:第一启动类将第一密文数据进行解密,得到类加载器;类加载器将第二密文数据读入内存进行解密,得到第一类,其中,第一类为Java虚拟机运行的类,其后缀名为.class;类加载器将第二启动类加载到内存,其中,第二启动类为Java程序的jar包中的原启动类;以及类加载器将第一类加载到Java虚拟机,以便Java虚拟机能够调用第二启动类中的主接口,运行Java程序。通过本发明,能够实现Java源代码的保护,使得Java源代码不易被反汇编。
1.一种Java源代码的保护方法,其特征在于,在第一启动类被调用时该方法包括以下步骤,其中,所述第一启动类为Java程序的启动类:
S1:所述第一启动类将第一密文数据读入内存进行解密,得到第一明文数据,并将所述第一明文数据定义为类加载器,其中,所述第一密文数据为类加载器的字节码文件加密后得到的数据;
S2:所述类加载器将第二密文数据读入内存进行解密,得到第二明文数据,并将所述第二明文数据定义为第一类,其中,所述第一类为Java虚拟机运行的类,其后缀名为.class,所述第二密文数据为所述第一类的字节码文件加密后得到的数据;
S3:所述类加载器将第二启动类加载到内存,其中,所述第二启动类为Java程序的jar包中的原启动类;以及
S4:所述类加载器将所述第一类加载到所述Java虚拟机,以便所述Java虚拟机能够调用所述第二启动类中的主接口,运行所述Java程序,
其中,所述步骤S1包括:
S11:所述第一启动类将所述第一密文数据读入内存;
S12:所述第一启动类将本地的第一动态库加载到内存;
S13:所述第一启动类调用所述第一动态库中的第三接口;
S14:所述第一启动类将所述第一密文数据在内存中的地址传入所述第一动态库中的第三接口;
S15:所述第一动态库中的第三接口对所述第一密文数据进行解密,得到所述第一明文数据;以及
S16:所述第一动态库中的第三接口调用Java虚拟机的定义类接口将所述第一明文数据定义为所述类加载器。
2.根据权利要求1所述的Java源代码的保护方法,其特征在于,步骤S11包括:
S111:调用所述第一启动类中的第一接口;
S112:所述第一启动类中的第一接口调用所述第一启动类中的第二接口;以及S113:所述第一启动类中的第二接口将第一密文数据读入内存。
3.根据权利要求1所述的Java源代码的保护方法,其特征在于,步骤S3包括:
S31:所述第一动态库中的第三接口调用所述类加载器中的第四接口;
S32:所述类加载器中的第四接口读出所述Java程序的jar包中的配置文件;
S33:所述类加载器中的第四接口从所述配置文件中读出所述第二启动类;
S34:所述类加载器中的第四接口调用所述类加载器中的第五接口;以及S35:所述类加载器中的第五接口将所述第二启动类加载到内存。
4.根据权利要求3所述的Java源代码的保护方法,其特征在于,步骤S2包括:
S21:所述类加载器中的第五接口调用所述类加载器中的第六接口;
S22:所述类加载器中的第六接口将所述第二密文数据读入内存;
S23:所述类加载器中的第五接口对所述第二密文数据进行解密得到第二明文数据;
以及
S24:所述类加载器的第五接口调用Java虚拟机的定义类接口将所述第二明文数据定义为所述第一类。
5.根据权利要求1所述的Java源代码的保护方法,其特征在于,通过以下方式对所述第一密文数据和所述第二密文数据进行解密:
S2001:调用加密锁接口检索是否有加密锁;
S2002:在检索到所述加密锁时,调用所述加密锁接口将密文数据传入所述加密锁中;
S2003:调用所述加密锁接口使用存储在所述加密锁中的密钥对传入的所述密文数据进行解密,得到明文数据;以及
S2004:调用所述加密锁接口获取所述明文数据。
Java源代码的保护方法和系统\n技术领域\n[0001] 本发明涉及软件保护技术领域,具体而言,涉及一种Java源代码的保护方法和系统。\n背景技术\n[0002] Java语言是一种解释型语言,Java源代码经过编译,生成字节码文件,所生成的字节码文件在Java虚拟机中解释执行。由于这种字节码文件自描述性很强,保留了很多符号以及编译信息,导致Java源代码很容易被反编译成可读性很强的源代码,导致开发者的劳动成果被剽窃或者产品被篡改,随着Java语言的流行,Java的应用领域越来越广泛,对于Java源代码的保护的需求也越来越迫切。\n[0003] 现有技术中,对于Java源代码的保护一般是通过混淆打乱代码执行流程或者隐藏关键信息使反编译后的代码难以理解从而提高破解代价,但随着反混淆技术的发展,单纯的混淆已不能达到很好的保护目的。\n[0004] 针对相关技术中Java源代码容易被反汇编的问题,目前尚未提出有效的解决方案。\n发明内容\n[0005] 本发明的主要目的在于提供一种Java源代码的保护方法和系统,以解决Java源代码容易被反汇编的问题。\n[0006] 为了实现上述目的,根据本发明的一个方面,提供了一种Java源代码的保护方法。\n[0007] 根据本发明的Java源代码的保护方法,在第一启动类被调用时包括以下步骤,其中,第一启动类为Java程序的启动类:S1:第一启动类将第一密文数据读入内存进行解密,得到第一明文数据,并将第一明文数据定义为类加载器,其中,第一密文数据为类加载器的字节码文件加密后得到的数据;S2:类加载器将第二密文数据读入内存进行解密,得到第二明文数据,并将第二明文数据定义为第一类,其中,第一类为Java虚拟机运行的类,其后缀名为.class,第二密文数据为第一类的字节码文件加密后得到的数据;以及S3:类加载器将第二启动类加载到内存,其中,第二启动类为Java程序的jar包中的原启动类;S4:类加载器将第一类加载到Java虚拟机,以便Java虚拟机能够调用第二启动类中的主接口,运行Java程序。\n[0008] 进一步地,步骤S1包括:S11:第一启动类将第一密文数据读入内存;S12:第一启动类将本地的第一动态库加载到内存;S13:第一启动类调用第一动态库中的第三接口;\nS14:第一启动类将第一密文数据在内存中的地址传入第一动态库中的第三接口;S15:第一动态库中的第三接口对第一密文数据进行解密,得到第一明文数据;以及S16:第一动态库中的第三接口调用Java虚拟机的定义类接口将第一明文数据定义为类加载器。\n[0009] 进一步地,步骤S11包括:S111:调用第一启动类中的第一接口;S112:第一启动类中的第一接口调用第一启动类中的第二接口;以及S113:第一启动类中的第二接口将第一密文数据读入内存。\n[0010] 进一步地,步骤S3包括:S31:第一动态库中的第三接口调用类加载器中的第四接口;S32:类加载器中的第四接口读出Java程序的jar包中的配置文件;S33:类加载器中的第四接口从配置文件中读出第二启动类;S34:类加载器中的第四接口调用类加载器中的第五接口;以及S35:类加载器中的第五接口将第二启动类加载到内存。\n[0011] 进一步地,步骤S2包括:S21:类加载器中的第五接口调用类加载器中的第六接口;S22:类加载器中的第六接口将第二密文数据读入内存;S23:类加载器中的第五接口对第二密文数据进行解密得到第二明文数据;以及S24:类加载器的第五接口调用Java虚拟机的定义类接口将第二明文数据定义为第一类。\n[0012] 进一步地,通过以下方式对第一密文数据和第二密文数据进行解密:S2001:调用加密锁接口检索是否有加密锁;S2002:在检索到加密锁时,调用加密锁接口将密文数据传入加密锁中;S2003:调用加密锁接口使用存储在加密锁中的密钥对传入的密文数据进行解密,得到明文数据;以及S2004:调用加密锁接口获取明文数据。\n[0013] 为了实现上述目的,根据本发明的一个方面,提供了一种Java源代码的保护系统。\n[0014] 根据本发明的Java源代码的保护系统包括:第一处理模块,包括第一启动类,其中,第一启动类为Java程序的启动类;调用模块,用于调用第一启动类;第二处理模块,包括类加载器;加密模块,用于将类加载器的字节码文件加密为第一密文数据以及将第一类的字节码文件加密为第二密文数据,其中,第一类为Java虚拟机运行的类;以及解密模块,用于将第一密文数据解密为第一明文数据以及将第二密文数据解密为第二明文数据,其中,第一启动类用于将第一密文数据读入内存,并控制解密模块对第一密文数据解密,得到第一明文数据,并将第一明文数据定义为类加载器,类加载器用于将第二启动类加载到内存,将第二密文数据读入内存,并控制解密模块对第二密文数据进行解密,以及将第一类加载到Java虚拟机,以便Java虚拟机调用第二启动类中的主接口运行Java程序,其中,第二启动类为Java程序的jar包中的原启动类。\n[0015] 进一步地,第一启动类还用于将本地的第一动态库加载到内存,调用第一动态库中的第三接口以及将第一密文数据在内存中的地址传入第一动态库中的第三接口,其中,第一动态库中的第三接口用于对第一密文数据进行解密得到第一明文数据,以及调用Java虚拟机的定义类接口将第一明文数据定义为类加载器。\n[0016] 进一步地,第一启动类中包括第一接口和第二接口,第一启动类中的第一接口用于调用第一启动类中的第二接口,第一启动类中的第二接口用于将第一密文数据读入内存。\n[0017] 进一步地,类加载器中包括第四接口和第五接口,其中,类加载器中的第四接口用于读出Java程序的jar包中的配置文件,从配置文件中读出第二启动类,并调用类加载器中的第五接口,类加载器中的第五接口用于将第二启动类加载到内存;以及第一动态库中的第三接口还用于调用类加载器中的第四接口。\n[0018] 进一步地,类加载器中包括第六接口,其中,类加载器中的第六接口用于将第二密文数据读入内存;以及类加载器中的第五接口还用于调用类加载器中的第六接口,并对第二密文数据进行解密得到第二明文数据,调用Java虚拟机的定义类接口将第二明文数据定义为第一类。\n[0019] 进一步地,解密模块包括:第二检索子模块,用于调用加密锁接口检索是否有加密锁;第二传入子模块,用于在检索到加密锁时,调用加密锁接口将密文数据传入加密锁中;\n第一解密子模块,用于调用加密锁接口使用存储在加密锁中的密钥对传入的密文数据进行解密,得到明文数据;以及第三获取子模块,用于调用加密锁接口获取明文数据。\n[0020] 通过本发明,在第一启动类即Java程序的启动类被调用时,采用包括以下步骤的Java源代码的保护方法:S1:第一启动类将第一密文数据读入内存进行解密,得到第一明文数据,并将第一明文数据定义为类加载器,其中,第一密文数据为类加载器的字节码文件加密后得到的数据;S2:类加载器将第二密文数据读入内存进行解密,得到第二明文数据,并将第二明文数据定义为第一类,其中,第一类为Java虚拟机运行的类,其后缀名为.class,第二密文数据为第一类的字节码文件加密后得到的数据;S3:类加载器将第二启动类加载到内存,其中,第二启动类为Java程序的jar包中的原启动类;以及S 4:类加载器将第一类加载到Java虚拟机,以便Java虚拟机能够调用第二启动类中的主接口,运行Java程序,解决了Java源代码容易被反汇编的问题,实现Java源代码的保护。\n附图说明\n[0021] 构成本申请的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:\n[0022] 图1示出了实施例1提供的Java源代码的保护方法;\n[0023] 图2示出了实施例1提供的Java源代码的保护方法中的加密方法;\n[0024] 图3示出了实施例1提供的Java源代码的保护方法中的解密方法;\n[0025] 图4示出了实施例2提供的Java源代码的保护方法;\n[0026] 图5示出了实施例3提供的Java源代码的保护系统;以及\n[0027] 图6示出了实施例4提供的Java源代码的保护系统。\n具体实施方式\n[0028] 需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。\n[0029] 实施例1\n[0030] 图1示出了实施例1提供的Java源代码的保护方法,在Java程序的启动类即该实施例中的第一启动类被调用时,如图1所示,该方法包括以下步骤S1至步骤S4:\n[0031] S1:第一启动类将第一密文数据读入内存进行解密,得到第一明文数据,并将第一明文数据定义为类加载器,其中,第一密文数据为类加载器的字节码文件加密后得到的数据;\n[0032] S2:类加载器将第二密文数据读入内存进行解密,得到第二明文数据,并将第二明文数据定义为第一类,其中,第一类为Java虚拟机运行的类,其后缀名为.class,第二密文数据为第一类的字节码文件加密后得到的数据;\n[0033] S3:类加载器将第二启动类加载到内存,其中,第二启动类为Java程序的jar包中的原启动类;\n[0034] S4:类加载器将第一类加载到Java虚拟机,以便Java虚拟机能够调用第二启动类中的主接口,运行Java程序。\n[0035] 在该实施例中,使用类加载器保护java程序,并对类加载器进行加密,使攻击者无法得到明文的类加载器,从而有效地阻止了源代码被反汇编,实现Java源代码的保护。\n[0036] 其中,优选地,步骤S1包括以下步骤S11至步骤S16:\n[0037] S11:第一启动类将第一密文数据读入内存。\n[0038] S12:第一启动类将本地的第一动态库加载到内存。\n[0039] S13:第一启动类调用第一动态库中的第三接口。\n[0040] S14:第一启动类将第一密文数据在内存中的地址传入第一动态库中的第三接口。\n[0041] S15:第一动态库中的第三接口对第一密文数据进行解密,得到第一明文数据。\n[0042] S16:第一动态库中的第三接口调用Java虚拟机的定义类接口将第一明文数据定义为类加载器。\n[0043] 在步骤S1的优选实施方式中,第一启动类对第一密文数据的解密过程在本地的动态库中实现,可以通过jni技术调用本地的动态库,从而在这个本地的动态库中完成对类加载器的解密,由于本地代码的天然屏障,Java源代码的反汇编是非常困难的,进一步阻止源代码被反汇编,更好地实现Java源代码的保护。\n[0044] 为了进一步保护Java源代码,优选地,在步骤S11中,第一启动类包括第一接口和第二接口,将第一密文数据读入内存设置了中间转换接口,包括以下步骤S111至步骤S113:\n[0045] S111:调用第一启动类中的第一接口。\n[0046] S112:第一启动类中的第一接口调用第一启动类中的第二接口。\n[0047] S113:第一启动类中的第二接口将第一密文数据读入内存。\n[0048] 为了进一步保护Java源代码,优选地,步骤S3包括以下步骤S31至步骤S35:\n[0049] S31:第一动态库中的第三接口调用类加载器中的第四接口。\n[0050] S32:类加载器中的第四接口读出Java程序的jar包中的配置文件。\n[0051] S33:类加载器中的第四接口从配置文件中读出第二启动类。\n[0052] S34:类加载器中的第四接口调用类加载器中的第五接口。\n[0053] S35:类加载器中的第五接口将第二启动类加载到内存。\n[0054] 为了进一步保护Java源代码,优选地,步骤S2包括以下步骤S21至步骤S24:\n[0055] S21:类加载器中的第五接口调用类加载器中的第六接口。\n[0056] S22:类加载器中的第六接口将第二密文数据读入内存。\n[0057] S23:类加载器中的第五接口对第二密文数据进行解密得到第二明文数据。\n[0058] S24:类加载器的第五接口调用Java虚拟机的定义类接口将第二明文数据定义为第一类。\n[0059] 在实施例1中,通过以下两种方式对类加载器和第一类据进行加密:\n[0060] 方式一为硬件加密,图2示出了该加密方法的流程图,如图2所示,包括以下步骤S1001至步骤S1006:\n[0061] S1001:调用加密锁接口检索是否有与计算机相连接的加密锁。\n[0062] S1002:在检索到与计算机相连接的加密锁时,获取加密锁中的密钥,其中,可以在加密锁中临时生成密钥,也可以在加密锁中预存密钥直接获取。\n[0063] S1003:将字节码文件传入加密锁中,此处的字节码文件指类加载器的字节码文件或第一类的字节码文件。\n[0064] S1004:通过密钥对字节码文件进行加密,得到密文数据。\n[0065] S1005:调用加密锁接口从加密锁中获取密文数据。\n[0066] S1006:将密文数据添加到java程序的jar包中,完成对字节码文件的加密。\n[0067] 对应地,解密可以通过如图3所示的解密方法实现。如图3所示,包括以下步骤S2001至步骤S2004:\n[0068] S2001:调用加密锁接口检索是否有加密锁。\n[0069] S2002:在检索到加密锁时,调用加密锁接口将密文数据传入加密锁中。\n[0070] S2003:调用加密锁接口使用存储在加密锁中的密钥对传入的密文数据进行解密,得到明文数据。\n[0071] S2004:调用加密锁接口获取明文数据。\n[0072] 对于该硬件加密方式,安全强度高,因为要想解密必须要有硬件加密锁的存在,并且密钥存在于硬件加密锁中,解密算法更是不可能得到,能够实现对java源代码的高强度的保护。\n[0073] 方式二为软件加密,包括以下步骤S1001’至步骤S1003’:\n[0074] S1001’:获取预设的密钥或临时生成密钥,该密钥是固定的。\n[0075] S1002’:使用该密钥通过加密算法对字节码文件进行加密,得到密文数据,其中,加密算法是固定的,优选3DES算法,但不局限于此。\n[0076] S1003’:将所述加密过的字节码文件添加到所述java程序的jar包中。\n[0077] 对应地,解密可以通过第三接口直接调用存放在本地动态库中的解密算法进行解密,解密成功得到明文数据。\n[0078] 对于该软件加密方式,除非攻击者反汇编了本地的动态库,并从中获取了解密算法,但由于本地代码的天然屏障,获取解密算法非常困难。\n[0079] 实施例2\n[0080] 本实施例提供了一种java源代码的保护方法。运行java程序时,如果该java程序已被保护,则执行相应地解密操作,解密之后才可以运行该java程序,如果该java程序未被保护,则该java程序直接被运行。\n[0081] 参见图4,所述保护方法包括:\n[0082] 步骤101:调用java程序的启动类;\n[0083] 具体地,在本实施例中,计算机操作系统调用javaw.exe启动程序,所述javaw.exe启动程序在内存中构建java虚拟机,计算机操作系统将所述java程序的jar包的路径作为参数传入所述javaw.exe启动程序,例如:javaw-jar example.jar;\n[0084] 所述javaw.exe启动程序从所述java程序的jar包的配置文件中读出启动类,当所述java程序是被保护的程序时,所述配置文件已被修改过,\n[0085] 具体地,在本实施例中,所述配置文件中预先设定了第一字段,所述第一字段中保存有原先的配置文件中的启动类,同时,所述配置文件中的启动类已修改为第一启动类,[0086] 相应地,在本实施例步骤101中,所述调用的java程序的启动类为第一启动类,所述第一启动类是用java语言编写的;\n[0087] 步骤102:调用所述第一启动类中的第一接口;\n[0088] 具体地,在本实施例中,所述第一接口为所述第一启动类中的main方法;\n[0089] 步骤103:所述第一接口调用所述第一启动类中的第二接口;\n[0090] 具体地,在本实施例中,所述第二接口为所述第一启动类中的readfile方法;\n[0091] 步骤104:所述第二接口将加密第一类加载器的字节码文件得到的第一密文数据读入内存;\n[0092] 具体地,在本实施例中,所述第一类加载器是用java语言编写的,所述第一类加载器的字节码文件预先被加密,加密过程具体通过硬件加密或软件加密实现,[0093] 硬件加密,通过硬件加密锁与计算机之间的交互操作实现加密,具体如下:\n[0094] 步骤1001:加密程序调用加密锁接口检索是否有与计算机相连接的加密锁,是则执行步骤1002,否则继续检索;\n[0095] 步骤1002:加密程序调用加密锁接口在加密锁中生成一密钥,并存储;\n[0096] 具体地,在本实施例中,所述密钥还可通过另一种方式获取,即预先向加密锁中导入一密钥,所述密钥是固定的;\n[0097] 步骤1003:加密程序将第一类加载器的字节码文件传入所述硬件加密锁中;\n[0098] 步骤1004:加密程序调用加密锁接口使用所述生成的密钥对所述传入的第一类加载器的字节码文件进行加密,得到第一密文数据;\n[0099] 步骤1005:加密程序调用加密锁接口从硬件加密锁中获取所述第一密文数据;\n[0100] 步骤1006:加密程序接收到所述第一密文数据,并将所述第一密文数据写入字节码文件中;\n[0101] 步骤1007:计算机将所述加密过的字节码文件添加到所述java程序的jar包中,完成对第一类加载器的字节码文件的加密;\n[0102] 软件加密,具体如下:\n[0103] 步骤1001’:加密程序预先设定一密钥;\n[0104] 具体地,在本实施例中,所述密钥是固定的;\n[0105] 所述密钥还可通过另一种方式获取,即加密程序临时生成一密钥;\n[0106] 步骤1002’:加密程序使用所述密钥通过加密算法对所述第一类加载器的字节码文件进行加密,得到第一密文数据;\n[0107] 具体地,在本实施例中,所述加密算法是固定的,\n[0108] 优选地,在本实施例中,所述算法是3DES算法,但不局限于此;\n[0109] 相应地,第一动态库中实现了解密算法;\n[0110] 步骤1003’:计算机将所述加密过的第一类加载器的字节码文件添加到所述java程序的jar包中;\n[0111] 具体地,在本实施例步骤104中,所述将第一类加载器的字节码文件读入内存的过程是以数据流形式读入内存的数组中;\n[0112] 内存中设有多个数组,例如byte0[]、byte1[]、byte2[]、byte3[]等,优选地,将所述加密过的第一类加载器的字节码文件读入内存的byte0[]数组中;\n[0113] 步骤105:所述第一启动类将本地的第一动态库加载到内存中;\n[0114] 具体地,在本实施例中,所述第一动态库是用标准C语言编写的,所述第一动态库预先被添加到所述java程序的jar包中;\n[0115] 步骤106:所述第一启动类通过jni技术调用所述第一动态库中的第三接口;\n[0116] 具体地,在本实施例中,所述第三接口为所述第一动态库中的run方法;\n[0117] 步骤107:所述第一启动类将所述加密第一类加载器的字节码文件得到的第一密文数据在内存中的地址传入第三接口中;\n[0118] 具体地,在本实施例中,将所述byte0[]数组在内存中的地址传入第三接口中,所述第三接口根据所述传入的地址参数调入对应的byte0[]数组中的数据;\n[0119] 步骤108:所述第三接口对所述加密第一类加载器的字节码文件得到的第一密文数据进行解密,解密成功则执行步骤109,解密失败则跳出程序;\n[0120] 具体地,在本实施例中,解密成功则得到第一明文数据;\n[0121] 与步骤104中的加密过程对应,相应的解密过程具体通过硬件解密或软件解密实现,\n[0122] 硬件解密,具体如下:\n[0123] 步骤2001:第三接口调用加密锁接口检索是否有与计算机相连接的加密锁,是则执行步骤2002,否则继续检索;\n[0124] 步骤2002:第三接口调用加密锁接口将所述第一密文数据传入所述硬件加密锁中;\n[0125] 步骤2003:第三接口调用加密锁接口使用加密时存储在硬件加密锁中的密钥对所述传入的第一密文数据进行解密,解密成功则执行步骤2004,解密失败则跳出程序;\n[0126] 具体地,在本实施例中,解密成功则得到第一明文数据;\n[0127] 步骤2004:第三接口调用加密锁接口获取所述解密得到的第一明文数据;\n[0128] 软件解密,具体如下:\n[0129] 第三接口直接调用所述存放在本地的第一动态库中的解密算法对所述第一密文数据进行解密,解密成功则执行步骤109,解密失败则跳出程序;\n[0130] 具体地,在本实施例中,解密成功则得到第一明文数据;\n[0131] 步骤109:所述第三接口调用java虚拟机的定义类接口,用所述定义类接口把所述解密所述第一密文数据得到的第一明文数据定义成java虚拟机可以运行的第一类加载器;\n[0132] 具体地,在本实施例中,所述定义类接口为defineclass方法;\n[0133] 步骤110:所述第三接口调用所述第一类加载器中的第四接口;\n[0134] 具体地,在本实施例中,所述第四接口为所述第一类加载器中的runmain方法;\n[0135] 步骤111:所述第四接口读出所述java程序的jar包中的配置文件;\n[0136] 步骤112:所述第四接口从所述配置文件中读出原启动类;\n[0137] 具体地,在本实施例中,所述原启动类是所述配置文件中所述第一字段保存的启动类;\n[0138] 步骤113:所述第四接口调用所述第一类加载器中的第五接口;\n[0139] 具体地,在本实施例中,所述第五接口为所述第一类加载器中的loadclass方法;\n[0140] 步骤114:所述第五接口将所述原启动类加载入内存中;\n[0141] 在本实施例中,步骤110-步骤114在步骤120之前、步骤109之后的任一步骤项中执行;\n[0142] 步骤115:所述第五接口调用所述第一类加载器中的第六接口;\n[0143] 具体地,在本实施例中,所述第六接口为所述第一类加载器中的readfile方法;\n[0144] 步骤116:所述第六接口将加密后缀名为.class的字节码文件得到的第二密文数据读入内存中;\n[0145] 具体地,在本实施例中,所述java程序是被保护的,相应地,所述java程序的jar包中的后缀名为.class的字节码文件是被加密过的;\n[0146] 加密所述后缀名为.class的字节码文件的方式与上述步骤104中的加密方式相同,在此不再赘述;\n[0147] 所述java程序的jar包中有若干个加密过的字节码文件,即存在若干个第二密文数据,运行所述java程序时,java虚拟机根据需要读取其中一个第二密文数据,通过所述第五接口将所述加密后缀名为.class的字节码文件得到的第二密文数据读入内存中,[0148] 具体地,所述读入内存的过程是以数据流形式读入内存的数组中,[0149] 内存中设有多个数组,例如byte0[]、byte1[]、byte2[]、byte3[]等,优选地,将所述加密后缀名为.class的字节码文件得到的第二密文数据读入内存的byte1[]数组中;\n[0150] 步骤117:所述第五接口对所述加密后缀名为.class的字节码文件得到的第二密文数据进行解密,解密成功则执行步骤118,解密失败则跳出程序;\n[0151] 具体地,在本实施例中,解密所述加密后缀名为.class的字节码文件得到的第二密文数据的方式与上述步骤108中的解密方式相同,在此不再赘述;\n[0152] 相应地,解密成功则得到第二明文数据;\n[0153] 步骤118:所述第五接口调用java虚拟机的定义类接口,用所述定义类接口把解密所述加密后缀名为.class的字节码文件得到的第二密文数据得到的第二明文数据定义成Java虚拟机可以使用的类;\n[0154] 具体地,在本实施例中,所述定义类接口为defineclass方法;\n[0155] 步骤119:所述java虚拟机用所述第一类加载器将所述定义的类加载到java虚拟机中;\n[0156] 步骤120:所述java虚拟机调用所述原启动类中的标准主接口,开始运行所述java程序。\n[0157] 具体地,在本实施例中,所述标准主接口为所述原启动类中的main方法。\n[0158] 实施例3\n[0159] 图5示出了实施例4提供的Java源代码的保护系统,如图5所示,该系统包括:\n[0160] 第一处理模块10,包括第一启动类,其中,第一启动类为Java程序的启动类。\n[0161] 调用模块20,用于调用第一启动类。\n[0162] 第二处理模块30,包括类加载器。\n[0163] 加密模块40,用于将类加载器的字节码文件加密为第一密文数据以及将第一类的字节码文件加密为第二密文数据,其中,第一类为Java虚拟机运行的类。\n[0164] 解密模块50,用于将第一密文数据解密为第一明文数据以及将第二密文数据解密为第二明文数据。\n[0165] 其中,第一启动类用于将第一密文数据读入内存,并控制解密模块50对第一密文数据解密,得到第一明文数据,并将第一明文数据定义为类加载器;\n[0166] 类加载器用于将第二启动类加载到内存,将第二密文数据读入内存,并控制解密模块50对第二密文数据进行解密,以及将第一类加载到Java虚拟机,以便Java虚拟机调用第二启动类中的主接口运行Java程序,其中,第二启动类为Java程序的jar包中的原启动类。\n[0167] 在该实施例中,调用模块20调用第一处理模块10,即第一启动类,由于加密模块\n40对类加载器进行了加密,第一启动类控制解密模块50将第一密文数据解密,得到第二处理模块30,即类加载器;由于加密模块40对第一类进行了加密,类加载器控制解密模块50对第二密文数据解密得到第一类;类加载器将第二启动类加载到Java虚拟机,使得Java虚拟机能够调用第二启动类中的主接口运行Java程序。使用类加载器保护java程序,并对类加载器进行加密,使攻击者无法得到明文的类加载器,从而有效地阻止了源代码被反汇编,实现Java源代码的保护。\n[0168] 其中,为进一步保护Java源代码,第一启动类控制解密模块50对第一密文数据的解密过程在本地的动态库中实现,优选地,第一启动类还用于将本地的第一动态库加载到内存,调用第一动态库中的第三接口以及将第一密文数据在内存中的地址传入第一动态库中的第三接口,其中,第一动态库中的第三接口用于对第一密文数据进行解密得到第一明文数据,以及调用Java虚拟机的定义类接口将第一明文数据定义为类加载器。\n[0169] 为进一步保护Java源代码,优选地,第一启动类中包括第一接口和第二接口,第一启动类中的第一接口用于调用第一启动类中的第二接口,第一启动类中的第二接口用于将第一密文数据读入内存。\n[0170] 为进一步保护Java源代码,优选地,类加载器中包括第四接口和第五接口,其中,类加载器中的第四接口用于读出Java程序的jar包中的配置文件,从配置文件中读出第二启动类,并调用类加载器中的第五接口,类加载器中的第五接口用于将第二启动类加载到内存;以及第一动态库中的第三接口还用于调用类加载器中的第四接口。\n[0171] 为进一步保护Java源代码,优选地,类加载器中包括第六接口,其中,类加载器中的第六接口用于将第二密文数据读入内存;以及类加载器中的第五接口还用于调用类加载器中的第六接口,并对第二密文数据进行解密得到第二明文数据,调用Java虚拟机的定义类接口将第二明文数据定义为第一类。\n[0172] 优选地,采用硬件加密锁对第一类或类加载器进行加密,加密模块40包括:第一检索子模块,用于调用加密锁接口检索是否有与计算机相连接的加密锁;第一获取子模块,用于在检索到加密锁时,获取加密锁中的密钥;第一传入子模块,用于将字节码文件传入加密锁中;第一加密子模块,用于调用加密锁接口使用密钥对字节码文件进行加密,得到密文数据;第二获取子模块,用于调用加密锁接口从加密锁中获取密文数据;以及第一添加子模块,用于将密文数据添加到java程序的jar包中,完成对字节码文件的加密。\n[0173] 相应地,解密模块50包括:第一检索子模块,用于调用加密锁接口检索是否有加密锁;第二传入子模块,用于在检索到加密锁时,调用加密锁接口将密文数据传入加密锁中;第一解密子模块,用于调用加密锁接口使用存储在加密锁中的密钥对传入的密文数据进行解密,得到明文数据;以及第三获取子模块,用于调用加密锁接口获取明文数据。\n[0174] 优选地,采用软件加密方式对第一类或类加载器进行加密,加密模块40包括:第四获取子模块,用于获取密钥;第二加密子模块,用于使用所述密钥通过加密算法对字节码文件进行加密,得到密文数据;以及第二添加子模块,用于将所述密文数据添加到所述java程序的jar包中,完成对所述字节码文件的加密。\n[0175] 相应地,解密模块50包括:第二解密子模块,用于使用所述密钥通过解密算法对密文数据进行解密,得到明文数据。\n[0176] 实施例4\n[0177] 本实施例提供了一种java源代码的保护系统。\n[0178] 参见图6,该系统包括:第一处理模块21,第二处理模块22,第三处理模块23,加密模块24,解密模块25,存储模块26。\n[0179] 所述第一处理模块21,具体为第一启动类,提供了第一接口(main方法)和第二接口(readfile方法),用于java程序运行时供其调用;所述第一启动类是用java语言编写的;\n[0180] 所述第二处理模块22,具体为本地的第一动态库,提供了第三接口(run方法),用于java程序运行时供其调用;所述第一动态库是用标准C语言编写的;\n[0181] 所述第三处理模块23,具体为第一类加载器,提供了第四接口(runmain方法)、第五接口(loadclass方法)和第六接口(readfile方法),用于java程序运行时供其调用;\n所述第一类加载器是用java语言编写的;\n[0182] 所述加密模块24,用于对所述第三处理模块23中所述第一类加载器的字节码文件进行加密,得到第一密文数据;\n[0183] 用于对java程序的jar包中每一个后缀为.class的字节码文件进行加密,得到第二密文数据,\n[0184] 所述解密模块25,用于对所述加密模块24中加密所述第一类加载器的字节码文件得到的第一密文数据进行解密,得到第一明文数据;\n[0185] 用于对所述加密模块24中加密后缀名为.class的字节码文件得到的第二密文数据进行解密,得到第二明文数据;\n[0186] 所述存储模块26,包括第一存储单元261和第二存储单元262;\n[0187] 所述第一存储单元261,用于存储java程序的jar包中的字节码文件;\n[0188] 所述字节码文件包括后缀名为.class的字节码文件和配置文件等;\n[0189] 用于存储java程序的jar包中加密过的后缀名为.class的字节码文件;\n[0190] 用于存储修改后的配置文件;\n[0191] 所述第二存储单元262,用于存储预先设定的密钥和加解密算法。\n[0192] 从以上的描述中,可以看出,本发明实施例实现了如下技术效果:使用加密后的类加载器保护java程序,在运行java程序时通过两次解密,使攻击者无法得到明文的类加载器,实现Java源代码的有效保护。\n[0193] 需要说明的是,在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。\n[0194] 显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。\n[0195] 以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
法律信息
- 2014-07-02
- 2012-04-04
实质审查的生效
IPC(主分类): G06F 21/24
专利申请号: 201110288519.0
申请日: 2011.09.26
- 2012-02-22
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2010-10-27
|
2009-04-23
| | |
2
| |
2008-06-18
|
2007-09-18
| | |
3
| |
2010-06-30
|
2009-09-22
| | |
4
| |
2010-08-25
|
2010-04-20
| | |
5
| |
2011-05-04
|
2010-12-31
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |