关键词:
Java软件
Class文件
常量重排
软件水印
软件特征
程序分解
代码迷乱
摘要:
本文在总结软件水印及其相关技术研究现状的基础上,首先提出了一种基于常量重排的Java软件水印算法;其次,结合程序分解的思想,给出了一种Java软件特征;最后,在软件特征的基础上,提出了一种基于代码迷乱的软件水印算法,具体而言包括以下3个方面:
首先,通过对Java可执行文件――class文件的结构分析,得出class文件中对常量存储及使用规则存在的数据冗余,基于该数据冗余并结合扩频水印的思想,提出一种基于常量重排的Java软件水印算法。该算法通过重排常量的顺序来嵌入信息,水印信息的嵌入不改变程序的大小,同时不会影响软件的性能,对软件的执行具有较好的不可感知性。
其次,针对基于指令序列等长机械分割的k-gram软件特征提取算法,不能体现程序语义的缺点,结合程序分解的思想,给出了一种针对Java指令的分解算法,并在此基础上提出一种Java软件特征。通过对Java虚拟机指令的分析,得到指令间以操作数栈为中心进行数据处理所产生的依赖关系,基于该依赖关系给出一种程序分解算法,对程序指令序列进行不等长分割,得到程序的分解碎片集,并将该碎片集作为软件的特征。该特征反映了程序的语义,能够抵抗代码重排,添加冗余代码等攻击,具有较高的鲁棒性与可信赖性。再次,在基于程序分解的Java软件特征的基础上,结合代码迷乱技术,提出了一种Java软件水印算法。该算法将水印信息编码为水印代码,并应用代码迷乱技术将水印代码嵌入到程序的分解碎片中,使得水印代码实际参与程序的执行。水印嵌入的过程就是代码迷乱的过程,水印提取以软件特征的提取为基础,该算法有效利用了代码迷乱、软件特征技术的优势,具有较高的鲁棒性。
最后,对本文工作进行了总结,对今后的工作做了进一步的展望。