一种Java软件水印虚方法中指令代码的生成方法

文档序号:6626863阅读:317来源:国知局
一种Java软件水印虚方法中指令代码的生成方法
【专利摘要】本发明涉及一种Java软件水印虚方法中指令代码的生成方法,基于BCEL类库,包括如下步骤:1)通过BCEL类库载入待嵌入指令的Java类文件,对所述类文件进行解析,转化成符合BCEL处理要求的Java类文件对象;2)从所述Java类文件对象中获取类文件的参数信息,所述参数信息包括类中的方法,再从获取的方法中找到并取出虚方法;3)根据获取的虚方法与参数信息创建一个新的虚方法,用于取代原先的虚方法;4)产生用于嵌入水印信息的指令代码,将它们添加到所述新虚方法的指令集合中;5)将所述新虚方法套入所述Java类文件中。有益效果为:利用本发明,可以通过计算机程序在虚方法中自动产生用于嵌入水印信息的指令代码,解决了以往需要专业人员人工编写,不具通用性,不便实际应用的问题。
【专利说明】一种Java软件水印虚方法中指令代码的生成方法

【技术领域】
[0001]本发明涉及软件水印,尤其涉及一种Java软件水印虚方法中指令代码的生成方法。

【背景技术】
[0002]软件产业近年来迅猛发展,成为每年具有数千亿产值的重大产业。与此同时,软件产品的非法复制和盗用问题也变得非常严重,受到业内外广泛关注。软件水印是近年来出现的保护软件产品知识产权的一项技术,它在不影响软件功能的前提下在软件作品中嵌入版权保护信息或身份认证信息(即水印),当程序遭到非法复制或盗用时,可以通过提取这些信息来证明软件作品的所有权。
[0003]目前,Java语言得到广泛应用,用Java语言开发的软件占有很大的比重。Java语言具有跨平台的可移植性,使用便利,同时也带来程序容易被复制和盗用的问题。研究和开发用于Java语言程序版权保护的软件水印技术具有十分重要的现实意义和应用价值。在现有的Java软件水印技术中,由Akito Monden等人最先提出的基于虚方法和类文件字节码的软件水印算法具有较好的实用性和可实现性,可用于保护Java类文件。该算法的基本思想是,在需要保护的Java程序中植入永不执行的方法,称为虚方法。由于虚方法实际不会执行,我们可以根据需要编写虚方法中的程序代码。然后在虚方法对应的字节码中,对指令的操作数进行修改或者对指令的操作码进行编码,以此来嵌入水印信息。
[0004]对Akito Monden等提出的上述算法,现有研究的重点和成果是如何在虚方法的指令代码中通过修改操作数和编码操作码来嵌入和提取水印信息。对于虚方法中的程序代码如何产生,尚未有很好的研究。一般需要根据所嵌入的水印信息,由专业人员通过人工的方法来编写,不具有通用性,也不方便,使得该算法的实际应用受到限制。本发明提出一种通过计算机程序在虚方法中自动生成用于嵌入水印信息的指令代码的方法和技术。基于本发明,用户只要给出需要嵌入的水印信息,系统会在虚方法中自动生成相应的指令代码,无需人工介入。这样就可以设计开发出方便实用的Java软件水印应用系统。


【发明内容】

[0005]本发明目的在于克服上述现有技术之不足,提供一种Java软件水印虚方法中指令代码的自动生成方法。该方法利用Apache Web服务软件提供的用于操作Java类文件的BCEL类库对给定的Java类文件进行操作。具体有以下技术方案实现:
[0006]所述Java软件水印虚方法中指令代码的生成方法,基于BCEL类库,具体包括如下步骤:
[0007]I)通过BCEL类库载入待嵌入指令的Java类文件,对所述类文件进行解析,转化成符合BCEL处理要求的Java类文件对象;
[0008]2)从所述Java类文件对象中获取类文件的参数信息,所述参数信息包括类中的方法,再从获取的方法中找到并取出虚方法;
[0009]3)根据获取的虚方法与参数信息创建一个新的虚方法,用于取代原先的虚方法;
[0010]4)产生用于嵌入水印信息的指令代码,将它们添加到所述新虚方法的指令集合中;
[0011]5)将所述新虚方法套入所述Java类文件中。
[0012]所述Java软件水印虚方法中指令代码的生成方法的进一步设计在于,所述参数信息还包括所述Java类文件的类文件名与常量池。
[0013]所述Java软件水印虚方法中指令代码的生成方法的进一步设计在于,所述用于嵌入水印信息的指令代码的产生包括:
[0014]修改操作数,对通过修改操作数嵌入水印信息的指令,进行配置操作数,组合成完整的指令,将所述指令代码添加到类中新虚方法的指令集合中;
[0015]编码操作码,生成操作码编码码本,根据需嵌入的编码,选择相应的操作码,配置操作数,组合成完整的指令,将所述指令代码添加到类中新虚方法的指令集合中。
[0016]所述Java软件水印虚方法中指令代码的生成方法的进一步设计在于,所述修改操作数的过程可以根据嵌入水印信息的大小,通过循环语句实现与嵌入水印信息的大小对应数量的指令。
[0017]所述Java软件水印虚方法中指令代码的生成方法的进一步设计在于,所述修改操作数的过程具体包括如下步骤:
[0018]A)利用随机函数生成用于嵌入水印信息的指令所需的操作数;
[0019]B)将操作码与操作数组合成指令,存放于一临时集合中;
[0020]C)将所述临时集合中的指令复制到类中所述新虚方法的指令集合中。
[0021]所述Java软件水印虚方法中指令代码的生成方法的进一步设计在于,所述编码操作码的过程具体包括如下步骤:
[0022]I )通过映射生成码本,所述码本中的每一编码与一条指令操作码成一一映射关系;
[0023]II )根据需要嵌入的编码,从所述码本中找到对应的指令操作码;
[0024]III)通过随机函数产生上述指令操作码的操作数;
[0025]IV )将操作码与操作数组合成指令,存放于一临时集合中;
[0026]V )将临时集合中的指令复制到所述新虚方法的指令集合中。
[0027]本发明提出的Java软件水印虚方法中指令代码的生成方法,可以通过计算机程序在虚方法中自动产生用于嵌入水印信息的指令代码,解决了以往需要专业人员人工编写,不具通用性,不便实际应用的问题。利用本发明,用户只要给出需要嵌入的水印信息,系统会在虚方法中自动生成相应的指令代码,无需人工介入。在此基础上,可设计开发出方便实用的Java软件水印应用系统。

【专利附图】

【附图说明】
[0028]图1为所述Java软件水印虚方法中指令代码的生成方法的原理框图。
[0029]图2为用于测试的类文件的示意图。
[0030]图3为虚方法中的指令示意图。
[0031]图4为虚方法中添加指令前后的对比的示意图。
[0032]图5为添加指令后虚方法中的指令的示意图。

【具体实施方式】
[0033]下面结合附图对本发明方案进行详细说明。
[0034]本实施例提供的Java软件水印虚方法中指令代码的生成方法,参见图1,如下:
[0035]第一步:通过BCEL类库载入待嵌入指令的Java类文件。假设该Java类文件的文件名为TestClass.class,路径为“D: \\测试文件\\TestClass.class”,存放这个类文件的绝对路径的字符串为targetClassfile,则载入Java类文件的实现代码为:
[0036]String targetClassfile = 〃D:\\ 测试文件 \\TestClass.class";
[0037]调用BCEL类库的类文件解析器ClassParser对载入的Java类文件进行解析,以便获取其类文件名、常量池、方法等信息。相关实现代码为:
[0038]JavaClass jc = new ClassParser (targetClassfile).parse ();
[0039]其中,jc为解析后生成的类文件对象。
[0040]将解析后的类文件对象jc包装转化成BCEL类库中ClassGen类的对象,以便调用ClassGen类的方法来获取类文件的有关信息。相关实现代码为:
[0041]ClassGen eg = new ClassGen(jc);
[0042]其中,eg为转化后的Java类文件对象,下面将直接使用jc和Cg这两个对象。
[0043]第二步:获取载入的Java类文件的有关信息,包括类文件名、常量池和类中的方法,从方法中找到和取出虚方法。
[0044]类文件名和常量池通过eg对象获取。类文件名通过调用ClassGen类的getClassName ()方法获得:
[0045]String cname = eg.getClassName O ;
[0046]常量池通过调用ClassGen类的getConstantPool O方法取得:
[0047]ConstantPoolGen cpg = eg.getConstantPoolO ;
[0048]类中的方法通过jc对象获取,从jc对象中获取类中所有方法的代码为:
[0049]Method []methods = jc.getMethods ();
[0050]根据虚方法名从所有方法中找到虚方法,假定虚方法名为“dummy”,相关实现代码为:
[0051]

