寄存器扩展(Register Expansion)、SemaCall 和 SideData:三种低开销的动态水印技术,适用于 LLVM 中的自动化流程

《Digital Threats: Research and Practice》:Register Expansion, SemaCall, and SideData: Three Low-Overhead Dynamic Watermarks Suitable for Automation in LLVM

【字体: 时间:2025年11月07日 来源:Digital Threats: Research and Practice

编辑推荐:

  软件水印通过哈希-like运算和寄存器扩展、语义调用、内存数据等技术动态嵌入代码,具有高抗攻击性(如需破解需推导多个哈希函数)和低性能开销(平均 slowdown <5%)。实验表明,三种水印可组合使用,提升鲁棒性且总开销仅4.28%。

  软件水印是一种用于防止盗版和未经授权篡改的保护手段。我们提出了三种动态软件水印技术,并展示了如何自动将其插入待水印的代码中。这三种技术均选择代码中的多个位置,插入随机生成且计算上不同的类似哈希运算,这些运算在运行时将秘密输入转换为水印信息。通过在多个位置插入多种哈希运算,我们的水印在攻击时更具挑战性,同时对程序的性能影响也较小。

在本文中,我们将详细探讨这三种水印技术的实现原理、特性以及它们在不同场景下的应用效果。首先介绍**Register Expansion Watermark**(寄存器扩展水印),该技术通过将32位整数值扩展为64位,并利用现有计算来传播水印信息。然后是**SemaCall Watermark**(SemaCall水印),它利用已知函数的返回值进行哈希运算,并通过检查返回值是否匹配预设的触发值来检测水印。最后是**SideData Watermark**(SideData水印),它基于内存分配,通过在内存写入完成后进行哈希检查,以确保水印信息不会被意外覆盖。这些技术不仅在安全性上表现优异,而且在实际应用中具备较低的性能开销。

### 1. Register Expansion Watermark

**Register Expansion Watermark**的核心思想是将32位整数扩展为64位,并在扩展后的高32位中存储水印信息。这种方法利用了寄存器的扩展特性,使得水印信息能够通过现有的计算过程传播,而不会对程序的原始功能造成明显影响。具体来说,当程序中的某个32位整数被用作计算的一部分时,我们将其扩展为64位,并在扩展后的高32位中嵌入水印信息。例如,一个32位变量在进行加法运算时,可以通过扩展为64位并保留高32位的值来传播水印信息。

这种技术的一个显著优势是其对程序的控制流和数据流几乎没有影响,因此具有良好的隐蔽性。然而,由于水印信息仅限于32位,因此其容量有限。此外,虽然寄存器扩展不会影响程序的语义,但某些编译器优化可能会将未使用的高32位消除,从而降低水印的鲁棒性。为了解决这个问题,我们通过在多个计算点插入不同的哈希运算,使得水印信息的传播更加广泛和隐蔽,从而提高其抗攻击能力。

### 2. SemaCall Watermark

**SemaCall Watermark**依赖于已知函数的语义,通过在这些函数的调用点插入哈希运算,以实现水印信息的隐藏和检测。例如,当程序调用一个已知函数(如读取字符串的函数)时,我们可以在其返回值上进行哈希运算,并在运行时检查返回值是否匹配预设的触发值。如果匹配,则触发隐藏的“彩蛋”功能,输出水印信息。这种方法的优点在于其水印信息不会直接出现在二进制文件中,而是通过函数的返回值间接生成,从而提高了隐蔽性。

然而,SemaCall水印的隐蔽性取决于水印信息的长度和编码方式。较长的水印信息会增加二进制文件的大小,从而可能影响其隐蔽性。为了缓解这一问题,我们采用了两种不同的编码方式:**字符逐位编码**和**多项式字符编码**。前者通过为每个字符生成独立的哈希运算来隐藏水印信息,而后者则通过构建一个多项式来映射所有字符,从而减少二进制文件的大小。尽管这两种方式在隐蔽性上有所不同,但它们都能有效隐藏水印信息,并且在性能上保持较低的开销。

### 3. SideData Watermark

**SideData Watermark**与SemaCall水印类似,但其基于内存分配。该技术利用程序中内存分配的广泛性,通过在内存写入完成后进行哈希检查,以检测水印信息。例如,当程序分配一个字符数组后,将用户输入的字符串写入该数组,随后插入的水印代码会检查数组中的内容是否匹配预设的触发值。如果匹配,则触发隐藏的“彩蛋”功能,输出水印信息。

这种方法的优势在于其隐蔽性较高,因为检查水印信息的代码通常不会直接出现在内存分配的附近,而是被插入到程序的其他部分。此外,由于内存分配在大多数程序中都较为常见,因此SideData水印可以被更频繁地应用,从而提高其鲁棒性和可信度。然而,这种方法的一个潜在缺点是,当水印信息较长时,二进制文件的大小会显著增加,这可能会影响其隐蔽性。

### 4. 水印技术的性能评估

为了评估这三种水印技术的性能,我们使用了来自“SingleSource”文件夹的104个基准程序。这些程序涵盖了多种编程语言,并且可以在单个编译命令下编译,无需语言扩展。我们对这些程序进行了性能测试,比较了水印代码对运行时间的影响。结果显示,这三种水印技术的平均运行时间开销均较低,分别为1.22%、0.84%和1.64%。其中,SemaCall水印的运行时间开销最低,而Register Expansion水印的开销相对较高,但仍在可接受范围内。

在对不同编码方式的比较中,我们发现字符逐位编码的运行时间开销略高于多项式编码。这是因为多项式编码在某些情况下可以减少哈希运算的次数,从而降低运行时间的影响。然而,由于多项式编码在较长的水印信息中可能产生数值不稳定,因此其适用范围受到一定限制。相比之下,字符逐位编码虽然会增加二进制文件的大小,但其运行时间开销相对较小,且适用于大多数情况。

### 5. 水印技术的鲁棒性与隐蔽性

在鲁棒性方面,这三种水印技术均表现出色。由于它们使用了多种不同的哈希运算,攻击者需要找到所有这些运算并推导出一个能够满足所有哈希运算的密钥,才能成功移除或篡改水印。这种方法使得水印的抗攻击能力较强,尤其是在面对减法攻击和破坏性攻击时。

在隐蔽性方面,Register Expansion水印由于其对程序的控制流和数据流影响较小,因此具有较高的隐蔽性。SemaCall和SideData水印则通过将检查代码插入到程序的不同位置,使得攻击者难以察觉其存在。特别是SideData水印,由于其检查代码通常不在内存分配附近,因此具有更好的隐蔽性。

### 6. 实现与应用

这三种水印技术均基于LLVM中间表示(LLVM-IR)进行实现,这意味着它们可以在编译过程中自动插入到待水印的代码中。为了提高水印的鲁棒性,我们设计了多种不同的哈希运算,并确保这些运算在不同的位置和不同的条件下都能正确生成水印信息。此外,我们还开发了用于提取水印的工具,这些工具可以通过调试器或脚本运行,以检测水印信息。

在实际应用中,这些水印技术可以用于各种类型的软件,尤其是那些需要保护知识产权的程序。由于它们的隐蔽性和鲁棒性较高,因此可以有效地防止盗版和未经授权的篡改。此外,这些技术的自动插入特性使得开发者无需手动修改代码,从而提高了其可行性。

### 7. 结论

本文介绍的三种动态软件水印技术(Register Expansion、SemaCall和SideData)在安全性、隐蔽性和可行性方面均表现出色。它们通过在多个位置插入随机生成且计算不同的哈希运算,使得水印信息难以被攻击者检测或移除。同时,这些技术对程序的性能影响较小,平均运行时间开销仅为1.22%、0.84%和1.64%。此外,这些水印技术可以独立应用或组合使用,以进一步提高水印的鲁棒性和可信度。

综上所述,这三种水印技术为软件保护提供了一种新的思路,能够在不影响程序功能的前提下,有效防止盗版和未经授权的篡改。它们的自动插入特性使得开发者可以轻松应用,而隐蔽性和鲁棒性则确保了水印的安全性。这些技术的应用不仅提高了软件的安全性,也为软件开发和维护提供了一种新的工具。
相关新闻
生物通微信公众号
微信
新浪微博
  • 急聘职位
  • 高薪职位

知名企业招聘

热点排行

    今日动态 | 人才市场 | 新技术专栏 | 中国科学人 | 云展台 | BioHot | 云讲堂直播 | 会展中心 | 特价专栏 | 技术快讯 | 免费试用

    版权所有 生物通

    Copyright© eBiotrade.com, All Rights Reserved

    联系信箱:

    粤ICP备09063491号