论文部分内容阅读
软件水印是数字水印技术的一个分支,它将版权信息作为水印,秘密地嵌入在软件流程、代码、数据中,通过提取水印验证合法拥有者,检测、威慑盗版行为。该技术有效保护软件知识产权,不限制软件执行,符合软件厂商既保护产权又不影响市场推广的策略,受到软件厂商高度重视,是软件安全研究领域的热点。近20年来,软件水印研究取得了大量研究成果,发表了多种软件水印算法,但满足实际应用需求的软件水印技术匮乏,其研究面临诸多问题和挑战。1、已有软件水印算法,大都以加入傀儡指令的方式嵌入水印,形成水印的代码没有真正的功能,利用逆向工程技术,很容易找出这些代码,进而破坏水印提取。2、水印鲁棒性差,即使编译器的优化功能都能对水印产生巨大影响,目前没有一种软件水印技术能抗混淆攻击。3、为提高水印鲁棒性,试图隐藏水印形成代码,导致水印算法无法公开,水印对抗强度差。4、抄袭程序整体代码的情形极为少见,当攻击者复制部分代码时,以整体程序为嵌入对象的水印,很难在部分代码中提取。针对以上问题,本文对软件图分簇后,以簇为单位嵌入水印信息抗部分代码剽窃;以软件指令分布统计、频繁执行路径、混淆编译为可靠特征,将水印信息映射在软件本身的功能代码中,提高水印鲁棒性。具体研究内容如下:(1)提出基于软件稠密共变图分簇的软件水印方法,解决部分代码剽窃时水印信息失效问题。该方法从CVS服务器上提取软件稠密共变图,再以随机步方式融合未改变节点,形成精确的稠密共变图。使用扩展后的GN算法对该图分簇后,每一簇代码精确映射原程序的一个子系统。在SANDMARK上的实验表明,除图论方法外的软件水印方法,当以簇为单位嵌入水印,任何一个完整子系统中都能成功提取水印信息,这有效解决了部分代码剽窃时,水印信息失效问题。(2)借鉴变指令分布频率嵌入水印思想,提出只改变部分代码块指令频率的软件水印方法。该方法针对MSIL程序,将程序中每一assembly做为一个代码块,通过等价指令替换,改变assembly中某一条指令分布频率,嵌入一位水印信息。提取水印时,根据代码本检验特定assembly中选定指令频率,提取水印位。该方法以整体特征为载体,实现难度比SHKQ算法小,无需改变大量指令,可应用于较小的程序,通过代码本选取,具有抗共谋攻击能力。(3)提出基于扩展频繁执行路径数据流的软件水印方法。该方法以程序可靠特征WPP(Whole Program Path)为嵌入水印,以扩展的频繁执行路径数据流为载体,将水印映射在数据流整体特征上,把水印嵌入定位于逻辑层面,水印与软件功能挂钩,破坏水印则影响程序执行,有效提高了水印鲁棒性。水印的嵌入对程序代码修改少,能避免维护、升级、补丁、传输、正常操作影响软件水印提取。WPP根据动态输入形成,不同的输入确定不同的载体,即使将抄袭的代码逆向工程后,用不同的编程语言再实现,水印信息依然可以提取。实验表明,该方法可抗多种保持语义攻击,几乎不会对程序执行产生负面影响。(4)提出基于非等价语义混淆规则的软件水印方案,解决混淆与水印嵌入相互影响问题。该方案在对代码进行混淆的同时,利用混淆规则抽象映射水印信息,混淆与水印加入同时实现,避免混淆对水印造成破坏。该方案设计了非等价语义混淆变换,混淆后的代码不包含软件的全部语义,执行混淆后的程序得不到原程序功能,在隐藏软件语义的同时,保障了软件水印鲁棒性。方案设置一独立模块恢复语义,提取水印信息。反汇编实验表明,非等价语义混淆有效分割了代码语义,在抵御逆向工程的同时,提高了水印鲁棒性。(5)开展了动态软件胎记技术的研究,将基于扩展频繁执行路径方法用于构造软件胎记。软件胎记的研究不仅对盗版检测有着重要意义,也促进了软件安全、软件维护、软件调试等相关研究领域发展。可靠性(经等价语义转换后仍可识别)高的胎记可抵御保持语义攻击,是软件水印理想的鲁棒性保障载体,可信性(区分不同开发人员开发的相同功能软件的性能)高的胎记是软件水印理想的嵌入载体。实验表明,此胎记的可靠性与WPP胎记相同,可信性明显高于WPP胎记,是对软件胎记技术的有意探索。