int index;

for(ittdex=0;mdex<methods.length;mdex++){

if(niethocls[iiidex],getNanieO,equals(,*ctanjTiyw)) break;

}
[0052]将虚方法从类中取出也是通过eg对象进行,调用ClassGen类的removeMethod (method)方法:
[0053]eg.removeMethod (method);
[0054]其中,method表示的是上面找到的虚方法methods [index],此处即名为“dummy”
的方法。
[0055]第三步:根据上面获得的类文件名、常量池和虚方法的信息创建一个新的虚方法,用于取代原先的虚方法。这通过调用BCEL类库中用于处理方法的MethodGen类实现:
[0056]MethodGen mg = new MethodGen(method, cname, cpg);
[0057]其中,cname、cpg是原类文件名和常量池,method为原虚方法,mg为生成的MethodGen类的对象。
[0058]第四步:获取新建虚方法的指令集合,通过上述MethodGen类的对象mg获得:
[0059]Instruct1nList 1st = mg.getlnstruct1nListO ;
[0060]然后向该指令集合中添加用于嵌入水印信息的指令。可以通过调用MethodGen类的insert O方法向指令集合中插入指令。以添加一条“bipush”指令为例,实现代码为:
[0061]1st.1nsert (newBIPUSH( (byte) I));
[0062]实际添加的指令与嵌入的水印信息有关,需要通过专门的方法产生,后面单独说明。在得到这些指令后,将它们复制到上述新建虚方法的指令集合中。
[0063]第五步:将新建的包含用于嵌入水印信息的指令代码的虚方法恢复到原来的类中,通过调用ClassGen类的addMethod方法和MethodGen类的getMethod方法实现。实现代码为:
[0064]eg.addMethod (mg.getMethod O);
[0065]其中,getMethod方法没有参数,恢复后的虚方法名仍为原来的名称,此处即为dummy。
[0066]下面给出一具体实例进行说明,假定测试的类文件取名为TestClass.class,如图2所示,类中含有四个方法,方法名分别为:funcl、func2、func3和dummy (注意<init>是Java类文件自有的方法,不是用户定义的方法)。其中,dummy方法为虚方法,点击“ [O]Code”,可查看dummy方法中的指令,如图3所示。
[0067]此处以添加一条“bipush”指令为例进行测试,实现上述各步骤功能的程序如下所示,有关注释说明附在程序语句中。
[0068]public class Main {
public static void main(Slring[] args) throws lOExcept1n {
String IargciCIassfiIc.= ”i式义件—wTestCtossxiastf*; //加栽炎文件
JavaCkss jc = new ClassPaKei(tirgetClassfile).parse(); //解 i' -.? X f!.-
CIassGcn eg ^ new ClassGcn(Jc);//包裝解沂/Γ? 1?:? 文f 1:1nstmct1nFactory ifacl = new Insiruct1nFacto^(cg); //字.WW7+:成 1/: --
ConstattlPoolGm cpg ^ cg.gctConstaatPoo1;//获取常 Μ:池
String cnamc = eg.gctC I assN ameO;//获取.炎名
Method[] methods -jc.getMethodsO;//获取类中的所有方法
int index;
Ibr(indcx^0;indcx<mcthodi;1.lcngth:1ndcx4-f){//1^找虛方认-1f(mcthods[indcx],gctNameO*^quBls(#,ciummyft)){
break;

}
}
eg.remove M elhod(method$[i ndex]);//取{IS 虛方法
MelhodGen mg = new Metl1dGeE(methods[index],cname,cpg); //创建新il勺虛://法
Inslruct1nLisl 1st ^ mg.getInstruct1nList();//获取 it 指令集介
IstiEsert(new BIPUSH((byte) I));//添加 Wpush 指令
mg.stripAttributcs( false);
nig.sctMa.NSlackO;
mg.setMaxLocalsO;
cg,addMcthod(mg,gctMcthod());//恢复虛方法
lsl.dispusc();
FileOiitputStream fos = new FileOmtpuiStream(targelClassille);
cg.gelIavaClass().dump(fos);
ibsx'1sc():
}
[0069]
[0070]运行测试程序,完成虚方法中指令代码自动生成的各个步骤。再次查看类文件中虚方法中的指令,并与原来的指令进行对比,可见在原有4条指令的基础上,增加了一条“bipush”指令,参见图4,图中左侧部分为原有的指令,右侧是新增指令后。测试结果正确,实现了预期的功能。
[0071]下面进一步说明用于嵌入水印信息的指令代码的产生。根据基于字节码的Java软件水印算法,水印信息可以通过修改指令的操作数和编码指令的操作码两种方式嵌入。
[0072]修改操作数:本实施例中通过修改操作数嵌入水印信息的指令有3条:bipush、sipush、iinc,其中iinc带有2个操作数。为这3条指令配置操作数,组合成完整的指令代码,然后将这些指令代码添加到类中新建虚方法的指令集合中。具体实现步骤如下:
[0073]第一步,利用随机函数生成这三条指令所需的操作数。实现代码为:
[0074]

