软件水印实现软件版权保护

时间:2022-10-17 08:08:21

软件水印实现软件版权保护

摘要:根据软件水印原理,软件水印可以应用于验?证软件版权所有。其方法是将软件版权信息作为水印内容,以可执行文件作为嵌入载体。在分析可执行文件各节结构存在一定程度的空余存储空间之后,可以利用这些空余空间或者构造空余空间,将水印信息经过加密并设计通用的策略嵌入其中。同时修改可执行文件的相关特征数据,以实现嵌入水印的隐蔽性。嵌入的水印密文可以被提取并解密,从而声明软件版权。

关键词:软件水印;版权声明;PE文件格式;加密

中图分类号:TP309.2 文献标识码:A文章编号:1009-3044(2010)07-1701-03

The Protection of Software Copyright by Software Watermarking

LIU Hong-sheng, SUN Chang-ying

(School of Computer, Anhui Industrial Technology University, Ma'anshan 243002, China)

Abstract: According to the principle of Software Watermarking, It can be applied to validate the software copyright reserved. The method is that the information of software copyright is converted to watermarking and embedded into the executable file which is regarded as carrier. When analyzing that the executable file exists some free storage space, the watermarking can be encrypted and embedded universally and strategically into these free space which can as well be constructed. At the same time the relevant data of characteristics of the executable file should be modified in order to achieve the invisibility of watermarking embedded. The watermarking can be extracted and decrypted in order to state the software copyright.

Key words: software watermarking; copyright statement; PE file format; encryption

目前主要的软件保护技术有:序列号保护,警告(NAG)窗口,时间限制,Key File保护,限制功能保护等等。基于硬件的方法有加密狗、加密锁保护,光盘保护等等。然而,随着互联网应用的普及,软件破解技术不断发展并广泛传播。与此同时,各种软件调试破解工具不断升级。传统的保护手段对于破解者来说是相当脆弱的。以致软件盗版、软件非法拷贝等问题日益严峻,也因此软件产品知识产权的保护变得尤为重要。一般来说,如果软件产品能够被专利、版权等方式合法的保护,然而发现攻击软件知识产权的行为难以界定。因此通过技术手段来保护软件开发商的知识产权成为必要的选择。从技术层面来说,我们需要足够的证据来证明软件的开发者对软件的所有权。如果软件版权受到侵害,则可以抽取信息来证明作者对其作品的所有权。软件水印技术[1]就是在这一背景下提出来的,并成为一种很有前景的软件保护技术,有待进一步的研究。

美国在软件水印研究方面的成果最为显著,有多篇介绍动态水印算法[2-4]。微软申请了一项专利[5],描述了一种水印技术,以此来防止盗版。1998年,美国版权保护技术组织成立了数据隐藏小组[6],着手制定版权保护水印的技术标准。尽管至今还没有形成数字水印的最终技术标准,但已经明确了用于版权保护的数字水印必须满足的一些基本条件。我国在软件水印的算法研究领域我国已经有不少[7-8],同时在软件水印应用方面也有探索。

软件水印是密码学、软件工程、算法设计、程序设计等学科的交叉研究领域。软件水 印是近年来出现的一种新型的软件版权保护方法。它在软件产品中嵌入版权保护信息和身份认证信息,并通过检测出版权保护信息和身份认证信息来确认对产品的版权拥有,防止软件盗版和非法拷贝。本文根据PE(Portable Executable)文件格式的特点,提出了一种较好的嵌入版权信息的策略,并且对版权信息进行加密处理,增强了信息的安全性。

1 软件水印保护版权原理

水印是信息隐藏的有效手段。软件水印也继承了水印的这一特点,具有信息隐藏的功能,只是信息隐藏的场所不是媒体而是软件。软件水印保护软件版权的问题就是利用了水印的信息隐藏功能,其过程可以描述为:水印信息设计加密、嵌入、检测。作为版权保护的水印应该包含软件的作者,公司等版权信息。当然可以将其他的一些重点信息也合并到水印中。在设计水印信息时对其加密,可以防止水印信息遭到破坏或者修改。

根据软件水印的分类,对软件版权进行保护,可以采用动态软件水印,也可以采用静态软件水印的方法。如果选择前者,那么程序开发过程中,选择一种动态水印算法,和正常的软件模块一起编写、编译。完成后的软件程序执行过程中,就可以验证水印的存在。

对于静态软件水印一般软件版权信息都是保存在源代码中,而版权信息一般是在软件设计好后确定下来的,如果采用源代码方式把版权信息嵌入不便推广为一般方法。因此那种在源代码中保存水印信息的方式需要改进。这里改进水印的嵌入载体为PE文件,即在编译成功后的可执行文件中。水印的检测过程与水印的嵌入是可逆的,如果嵌入中采用了加密处理,则在检测时还要有解密过程。通过检测水印有无及水印内容可知该软件的版权归属。具体步骤如下:

1)生成软件水印信息W。

2)将软件水印信息W加密处理生成W'。

3)确定软件水印信息的嵌入位置,按照一定的策略写入PE文件的空余存储位置。

4)提取PE文件中的水印密文W'。

5)解密W',验证PE文件的版权信息。

在软件水印保护版权的过程中最关键部分应该是两个方面:一方面是是水印信息在PE文件中的嵌入位置;另一方面水印信息的设计与嵌入策略的设计。下面将对这两方面作详细讨论。

2 PE格式及水印嵌入位置分析

PE文件是目前微软Windows操作系统的可执行文件。代码编写、编译、链接后的可执行文件都以PE文件格式存储。与PE文件相关的变量和数据结构定义在WINNT.h中[9]。水印信息嵌入PE文件中有一个基本要求,就是不能影响软件的执行。基于这一原则,水印信息只能嵌入PE文件中非程序数据区,这里有两种方案:一是利用现有的PE文件中的空余区域,二是在PE文件末尾添加新节。

2.1 PE文件现有的空余位置

PE文件在磁盘当中是根据FileAlignmet对齐之后存储的。FileAlignment值为0x200,因此PE文件节间的空余空间(R)范围是:0≤R

1)其中VirtualSize:标识该节的实际大小,没有经过SectionAlignment或者FileAlignment对齐的大小。

2)SizeOfRawData:标识该节在文件中占据的大小。通常情况下SizeOfRawData大于VirtualSize。

3)PointerToRawData:标识该节在文件中的偏移位置。

综上分析:对于每一节,从PointerToRawData位置到PointerToRawData + SizeOfRawData C VirtualSize就是该节在磁盘存储中空余的部分。

为了增强隐蔽性,防止探测程序清除隐藏在PE文件中的信息,软件水印信息在被嵌入PE文件之后可以把VirtualSize的值修改为VirtualSize与水印的长度之和。

2.2 构造空余位置

在PE文件末尾添加一个新节构造空余空间:包括节的PE文件头信息,节内容。最后修改PE头部信息。

2.2.1 构造IMAGE_SECTION_HEADER信息

1)Name:任意少于8个字节的字符串。可以为空。

2)VirtualSize:即节内容的实际大小,节的内容是根据具体应用而来

3)VirtualAddress:原PE文件最后一节的VirtualAddress加上最后一节(VirtualSize%SectionAlignment+1)* SectionAlignment。

4)SizeOfRawData:新节的(VirtualSize%FileAlignment+1)* FileAlignment。

5)PointerToRawData:原PE文件最后一节PointerToRawData + SizeOfRawData。

6)根据需要设置新节的Characteristics。

2.2.2 修改PE文件IMAGE_FILE_HEADER结构

1)NumberOfSections加1。

2)SizeOfImage加上新节的大小。

3 版权保护水印设计与实现

3.1 软件水印信息的生成

由于PE文件的空余存储空间并非连续分布,所以软件水印信息可能大于每一个空余存储空间,而又小于它们的总和。所以软件水印信息需要被切分。当软件水印信息大于空余存储空间之和时,嵌入软件水印的办法只有在PE文件末尾添加一个新节了。

综上分析,软件水印信息可能被切分,可以设计软件水印信息由两个部分组成:软件水印信息主体(body)与软件水印信息尾部(rear)。信息的rear部分不会被切分,并且会被嵌入到每个空余存储区,备份rear部分便于水印信息的提取。

3.1.1 软件水印信息主体

本文是通过软件水印技术来实现软件版权保护,所以按设想水印信息主要应当包括软件的作者、版权所有、版本号、日期等等。水印的body部分根据需求,也可以设计为其他内容,大小任意。本文将水印body部分定义为结构体:

typedef struct tagCOPYRIGHT_OWNERSHIP

{

CHARauthorName[20];

CHARcompanyName[35];

CHARdate[15];

CHARversion[15];

}COPYRIGHT_OWNERSHIP;

3.1.2 软件水印信息尾部

由于PE文件的空余存储空间分布于每个节的尾部,所以在提取水印信息时,先读取水印尾部比较方便。水印尾部大小固定,这样如果某个空余存储空间小于尾部大小,那么该空余空间不嵌入软件水印信息。

水印尾部具体内容包括:水印信息固定标识为“SW\0”。SW为Software Watermarking的缩写。水印信息分割后存放的位置信息,即存放的水印数据片段的文件偏移地址及其大小。结构体定义为:

typedef struct tagWAT_MARK_REAR//watermarking rear

{

struct SPLIT_POS_INFO

{

DWORD dwPos;

DWORD splitSize;

}posInfo[4]; //水印body部分最多切分4块

DWORD sizeOfBody; //水印信息body 大小

DWORD signiture; //signiture为“SW\0”

}WAT_MARK_REAR;

3.2 水印嵌入及其提取

3.2.1 水印的嵌入过程

嵌入水印的过程如图一所示,需要说明的是:

1)水印body部分进行加密处理,加密算法可以选择任意一种,本文以DES对称加密算法为例。加密生成的密钥写入文件保存。

2)无论水印的body部分是否被切分,水印的rear部分都应当写入每个具有足够大空余的节。这样起到备份水印嵌入位置信息的作用。

3)水印body部分的切分是根据各节的空余存储空间来定。所以大小不固定,各部分嵌入的位置被记录在水印的rear部分。

3.2.2 水印提取过程

首先从各个节的末尾读取水印rear大小的数据块。验证数据是否为水印的rear部分。水印rear部分由标识为“SW\0”。

然后读取rear部分记录的每个节被嵌入的水印片段的位置及其大小。继而读取加密后的水印。将body部分拼接起来。

对body部分的数据进行解密,验证版权所有。

3.3 实验结果

算法实现平台:Microsoft Windows Xp Sp2,512MRAM.Microsoft Visual C++ 7.0。而此处水印body内容设计为COPYRIGHT_OWNERSHIP结构体。autorName为:“XXX”;companyName为:“版权所有: Powered By XXX company”;date为:“2009-2015”;Version为:“Version 1.0”。COPYRIGHT_OWNERSHIP结构体大小为0x0055。通过DES加密后大小为:0x0058。

实验1以Windows任务管理器为例进行分析和水印的嵌入,taskmgr.exe版本号为5.1.2600.2180。

taskmgr.exe共3个节,其中.rsrc节PointerToRawData是0x00014a00,SizeOfRawData是0x00009600,VirtualSize是0x00009454,其空余存储空间最大为:0x01ac。.text节的空余存储空间为0x0112。水印body嵌入的位置是.rsrc节PointerToRawData + VirtualSize = 0x0001de54。水印的rear部分同时也备份到.text节中。提取解密后验证有效。

实验2是以金山词霸2007为例,进行分析并嵌入水印。本机的金山词霸2007被加UPX壳,节头信息被修改,SizeOfRawData显示比VirtualSize小。所以根据算法流程,只有添加一个新节实现水印的嵌入。

通过分析,本机的金山词霸2007经加壳之后有三个节:UPX0,UPX1,与.rsrc三个节。.rsrc节SizeOfRawData:0x00013600,PointerToRawData:0x000ac800,所以我们添加的新节的文件偏移位置PointerToRawData是:0x000bfe00。水印嵌入信息与提取验证一致。

4 总结

实验表明,将水印信息嵌入节的空余存储空间之后,再修改节头的VirtualSize以及SizeOfRawData等信息。水印能够实现很好的隐蔽性。如果水印信息是嵌入到一个新建节当中,最好把所有的节的节名修改。或者修改掉节头信息,实现较好的隐蔽性。

本文利用PE文件自身固有的空余存储空间或者构造空余空间实现对水印信息的嵌入,同时水印信息得到加密保护,不容易被攻击者发现。需要说明的是本文提供的方法只能确认软件版本的拥有权,不能防止个人用户非法使用。

参考文献:

[1] 张立和,杨义先,钮心忻.软件水印综述[J].软件学报,2003,14(2):268-277.

[2] Palsberg J,Krishnaswamy S,Kwon M,et al.Experience with software Watermarking[C]//Proc.Of ACSAC'00.New York:ACM Press,2000:308-316.

[3] Cousot P,Cousot R.An Abstract interpretation-based Framework for Software Watermarking[C]//Proc.Of POPL'98.New York:ACM press,2004:173-185.

[4] Nagra J,Thomborson C.Threading Software Watermarks[C]//Proc.Of IH'04.Toronto,Canada.2004:208-233.

[5] Burns.Method for watermarking computer programs[P].American Pat7231524.2007.

[6] 王贤德,王伟超.软件版权保护技术研究[J].软件导刊,2008,7(7)30-31.

[7] 殷柯,杨旭光.基于Shamir门限和分支结构的动态水印方案[J].吉林大学学报(增刊),2008:221-225.

[8] 罗养霞,马君,等.基于门限方案的动态图软件水印算法[J].计算机工程,2009,35(1):153-155.

[9] 吴振强,冯绍东.PE文件的信息隐藏方案实现[J].计算机工程与应用,2005(27):148-163.

[10] 徐晓静,徐向阳,等.PE文件资源节的信息隐藏研究与方案实现[J].计算机应用,2007,27(3):621-623.

上一篇:巧用Excel中的“条件格式”和“公式” 下一篇:基于Agent的雷达管制自主教学模拟系统的设计