温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
一种
基于
自修
动态
耦合
水印
方法
李凌俐
第 39 卷第 1 期2023 年 2 月天 津理工大学学报JOUNAL OF TIANJIN UNIVESITY OF TECHNOLOGYVol.39 No.1Feb 2023收稿日期:20210914;修订日期:20211102基金项目:国家自然科学基金(面上联合基金)(U1536122);天津市科委重大专项(15ZDSGX00030)DOI:10.3969/j.issn.1673095X.2023.01.005一种基于自修改的动态耦合水印方法李凌俐1,2,3,王春东1,2,3*,张清华1,2,3(1.天津理工大学 教育部计算机视觉与系统省部共建重点实验室,天津300384;2.天津理工大学 天津市智能计算与软件新技术重点实验室,天津300384;3.天津理工大学 计算机科学与工程学院,天津300384)摘要:在现有的软件水印工作中,水印通常与载体程序间不存在逻辑上的关联性,因此,攻击者可在载体程序正常运行的情况下移除水印代码,继而非法获得软件的所有权。为有效解决这一问题,提出了一种基于自修改的动态耦合软件水印方法,该方法将水印的触发条件与载体程序的控制流进行结合,增强水印与载体程序的逻辑关联性,并引入自修改代码保护机制对水印触发条件、动态加解密和关联路径分支进行保护。该方法极大地提高了攻击水印的难度,显著增加了攻击者的计算开销。通过安全性分析表明,该方法能够有效抵御逆向工程和分析。关键词:软件水印;条件代码混淆;自修改代码;载体程序中图分类号:TP311文献标识码:A文章编号:1673095X(2023)01002906Dynamic coupled watermark method based on self-modifying codeLI Lingli1,2,3,WANG Chundong1,2,3*,ZHANG Qinghua1,2,3(1.Tianjin Key Laboratory for Advanced Mechatronic System Design and Intelligent Control,Tianjin University of Technology,Tianjin 300384,China;2.Tianjin Key Laboratory of Intelligence Computing and Novel Software Technology,Tianjin University of Technology,Tianjin 300384,China;3.School of Computer Science and Engineering,Tianjin University ofTechnology,Tianjin 300384,China)Abstract:In the work of the existing software watermarking,there is usually no logical correlation between the watermarkand the carrier program So an attacker can remove the watermark code without damaging the normal operation of the carrierprogram,and then illegally obtain the ownership of software In this paper,the method of a coupling dynamic softwarewatermarking based on a self modification is proposed This method combines the watermark trigger condition with the control flowof the carrier program to enhance the logical correlation between the watermark and the carrier program The self modification codeprotection mechanism is introduced to protect the watermark trigger condition,dynamic encryption and decryption and thecorrelation path branch of the watermark It greatly improves the difficulty and the computational overhead of attacking thewatermark The security analyses show that the proposed method can effectively resist reverse engineering and analysesKey words:software watermark;condition code obfuscation;self-modifying code;carrger program软件知识产权的保护是软件行业健康发展的基础支撑。近年来,软件被恶意分析、抄袭和篡改的情况天津理工大学学报第 39 卷第 1 期愈演愈烈,如何使用软件水印技术有效保护软件的知识产权成为当前研究的一个热点问题。采用复杂的程序和逆向工程对软件进行分析和篡改的行为严重威胁着软件行业的发展17。此类非法的未经许可的破解软件行为,其根本是一种 Man-At-The-End 攻击,也称为 MATE 攻击8。MATE 攻击者通过逆向工程、克隆和恶意篡改等方式破坏软件的完整性。这种 MATE攻击会导致多种恶性结果,包括通过未经授权使用软件、绕过和重定向支付过程和窃取用户数据等行为谋取私利。这严重地损害了软件开发者和发行商的正当权益。因此,软件的知识产权需要更加有效的工具对其进行保护,即意味着知识产权所有者应该拥有对其产品的所有权,并且可以通过一定的手段防止未经许可的用户访问产品或者破坏产品代码的完整性。而软件水印可实现这些安全目标,为软件所有者提供知识产权保障。1软件水印保护方法软件水印保护910 技术分为静态水印方法和动态水印方法两种。静态软件水印的嵌入和提取较为简单,容易被攻击者识别,进而找到水印结构的存储位置,起不到该有的保护作用,因此,逐渐被废弃。与静态水印不同,动态水印方法则是将水印信息以数据结构或程序运行的状态嵌入到程序中,在程序的运行过程中将水印动态构建出来,以增强对软件的保护强度。根据文献 11 给出的定义,一个完整的动态软件水印系统主要由两个组件构成:嵌入器和提取器。对于程序 P 和水印信息 w,嵌入器将水印信息 w 嵌入到程序 P 中,生成带有水印的程序 Pw,在此过程中必须保留程序的原始语义和功能,即对于相同的输入,P 和 Pw必须具有相同的输出。提取器使用密钥 k 提取软件中的加密水印。提取过程为:Embedder(P,w)PwP(x)=Pw(x)Extractor(Pw,k)w动态水印方法主要分为 3 类:基于图论的方法、基于混淆的方法和其他动态 水 印 方 法。基 于 图论1213 的方法核心是通过更改字符或字符串的拓扑结构,设计出语义上相同的字符或字符串的多种字形,将设计的字形映射为图论中的图,最后对图进行编码表示数字水印。与基于图论的方法不同,基于混淆1415 的方法则是对软件的语义进行保留,通过代码混淆等方式隐藏水印信息。其他动态水印方法是将水印信息转换为特定的执行状态,如条件或路径分支方法1617 和不透明预测方法18 等。在上述的几类动态水印方法中,水印信息都是作为独立的代码块直接嵌入到载体程序中,与载体程序原始功能并没有直接的逻辑关联,即数字水印与软件不存在耦合性。这明显降低了水印对软件保护的有效性,使软件极易遭受到攻击。现有研究表明19,上述 3 种动态水印方法均不能抵御先进的逆向分析。攻击者使用 BAP 分析平台中的动态二进制分析工具5,2022 可轻松地逆向工程中一个程序的所有控制流,从而获得相应的跟踪信息,即分支和条件,以此来对程序进行语义修改,达到软件攻击的目的。这也变相表明:依赖于所谓的隐蔽性是无法有效保护水印模块安全的。综上所述,传统的动态水印方法存在以下问题:(1)水印信息 w 和程序 P 是相互独立的。水印信息与软件不存在耦合性,这意味着攻击者可以在保证程序功能正常运行的前提下去除水印或扭曲水印结构11。(2)现有方法的安全性依赖于水印结构的隐蔽性。而水印的隐蔽性仅仅依靠开发人员的编程经验判定,缺乏试验性的合理评估。(3)通过隐蔽的方式嵌入的水印极易被现有的二进制分析工具定位19,安全性亟待提高。因此,文中提出了一种基于自修改的动态耦合水印方法,该方法选取载体程序中的控制流作为 软件水印的载体,通过逻辑运算的方式将水印的触发条件和程序控制流进行耦合,并引入哈希函数和自修改代码来保护水印的触发条件、加解密过程和与水印相关联的路径分支。经过安全性分析证明,文中所提出的水印方法能有效抵御逆向工程和程序分析,极大地提高了水印对软件的保护程度。2动态耦合水印方法文中提出的软件水印方法是将水印代码和载体程032023 年 2 月李凌俐,等:一种基于自修改的动态耦合水印方法序代码使用条件语句进行混淆,采用 SMC 技术将水印信息隐藏在载体程序里,使得水印与载体软件高度耦合,从而达到保护软件版权的目的。2.1方法概述现有的软件动态水印工作一直存在水印信息与软件程序相互独立的问题。实际上,传统的动态水印并不是嵌入到程序中的,而更像是添加到程序中。软件添加水印的过程可以看做是一种程序块的拼接过程,仅仅是将三者连接起来,而不是语义层面地融合为带有水印的程序 Pw。因此,试图将水印与源程序的语义进行融合,增强水印与软件的耦合性,提出在不影响载体程序功能正常执行的前提下,使水印与载体程序进行关联,即建立水印与载体程序间的强依赖关系,并引入哈希函数和自修改代码保护水印代码模块,从而使逆向工程难以对软件水印进行识别和篡改。借助于语义混淆方法,将水印分支框架构建为一种隐藏的控制传输结构,如图 1 所示。图 1水印分支框架Fig.1Watermark branch framework选择一条控制流执行路径和水印执行路径,使用逻辑运算方法将两种路径进行混淆,使其成为一个条件分支下的两条路径,从而使得水印与载体程序建立逻辑上的强关联。采用 if 语句嵌套的方式将基本块,Q,B 嵌套成一个整体。在语义混淆的过程中,以哈希的方式引入密钥,使其作为重写代码块的触发条件,进而构建包含水印信息的隐藏控制传输结构。引入自修改代码对水印触发条件、重写后的水印代码和水印关联路径分支进行重写保护。带水印分支的代码块在内存中顺序定位后,自修改代码可以加密内存中带有水印的代码模块,并能够自动解密执行。同时自修改代码可定位代码块的内存地址,以此来提取水印。2.2水印嵌入为使水印与载体程序间建立依赖关系,增强两者的耦合性,文中算法需要先在载体程序中找到合适的条件代码块作为水印嵌入代码块。合适的水印嵌入代码块应该满足以下 3 个条件:(1)选取条件代码块时要注意避开性能热区。由于软件的性能热区代码在软件运行过程中会被多次执行,因此,在性能热区加入水印会显著增加软件运行开销,且提高水印被定位的概率,降低水印代码的隐蔽性。(2)选取带有等式运算符的条件代码,且必须包含一个具有静态可确定常数值的操作数。(3)基本块中最多包含一个条件分支。为在软件代码中快速准确地找到满足上述条件的代码块,首先构造控制流图,确定具有条件分支的基本块,选择包含等式运算符的条件代码。由于循环很可能是一个程序的性能热区,若对循环中的代码块进行混淆和重写,则极有可能对软件的逻辑和功能的正常执行产生