【权利要求】
1.一种Java软件水印虚方法中指令代码的生成方法,基于BCEL类库,其特征在于包括如下步骤: 1)通过BCEL类库载入待嵌入指令的Java类文件,对所述类文件进行解析,转化成符合BCEL处理要求的Java类文件对象; 2)从所述Java类文件对象中获取类文件的参数信息,所述参数信息包括类中的方法,再从获取的方法中找到并取出虚方法; 3)根据获取的虚方法与参数信息创建一个新的虚方法,用于取代原先的虚方法; 4)产生用于嵌入水印信息的指令代码,将所述指令代码添加到所述新虚方法的指令集合中; 5)将所述新虚方法套入所述Java类文件中。
2.根据权利要求1所述的Java软件水印虚方法中指令代码的生成方法,其特征在于所述参数信息还包括所述Java类文件的类文件名与常量池。
3.根据权利要求1所述的Java软件水印虚方法中指令代码的生成方法,其特征在于所述用于嵌入水印信息的指令代码的生成包括: 修改操作数,对通过修改操作数嵌入水印信息的指令,进行配置操作数,组合成完整的指令,将所述指令代码添加到类中新虚方法的指令集合中; 编码操作码,生成操作码编码码本,根据需嵌入的编码,选择相应的操作码,配置操作数,组合成完整的指令,将所述指令代码添加到类中新虚方法的指令集合中。
4.根据权利要求3所述的Java软件水印虚方法中指令代码的生成方法,其特征在于所述修改操作数的过程可以根据嵌入水印信息的大小,通过循环语句实现与嵌入水印信息的大小对应数量的指令。
5.根据权利要求3所述的Java软件水印虚方法中指令代码的生成方法,其特征在于所述修改操作数的过程具体包括如下步骤: A)利用随机函数生成用于嵌入水印信息的指令所需的操作数; B)将操作码与操作数组合成指令,存放于一临时集合中; C)将所述临时集合中的指令复制到类中所述新虚方法的指令集合中。
6.根据权利要求3所述的Java软件水印虚方法中指令代码的生成方法,其特征在于所述编码操作码的过程具体包括如下步骤: I)通过映射生成码本,所述码本中的每一编码与一条指令操作码成一一映射关系; II)根据需要嵌入的编码,从所述码本中找到对应的指令操作码; III)通过随机函数产生上述指令操作码的操作数; IV)将操作码与操作数组合成指令,存放于一临时集合中; V)将临时集合中的指令复制到所述新虚方法的指令集合中。
【文档编号】G06F21/16GK104200139SQ201410467066
【公开日】2014年12月10日 申请日期:2014年9月12日 优先权日:2014年9月12日
【发明者】陈建平, 李奎, 施佺, 马海英, 朱浩, 王进, 文万志 申请人:南通大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1