著录项信息
专利名称 | 源码和目标码联合嵌入的软件水印方法 |
申请号 | CN200810188310.5 | 申请日期 | 2008-12-25 |
法律状态 | 权利终止 | 申报国家 | 中国 |
公开/公告日 | 2009-07-08 | 公开/公告号 | CN101477610 |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F21/22 | IPC分类号 | G;0;6;F;2;1;/;2;2;;;G;0;6;N;7;/;0;8查看分类表>
|
申请人 | 中国人民解放军信息工程大学 | 申请人地址 | 河南省郑州市金水区俭学街1001信箱
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 中国人民解放军信息工程大学 | 当前权利人 | 中国人民解放军信息工程大学 |
发明人 | 芦斌;郑俊杰;刘粉林;孙怡峰;葛辛;王唯 |
代理机构 | 暂无 | 代理人 | 暂无 |
摘要
本发明属于软件保护领域,是将数字水印的技术思想应用于软件保护领域而产生的一种可对软件的版权实施保护的技术方案。该发明针对Windows系统中的PE文件格式而设计,充分利用软件本身可执行的特点,将水印的提取器嵌入在软件当中,采用源码和目标码联合嵌入的策略,将软件的版权信息,用户的指纹信息嵌入到软件当中,为软件提供版权申明的功能,一旦发生盗版可以追查盗版源。该技术方案通过引入反逆向工程技术,以抵抗水印的抗逆向工程攻击能力;通过引入混沌系统,把水印信息散列编码到整个代码当中,以保护全部代码。
1.一种源码和目标码联合嵌入的软件水印方法,将混沌系统、输入监控模块、水印解码模块、反逆向工程模块、水印信息嵌入到软件当中,其特征在于,包括以下步骤:
a)混沌系统以给定的密钥K1,迭代产生混沌序列,并列用该序列对水印信息W1进行编码,得到编码后的水印信息W2,使其更适合于嵌入到程序当中,记W2的长度为N0字节,所述混沌系统包括主混沌系统和影子混沌两个混沌系统,其中主混沌系统为一维PWLCM混沌映射:
+
其中,l∈Z 是的映射的分段参数,i∈{0,1,2,…,l-1};
影子混沌系统为Logistic映射,其方程为下式,其中b∈(3.6,4]为Logistic的参数:
x(t+1)=bx(1-x)
所述混沌系统采用一维PWLCM混沌映射与Logistic映射互相扰动,生成混沌序列,其中,一维PWLCM混沌映射对Logistic映射的扰动方法如下式:
-5
x′L=(xL+xY10 )mod1
其中xL是Logistic映射的当前状态,xY是一维PWLCM混沌映射的当前状态,x′L是扰动之后的Logistic映射的状态;
Logistic映射对一维PWLCM混沌映射的扰动方案如下式:
-3
x′Y=(xY+xL10 )mod1
其中xY是Logistic映射的当前状态,xL是一维PWLCM混沌映射的当前状态,x′Y是扰动之后的Logistic映射的状态;
b)在用户配置信息的控制下,模块生成器生成混沌系统模块、水印解码模块、反逆向工程模块,将这三个模块的长度分别记为N1,N2,N3字节;
c)所述模块生成器利用密钥K2生成输入监控模块,该监控模块中具有K2的相关信息,可以判断用户的输入是否为密钥K2,将该模块的长度记为N4字节;
d)对于待嵌入水印信息的程序所给定的程序源码P1,将其送入冗余嵌入器,冗余嵌入器在程序源码中加入5块冗余代码,确保这5块冗余代码在编译后的目标码中的长度分别为N0,N1,N2,N3,N4字节,并且做好识别标记,确保从目标码中可以准确找到这5块冗余空间,记嵌入冗余空间的源代码为P2;
e)将P2送入到编译器,经过编译器的编译,可得到目标码O1,该目标码中具有5块冗余代码,且5块冗余代码的长度分别为N0,N1,N2,N3,N4,分别称这5块冗余代码为第0,1,2,3,
4块冗余代码;
f)利用混沌替换,将混沌系统模块、水印解码模块、反逆向工程模块、输入监控模块嵌入到目标码O1的非冗余代码中,并将嵌入后需要保存的信息保存到第1,2,3,4块冗余代码,即将第1,2,3,4块冗余代码覆盖;
g)利用混沌系统生成的混沌序列,将编码后的水印信息W2,利用混沌散列嵌入到除第
0,1,2,3,4冗余代码和混沌系统模块、水印解码模块、反逆向工程模块、输入监控模块的嵌入位置以外的所有代码部分,并将嵌入水印后需要保存的信息保存到第0块冗余代码,即将第0块冗余代码覆盖;
h)修改执行文件的头部信息,使可执行代码的开始执行位置为输入监控模块,此时得到的目标码O2即为嵌入水印后的目标码;
其中步骤d)中的冗余代码的嵌入,采用在代码中直接写入特殊值,以精确控制大小,并从目标码中找到冗余块;
其中步骤f)中采用的混沌替换将混沌系统模块、水印解码模块、反逆向工程模块、输入监控模块嵌入到软件当中,并保存被覆盖后的代码以备恢复代码时使用;
c,i是8-bit的整数,G是步骤a)中的数字化混沌系统,替换之后原来存储i的位置存储c,并保存s以备恢复i,其计算s的过程为:
(c)
其中,x∈[0,1)为混沌系统的当前状态,G (x)表示混沌系统以x为初值,迭代c次之后的混沌系统的状态,为模2加;
其中,混沌替换方法的逆过程是用c和s恢复i:
(c)
x为混沌系统的当前状态,G (x)表示混沌系统以x为初值,迭代c次之后的混沌系统的状态;
对于集合A={a1,a2,…,ak}使用混沌替换方法替换B={b1,b2,…,bk},得:
其中j=1,2,…,k。其逆过程记为:
2.根据权利要求1所述的源码和目标码联合嵌入的软件水印方法,其特征在于:
步骤h)中采用混沌散列完成水印信息的嵌入,该嵌入过程具体包括如下两步骤:
①迭代混沌系统,生成混沌序列,利用该序列确定水印信息的嵌入位置,使这些嵌入位置均匀散列在所有待嵌水印的代码区域;
②采用“混沌替换”,用水印信息替换第①步中确定的嵌入位置处的代码。
3.根据权利要求1所述的源码和目标码联合嵌入的软件水印方法,其特征在于:
其中水印信息的处理如下:
将水印信息按8bit分割,记分割后的水印信息为W=(w1,w2,…,wn),则wi∈{0,1,
2,…,255};生成长度为n的混沌序列S=(s1,s2,…,sn),其中si∈(0,1),
4.根据权利要求1所述的源码和目标码联合嵌入的软件水印方法,其特征在于:
通过Hook键盘消息监控用户的输入,对用户的输入计算散列值,如果散列值与K2的散列值相同,则启动水印解码模块。
源码和目标码联合嵌入的软件水印方法\n技术领域\n[0001] 本发明属软件保护领域,具体是一种基于源码和目标码联合嵌入的软件水印方法。\n背景技术\n[0002] 软件水印是嵌入到程序当中的秘密消息,这些消息应能方便可靠地提取出来,以证明软件的所有权,并且具有在保证程序功能的情况下不能或难以去除该消息的功能。该技术可提供所有者鉴别、所有权验证、操作跟踪、拷贝控制等服务,是密码学、软件工程、图论等学科的交叉研究领域。简单地说,软件水印是用水印的思想实施软件保护。\n[0003] 依据嵌入到软件当中的信息的不同,软件水印可以具有不同的功能,如,嵌入的信息是标识软件所有者的身份信息,则这类水印可以用于证明软件产品的版权归属;嵌入的信息是标识软件产品的序列号或者购买者的身份信息,则一旦发生盗版,可通过该信息追查盗版源,为盗版取证提供必要的技术支持。一般而言,软件水印具有以下一些应用:\n[0004] (1)软件版权申明(Authorship):通过软件水印申明软件的版权,软件中的水印信息可以被任何合法的用户(公开水印密钥)提取。软件用户可以通过该水印判断所使用的软件是否为正版软件。\n[0005] (2)软件版权证明(Authentication):通过软件水印证明软件的版权,软件中的水印信息仅能被软件开发者(拥有水印密钥)提取,该水印信息可以证明软件的所有权。当两个公司都称某软件是自己公司的软件时,软件版权证明水印可以证明软件的所有权,从而揭穿盗版者的谎言。\n[0006] (3)盗版源的跟踪:在分发给不同使用者的软件中嵌入的水印信息各不相同(不同的信息是软件的指纹),当盗版行为发生时,可以根据软件的指纹寻找盗版软件是从哪个使用者流传出去的,从而定位盗版源。\n[0007] (4)非法复用软件模块的发现:如果整个软件被盗用,常常是容易发现的;但当仅有某个模块给非法复用时,常常是难以发现的,软件水印可以用于发现与检测这种情况下的盗版行为。\n[0008] (5)盗版自报告:Easter Egg软件水印利用了软件可运行的特点,把水印检测器嵌入到软件当中,当检测器运行时,可以通过检查软件的生存环境(例如主机IP等),判断该软件的生存环境是否构成盗版行为,进而在可能的情况下,通过网络主动报告盗版行为。\n[0009] (6)盗版自发现:随着计算机网络的迅速发展,通过网络分发软件成为软件分发的一种重要手段。这就给软件盗版的自发现提供了可能,利用网络爬虫技术搜索Internet网上的软件,并检测这些软件当中的水印信息,从而自动地发现盗版行为。\n[0010] 根据软件水印嵌入和提取的时机分类,软件水印大致可分为:静态水印和动态水印。\n[0011] 静态水印就是把嵌入载体(程序)看作静态对象,水印嵌入到静态的数据或代码当中。静态水印生成灵活,使用简单,是使用最广泛的软件水印,但安全性不高。静态水印又可以进一步分为静态数据水印和静态代码水印。静态数据水印是将水印信息嵌入到软件的数据段当中,而静态代码水印是将水印信息嵌入在软件的代码段当中。\n[0012] 动态水印是把软件看作动态对象,把水印嵌入到程序动态运行的中间状态中,这类水印充分利用了软件本身可执行的特点,与静态水印相比,鲁棒性更高。具体而言,动态水印又可以划分为Easter Egg水印、动态数据结构水印、动态执行过程水印。Easter Egg水印又称复活节彩蛋水印,是直接把水印的检测器加入到软件代码当中,通过特定的输入序列,激活水印检测(提取)器,检测(提取)器在检测(提取)到水印后,把水印显示给用户。动态数据结构水印是把水印嵌入到软件运行时动态生成的数据结构当中,软件处于静态时(即不运行时)不包含水印信息,当软件接受到特定的输入序列后,水印信息编码在堆、栈或者全局变量等数据当中,通过检测(提取)软件中的相关状态来检测(提取)水印。\n动态执行过程水印通过对程序中指令的执行顺序或内存地址走向编码水印。\n发明内容\n[0013] 本发明的目的是提供一种软件保护的实用性方法,其基本思想是:将源码级嵌入水印与目标码级嵌入水印的优点相融合,将软件的版权信息,用户的指纹信息嵌入到软件当中,为软件提供版权申明的功能,一旦发生盗版可以追查盗版源;通过引入反逆向工程技术,以提高方法的抗逆向工程攻击能力;通过引入混沌系统,把水印信息散列编码到整个代码当中,以保护全部代码。\n[0014] 在本水印方法中,嵌入到软件当中的信息包括:混沌系统、输入监控模块、水印解码模块、反逆向工程模块、水印信息5部分。其嵌入过程如下:\n[0015] a).混沌系统S以给定的密钥K1,迭代产生混沌序列,并列用该序列对水印信息W1进行编码,得到编码后的水印信息W2,使其更适合于嵌入到程序当中,记W2的长度为N0字节。\n[0016] b).在用户配置信息的控制下,“模块生成器”生成混沌系统模块、水印解码模块、反逆向工程模块。这里需要特别指出的是混沌系统模块必须与步骤1中的“混沌系统S”相匹配,记这三个模块的长度分别为N1,N2,N3字节。\n[0017] c).在密钥K2的控制下,“模块生成器”生成“输入监控模块”,该监控模块中具有K2的相关信息,可以判断用户的输入是否为密钥K2,记该模块的长度为N4字节。\n[0018] d).对于给定的程序源码P1(该程序为待嵌入水印信息的程序),将其送入“冗余嵌入器”。“冗余嵌入器”在程序源码中加入5块冗余代码,确保这5块冗余代码在编译后的目标码中的长度分别为N0,N1,N2,N3,N4字节;并且做好识别标记,确保从目标码中可以准确找到这5块冗余空间,记嵌入冗余空间的源代码为P2。\n[0019] e).将P2送入到编译器,经过编译器的编译,可得到目标码O1,该目标码中具有5块冗余代码,且5块冗余代码的长度分别为N0,N1,N2,N3,N4,分别称这5块冗余代码为第0,\n1,2,3,4块冗余代码。\n[0020] f).利用“混沌替换方法”,将混沌系统模块、水印解码模块、反逆向工程模块、输入监控模块嵌入到目标码O1的非冗余代码中,并将嵌入后需要保存的信息保存到第1,2,3,4块冗余代码(即将第1,2,3,4块冗余代码覆盖)。\n[0021] g).利用“混沌散列方法”将水印信息W2嵌入到除第0,1,2,3,4冗余代码和混沌系统模块、水印解码模块、反逆向工程模块、输入监控模块的嵌入位置以外的所有代码部分,并将嵌入水印后需要保存的信息保存到第0块冗余代码(即将第0块冗余代码覆盖)。\n[0022] h).修改执行文件的头部信息,使可执行代码的开始执行位置为“输入监控模块”。\n此时得到的目标码O2即为嵌入水印后的目标码。\n[0023] 步骤a)中使用的混沌系统S为一维PWLCM混沌映射,鉴于混沌系统在数字设备上实现,不可避免地会发生退化现象。因此本发明引入另外一个混沌系统——logistic映射,使两个混沌系统互相扰动,生成混沌序列,可有效提高混沌系统的退化。\n[0024] 步骤b),c)中的“模块生成器”生成的混沌系统模块、水印解码模块、反逆向工程模块、输入监控模块。这4个模块是目标码形式的代码,嵌入到软件当中可以直接运行。对于混沌系统模块的生成,必须与步骤a)中的“混沌系统S”相匹配,且其混沌系统的初时值和控制参数直接以硬编码的形式保存在该模块中;反逆向工程模块包括反静态分析模块和反动态调试两个模块,根据用户对反逆向工程强度的需要,可使用“用户配置信息”选择不同的反逆向工程技术生成反逆向工程模块;输入监控模块的功能是监控用户输入,当用户输入的密钥与K2相匹配时,该模块激活水印解码模块,从而提取水印信息。在本发明中,K2的单项散列值保存在该模块中,将用户的输入进行单项散列,如果值相同,则认为该输入与K2相匹配,进而调用水印解码模块解码水印信息;水印解码模块的主要任务就是解码水印信息,并以可视行为提交给用户。\n[0025] 步骤d)中需要嵌入冗余代码,嵌入的冗余代码除需精确控制大小外,还需能够从编译后的目标中方便可靠地找到这些冗余代码。本发明的方法是:在代码中直接写入特殊值,这样既可以保证精确控制大小,又可以方便地从目标码中找到冗余块。\n[0026] 步骤h)中采用“混沌散列方法”完成水印信息的嵌入。该嵌入过程可分为两步:\n①迭代混沌系统,生成混沌序列,利用该序列确定水印信息的嵌入位置,使这些嵌入位置均匀散列在所有待嵌水印的代码区域;②采用“混沌替换方法”,用水印信息替换第①步中确定的嵌入位置处的代码信息。\n附图说明\n[0027] 图1本发明的水印嵌入框架图\n[0028] 图2混沌系统框架图\n[0029] 图3确定水印嵌入位置流程图\n具体实施方式\n[0030] 本发明给出了一种源码和目标码联合嵌入的软件水印方法,该方法将源码级嵌入水印与目标码级嵌入水印相结合,将软件的版权信息,用户的指纹信息嵌入到软件当中,为软件提供版权申明的功能,一旦发生盗版可以追查盗版源;通过引入反逆向工程技术,以抵抗逆向工程攻击;通过引入混沌系统,把水印信息散列编码到整个代码当中,以保护全部代码。\n[0031] 在本水印方法中,嵌入到软件当中的信息包括:混沌系统、输入监控模块、水印解码模块、反逆向工程模块、水印信息5部分。图1所示是显示本发明的基本结构方块图,其嵌入过程如下:\n[0032] 1)混沌系统S以给定的密钥K1,迭代产生混沌序列,并列用该序列对水印信息W1进行编码,得到编码后的水印信息W2,使其更适合于嵌入到程序当中,记W2的长度为N0字节。\n[0033] 2)在用户配置信息的控制下,“模块生成器”生成混沌系统模块、水印解码模块、反逆向工程模块。这里需要特别指出的是混沌系统模块必须与步骤1中的“混沌系统S”相匹配,记这三个模块的长度分别为N1,N2,N3字节。\n[0034] 3)在密钥K2的控制下,“模块生成器”生成“输入监控模块”,该监控模块中具有K2的相关信息,可以判断用户的输入是否为密钥K2,记该模块的长度为N4字节。\n[0035] 4)对于给定的程序源码P1(该程序为待嵌入水印信息的程序),将其送入“冗余嵌入器”。“冗余嵌入器”在程序源码中加入5块冗余代码,确保这5块冗余代码在编译后的目标码中的长度分别为N0,N1,N2,N3,N4字节;并且做好识别标记,确保从目标码中可以准确找到这5块冗余空间,记嵌入冗余空间的源代码为P2。\n[0036] 5)将P2送入到编译器,经过编译器的编译,可得到目标码O1,该目标码中具有5块冗余代码,且5块冗余代码的长度分别为N0,N1,N2,N3,N4,分别称这5块冗余代码为第0,1,\n2,3,4块冗余代码。\n[0037] 6)利用“混沌替换方法”,将混沌系统模块、水印解码模块、反逆向工程模块、输入监控模块嵌入到目标码O1的非冗余代码中,并将嵌入后需要保存的信息保存到第1,2,3,4块冗余代码(即将第1,2,3,4块冗余代码覆盖)。\n[0038] 7)利用“混沌散列方法”将水印信息W2嵌入到除第0,1,2,3,4冗余代码和混沌系统模块、水印解码模块、反逆向工程模块、输入监控模块的嵌入位置以外的所有代码部分,并将嵌入水印后需要保存的信息保存到第0块冗余代码(即将第0块冗余代码覆盖)。\n[0039] 8)修改执行文件的头部信息,使可执行代码的开始执行位置为“输入监控模块”。\n此时得到的目标码O2即为嵌入水印后的目标码。\n[0040] 1、混沌系统\n[0041] 本发明的水印信息编码、混沌散列方法、混沌替换方法中都用到了混沌系统,因此选择一个计算简单、混沌性质好的混沌系统尤为重要。众所周知,混沌系统在数字化设备上实现时,不可避免地带来其动力学特性退化的问题。一般来说,要解决这一问题,可以从两方面着手:①提高数字化设备的运算精度;②对混沌系统进行扰动,防止其进入短周期或不动点。\n[0042] 在本发明中,要求混沌系统在普通计算机上实现,如果要提高计算机的计算精度,必然带来巨大的运算量,因此本发明从对混沌系统增加扰动的角度来防止其动力学特性的退化。本发明使用双混沌相互扰动的策略实现数字化混沌,其基本框架如图2所示,该系统包括主混沌和影子混沌两个混沌系统。其中,主混沌系统为一维线性混沌映射,其方程式为(1)。\n[0043] \n[0044] 其中,l∈Z+是的映射的分段参数,i∈{0,1,2,Λ,l-1}。\n[0045] 影子混沌系统为Logistic映射,其方程为式(2),其中b ∈(3.6,4]为Logistic的参数。\n[0046] x(t+1)=bx(1-x) (2)\n[0047] 一维线性混沌映射对Logistic映射的扰动方法如式(3):\n[0048] x′L=(xL+xY10-5)mod1 (3)\n[0049] 其中xL是Logistic映射的当前状态,xY是一维线性混沌映射的当前状态,x′L是扰动之后的Logistic映射的状态。\n[0050] Logistic映射对一维线性混沌映射的扰动方案如式(4):\n[0051] x′Y=(xY+xL10-3)mod1 (4)\n[0052] 其中xY是Logistic映射的当前状态,xL是一维线性混沌映射的当前状态,x′Y是扰动之后的Logistic映射的状态。\n[0053] 2、水印编码\n[0054] 本发明的水印信息经过编码后再嵌入到软件当中,该编码过程主要是为了是水印信息的0,1比例均匀。现给出该编码方法:\n[0055] 将水印信息按8bit分割,记分割后的水印信息为W=(w1,w2,Λ,wn),则wi∈{0,\n1,2,Λ,255};生成长度为n的混沌序列S=(s1,s2,Λ,sn),其中si∈(0,1),则该编码过程为:\n[0056] \n[0057] 3、模块生成器\n[0058] 模块生成器的主要功能是依据用户的配置文件,构造混沌系统模块、水印解码模块、反逆向工程模块、输入监控模块,这4个模块是可执行代码形式的模块。本发明使用汇编语言直接编写这些模块,并将编译后的结果作为待嵌入信息嵌入到软件当中。但是,在使用汇编语言编写时遇到两个问题:\n[0059] ①当各模块被嵌入到不同的可执行文件中后,各模块代码及数据加载到内存的位置不同,代码在执行过程中无法找到代码及数据的正确位置,必须进行自定位。\n[0060] ②嵌入水印后代码不重新编译,故无法通过编译器、加载器自动找到各模块中使用的Windows API的地址,需要各模块自己获取Windows API的地址。\n[0061] 本文发明使用如下技术来解决这两个问题:\n[0062] ①代码及数据的自定位可通过call/pop/sub指令实现,具体代码(Win32汇编语言编写)如图3,ebx是实际加载地址与设计预期地址的偏差。数据或代码的设计预期地址与ebx之和就是其实际地址,即可实现自定位。\n[0063] ②Windows API的地址可通过如下方法获取:\n[0064] 首先,获得kernel32.dll的加载基址。Windows系统提供了线程之间独立的异常处理方法——结构化异常处理。系统把所有异常处理函数挂在一个链表上,链表的最后一个元素是系统默认异常处理函数,该函数在kernel32.dll模块中。通过遍历异常处理链表,得到系统默认异常处理函数的地址,从该地址的页边界对齐地址开始,以页粒度向低地址搜寻,便可找到kernel32.dll的加载基址。\n[0065] 其次,通过kernel32.dll的导出表获得Windows API函数GetProcAddress、LoadLibrary的地址。\n[0066] 最后,通过GetProcAddress、LoadLibrary得到任意DLL模块导出的任意函数的地址。\n[0067] 下面分别描述混沌系统模块、水印解码模块、反逆向工程模块、输入监控模块:\n[0068] 混沌系统模块:\n[0069] 该模块用于水印提取时生成混沌序列,与图1中“混沌系统S”的功能相同。\n[0070] 水印解码模块:\n[0071] 该模块用于水印提取时对水印进行解码,是图1中“水印编码器”逆运算的实现。\n[0072] 反逆向工程模块:\n[0073] 该模块用于抵抗嵌入水印后的软件被逆向分析。该模块设计的原则是延长逆向工程所需的时间,使其在时间上不可行,或使攻击者在逆向工程上耗费的代价大于通过逆向工程所得到的利益。逆向工程技术可以分为静态分析和动态跟踪两类,因此该模块分为反静态分析模块和反动态跟踪模块。\n[0074] 静态分析的基础是反汇编,因此可以从扰乱反汇编入手抵抗静态分析。一般而言,程序的代码和数据是分离的,反汇编工具就是基于此设计的。基于冯.诺依曼体系的计算机不区分数据和指令,所以可以采用指令和数据混和的技术扰乱反汇编。在指令之间加入一些特定数据(花指令),就会扰乱正常反汇编,从而达到抵抗静态分析的目的。\n[0075] 本发明在实现中把花指令插入到输入监控模块、反逆向工程模块、水印解码模块当中。进一步完善的实现还可把代码加密、压缩等反静态分析技术运用到该模块当中,这将可以进一步增强其抗静态分析的能力。\n[0076] 动态跟踪高度依赖于调试工具。模仿杀毒软件杀毒的原理,寻找各调试工具的特征,基于此特征检测程序是否正在被调试,若正在被调试,把程序引导到错误的控制流上,阻止调试工具对程序的动态跟踪。本文在方法实现时基于SoftICE、Windbg、Ollydbg的特征实现了反跟踪,实验表明可以有效抵抗利用这些调试工具的跟踪。进一步完善的方法实现可以基于更多的调试器特征实现反动态跟踪。\n[0077] i386体系的处理器集成了硬件寄存器专门提供对调试的支持,一些优秀的调试工具利用这些调试寄存器设计了逆向工程中实用的功能,如BPM功能,硬件断点等。本文在方法实现中通过修改调试寄存器而使调试器的BPM功能、硬件断点功能失效。此外,本文在方法实现中还加入了时间敏感代码(一般而言,程序被调试时执行的时间远远大于程序正常执行的时间,据此可以设计时间敏感代码实现反动态跟踪)、断点检测(检测代码中是否被设置断点,如果设置了断点可修改断点设置位置,使断点设置失败)的反动态跟踪技术。\n[0078] 本发明实现了一些反逆向工程技术,值得强调的是,该模块是开放模块,可以添加更多更有效的反逆向工程技术,从而不断提高水印对逆向工程攻击的抵抗性。\n[0079] 输入监控模块:\n[0080] 该模块通过Hook键盘消息监控用户的输入,对用户的输入计算散列值,如果散列值与K2的散列值相同,则启动水印解码模块。\n[0081] 4、冗余嵌入器\n[0082] 模块生成器需要嵌入冗余代码,嵌入的冗余代码除需精确控制大小外,还需能够从编译后的目标中方便可靠地寻找出这些冗余代码。在本发明的方法是:在代码中直接写入特殊值,这样既可以保证精确控制大小,又可以方便地从目标码中找到冗余块。\n[0083] 5、编译器\n[0084] 编译器采用可以编译源码P1的通用编译器。例如,如果是P1是C语言源码,则编译器可以采用任意可对C语言进行编译的编译器。\n[0085] 6、混沌替换方法\n[0086] 采用混沌替换方法完成嵌入水印提取器模块、反逆向工程模块、输入监控模块,并保存被覆盖后的代码以备恢复代码时使用。以c替换i为例说明其过程如下(c,i是8-bit的整数,G是步骤a)中的数字化混沌系统):\n[0087] 替换之后原来存储i的位置存储c,并保存s以备恢复i。则该过程既是计算s的过程,本文\n[0088] 不是一般性,设混沌系统的状态x∈(0,1),混沌替换方法见式(6)。\n[0089] \n[0090] 其中:\n[0091] \n[0092] x为混沌系统的当前状态,G(c)(x)表示混沌系统以x为初值,迭代c次之后的混沌系统的状态。\n[0093] 混沌替换方法的逆过程是用c和s恢复i: 即:\n[0094] \n[0095] 一般地,对于集合A={a1,a2,Λ,ak}使用混沌替换方法替换B={b1,b2,Λ,bk},得:\n[0096] \n[0097] 其中j=1,2,Λ,k。其逆过程记为:\n[0098] \n[0099] 7、混沌散列方法\n[0100] 采用“混沌散列”完成水印信息的潜入。该嵌入过程可分为两步:①迭代混沌系统,生成混沌序列,利用该序列确定水印信息的嵌入位置;②采用“混沌替换”,用水印信息替换第①步中确定的嵌入位置处的代码。\n[0101] 下面详述通过混沌序列确定水印嵌入位置的方法。为了方便描述,设水印信息的长度为L,代码区域的长度为N,则选择位置的过程即为从{1,2,…,N}中随即选择L个数,则该选择过程如下:\n[0102] ①初始化数组A,设置A的长度为N,且A[k]=k,其中k=1,2,3,…,N;\n[0103] ②置i←0;\n[0104] ③迭代混沌系统,得到其当前状态x;\n[0105] ④置\n[0106] ⑤交换A[i]和A[j];\n[0107] ⑥i←i+1;\n[0108] ⑦如果i≤N,转到③;\n[0109] ⑧数组A的前L个数即是所确定的水印的嵌入位置,即A[0],A[1],…,A[L-1]分别是L个水印分量的嵌入位置。\n[0110] 8、修改头部信息\n[0111] 修改执行文件的头部信息,使可执行代码的开始执行位置为“输入监控模块”。此时得到的目标码O2即为嵌入水印后的目标码。
法律信息
- 2014-02-19
未缴年费专利权终止
IPC(主分类): G06F 21/22
专利号: ZL 200810188310.5
申请日: 2008.12.25
授权公告日: 2011.05.18
- 2011-05-18
- 2009-09-02
- 2009-07-08
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有引用任何外部专利数据! |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |