`

软件水印技术学习

阅读更多

   软件水印是近年来出现的软件产品版权保护技术,可以用来标识作者、发行者、所有者、使用者等,并携
带有版权保护信息和身份认证信息,可以鉴别出非法复制和盗用的软件产品.目前在软件版权保护方面,人们主要是通过加密的方式进行,比如:软件狗、Vbox、SoftSENTRY、SecuROM 和SafeDISC 等.最近出现的软件水印则是另一种全新的软件保护措施.

   所谓的软件水印就是把程序的版权信息和用户身份信息嵌入到程序中.

 

软件水印分类

   根据水印的加入位置,软件水印可以分为代码水印和数据水印.代码水印隐藏在程序的指令部分中,而数据  
水印则隐藏在包括头文件、字符串和调试信息等数据中.根据水印被加载的时刻,软件水印可分为静态水印和
动态水印.静态水印存储在可执行程序代码中,比较典型的是把水印信息放在安装模块部分,或者是指令代码
中,或者是调试信息的符号部分.对于Java 程序,水印信息也可以隐藏在类文件(包括常量池表、方法表、行号表)
的任何部分中.静态水印又可以进一步分为静态数据水印和静态代码水印.区别于静态水印,动态水印则保存在
程序的执行状态中,而不是程序源代码本身.这种水印可用于证明程序是否经过了迷乱变换处理.动态水印主要
有3 类:Easter Egg 水印、数据结构水印和执行状态水印.其中,每种情况都需要有预先输入,然后根据输入,程序
会运行到某种状态,这些状态就代表水印.

 

1.1 静态数据水印


    数据水印很容易产生和识别,是一种常见的水印.这种水印可以在程序中的一些数据中体现出来,因而很容
易被迷乱攻击破坏.比如把所有的数据分解成一系列数据,然后散布到整个程序中,这样代表水印信息的数据也
被分解,增加了水印检测的难度;或者用一个产生这些数据的子程序来代替这些数据,这样在程序中就找不到该
数据的原型,也就无法检测水印.


1.2 静态代码水印


    利用人类视觉和听觉的不敏感性,多媒体水印通常是加在载体上的冗余部分.也可以用相同的方式来构造
代码水印,因为目标代码也包含了冗余信息.比如通过调整两条无依赖关系指令的顺序可以嵌入1bit 的水印信
息.IBM 提出了一种把寄存器出入栈的顺序作为水印的方法,同样可以通过排列有m 个分支的case 语句的顺序
来编码log(m!) 比特信息.Davidson[3]描述一种类似的代码水印,它在程序的控制流图的一个基本模块中对软件
的序列号进行编码.
    许多代码水印都经不起一些简单的水印攻击(比如,调整指令的顺序).既然交换指令的顺序不影响原程序,
那么就可以把源代码中所有满足这个条件的指令都交换位置,这样就无法检测到先前加入的水印了.
很多代码迷乱技术能够破坏代码水印.对于Davidson 的方法,只要能够准确地找到控制流图的基本模块.我
们很容易通过插入一个布尔值始终为TRUE 的条件分支破坏这个基本模块,使水印无法检测.通过迷乱变换,所
有静态结构水印都会被破坏.内嵌、循环变换和代码都是常见的优化技术,这些技术也很容易破坏静态代码水
印.Moslkowitz[4]提出了一种具有防篡改的水印算法,其基本思想是把关键代码的一部分隐藏在软件的资源(如
图标、声音)中,并且程序会不时地从资源中提取出这段代码执行,如果资源被破坏,那么程序就会出错.
静态代码水印更难抵抗语义保持变换攻击.出于安全考虑,Java 程序不能检测自己的代码,比如语句if
(instruction #100!="add" ) exit()在Java 语法中是不允许的,虽然在其他语言如C 中是可能的.但是由于这种语句的特殊性,它要检查指令,而不是可执行程序数据段中的数据,所以很容易找到这种语句在程序中的位置.
总之,尽管静态水印比较简单,但是由于它容易遭到破坏、鲁棒性不好,因而不能得到广泛应用.


1.3 Easter Egg水印


    这种水印无须检测,它通过一个输入产生一个输出.比如输入一个字符串,然后屏幕上就显示出版权信息或
一幅图像.Easter Egg 水印的主要问题是水印在程序中的位置容易找到,一旦输入正确信息,用softice 这样的标
准调试软件就可以跟踪程序执行情况,进而找到水印的位置,所以这种水印不是很安全。

 

1.4 动态数据结构水印


    这种水印的机制是:输入特定信息激发程序把水印信息隐藏在堆、栈或者全局变量域等程序状态中.当所
有信息都输完之后,通过检测程序变量的当前值来进行水印提取.可以安排一个提取水印信息的进程或在调试
器下运行程序查看变量取值.
    与Easter Egg 水印不同的是,动态数据水印没有输出,而且水印的提取过程不是封装在应用程序中,因而不
容易找到水印在程序中的位置,但是这种水印也经不住迷乱变换的攻击.


1.5 动态执行过程水印


    当程序在特定的输入下运行时,对程序中指令的执行顺序或内存地址走向进行编码生成水印.水印检测则
通过控制地址和操作码顺序的统计特性来进行.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics