发明名称 源码和目标码联合嵌入的软件水印方法
摘要 本发明属于软件保护领域,是将数字水印的技术思想应用于软件保护领域而产生的一种可对软件的版权实施保护的技术方案。该发明针对Windows系统中的PE文件格式而设计,充分利用软件本身可执行的特点,将水印的提取器嵌入在软件当中,采用源码和目标码联合嵌入的策略,将软件的版权信息,用户的指纹信息嵌入到软件当中,为软件提供版权申明的功能,一旦发生盗版可以追查盗版源。该技术方案通过引入反逆向工程技术,以抵抗水印的抗逆向工程攻击能力;通过引入混沌系统,把水印信息散列编码到整个代码当中,以保护全部代码。
申请公布号 CN101477610B 申请公布日期 2011.05.18
申请号 CN200810188310.5 申请日期 2008.12.25
申请人 中国人民解放军信息工程大学 发明人 芦斌;郑俊杰;刘粉林;孙怡峰;葛辛;王唯
分类号 G06F21/22(2006.01)I;G06N7/08(2006.01)I 主分类号 G06F21/22(2006.01)I
代理机构 代理人
主权项 1.一种源码和目标码联合嵌入的软件水印方法,将混沌系统、输入监控模块、水印解码模块、反逆向工程模块、水印信息嵌入到软件当中,其特征在于,包括以下步骤:a)混沌系统以给定的密钥K<sub>1</sub>,迭代产生混沌序列,并列用该序列对水印信息W<sub>1</sub>进行编码,得到编码后的水印信息W<sub>2</sub>,使其更适合于嵌入到程序当中,记W<sub>2</sub>的长度为N<sub>0</sub>字节,所述混沌系统包括主混沌系统和影子混沌两个混沌系统,其中主混沌系统为一维PWLCM混沌映射:<maths num="0001"><![CDATA[<math><mrow><mi>x</mi><mrow><mo>(</mo><mi>t</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow><mo>=</mo><mfenced open='{' close=''><mtable><mtr><mtd><mfrac><mrow><mi>x</mi><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>-</mo><mi>ip</mi><mo>/</mo><mi>l</mi></mrow><mrow><mi>p</mi><mo>/</mo><mi>l</mi></mrow></mfrac><mo>;</mo></mtd><mtd><mfrac><mi>ip</mi><mi>l</mi></mfrac><mo>&le;</mo><mi>x</mi><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>&le;</mo><mfrac><mrow><mrow><mo>(</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow><mi>p</mi></mrow><mi>l</mi></mfrac></mtd></mtr><mtr><mtd><mfrac><mrow><mi>x</mi><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>-</mo><mrow><mo>(</mo><mi>p</mi><mo>+</mo><mi>i</mi><mrow><mo>(</mo><mn>0.5</mn><mo>-</mo><mi>p</mi><mo>)</mo></mrow><mo>/</mo><mi>l</mi><mo>)</mo></mrow></mrow><mrow><mrow><mo>(</mo><mn>0.5</mn><mo>-</mo><mi>p</mi><mo>)</mo></mrow><mo>/</mo><mi>l</mi></mrow></mfrac><mo>;</mo></mtd><mtd><mi>p</mi><mo>+</mo><mfrac><mrow><mi>i</mi><mrow><mo>(</mo><mn>0.5</mn><mo>-</mo><mi>p</mi><mo>)</mo></mrow></mrow><mi>l</mi></mfrac><mo>&le;</mo><mi>x</mi><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>&le;</mo><mi>p</mi><mo>+</mo><mfrac><mrow><mrow><mo>(</mo><mi>i</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow><mrow><mo>(</mo><mn>0.5</mn><mo>-</mo><mi>p</mi><mo>)</mo></mrow></mrow><mi>l</mi></mfrac></mtd></mtr><mtr><mtd><mn>0</mn><mo>;</mo></mtd><mtd><mi>x</mi><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>=</mo><mn>0.5</mn></mtd></mtr><mtr><mtd><mi>F</mi><mrow><mo>(</mo><mn>1</mn><mo>-</mo><mi>x</mi><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>,</mo><mi>p</mi><mo>)</mo></mrow><mo>;</mo></mtd><mtd><mn>0.5</mn><mo>&lt;</mo><mi>x</mi><mrow><mo>(</mo><mi>t</mi><mo>)</mo></mrow><mo>&lt;</mo><mn>1.0</mn></mtd></mtr></mtable></mfenced></mrow></math>]]></maths>其中,l∈Z<sup>+</sup>是的映射的分段参数,i∈{0,1,2,…,l-1};影子混沌系统为Logistic映射,其方程为下式,其中b∈(3.6,4]为Logistic的参数:x(t+1)=bx(1-x)所述混沌系统采用一维PWLCM混沌映射与Logistic映射互相扰动,生成混沌序列,其中,一维PWLCM混沌映射对Logistic映射的扰动方法如下式:x′<sub>L</sub>=(x<sub>L</sub>+x<sub>Y</sub>10<sup>-5</sup>)mod1其中x<sub>L</sub>是Logistic映射的当前状态,x<sub>Y</sub>是一维PWLCM混沌映射的当前状态,x′<sub>L</sub>是扰动之后的Logistic映射的状态;Logistic映射对一维PWLCM混沌映射的扰动方案如下式:x′<sub>Y</sub>=(x<sub>Y</sub>+x<sub>L</sub>10<sup>-3</sup>)mod1其中x<sub>Y</sub>是Logistic映射的当前状态,x<sub>L</sub>是一维PWLCM混沌映射的当前状态,x′<sub>Y</sub>是扰动之后的Logistic映射的状态;b)在用户配置信息的控制下,模块生成器生成混沌系统模块、水印解码模块、反逆向工程模块,将这三个模块的长度分别记为N<sub>1</sub>,N<sub>2</sub>,N<sub>3</sub>字节;c)所述模块生成器利用密钥K<sub>2</sub>生成输入监控模块,该监控模块中具有K<sub>2</sub>的相关信息,可以判断用户的输入是否为密钥K<sub>2</sub>,将该模块的长度记为N<sub>4</sub>字节;d)对于待嵌入水印信息的程序所给定的程序源码P<sub>1</sub>,将其送入冗余嵌入器,冗余嵌入器在程序源码中加入5块冗余代码,确保这5块冗余代码在编译后的目标码中的长度分别为N<sub>0</sub>,N<sub>1</sub>,N<sub>2</sub>,N<sub>3</sub>,N<sub>4</sub>字节,并且做好识别标记,确保从目标码中可以准确找到这5块冗余空间,记嵌入冗余空间的源代码为P<sub>2</sub>;e)将P<sub>2</sub>送入到编译器,经过编译器的编译,可得到目标码O<sub>1</sub>,该目标码中具有5块冗余代码,且5块冗余代码的长度分别为N<sub>0</sub>,N<sub>1</sub>,N<sub>2</sub>,N<sub>3</sub>,N<sub>4</sub>,分别称这5块冗余代码为第0,1,2,3,4块冗余代码;f)利用混沌替换,将混沌系统模块、水印解码模块、反逆向工程模块、输入监控模块嵌入到目标码O<sub>1</sub>的非冗余代码中,并将嵌入后需要保存的信息保存到第1,2,3,4块冗余代码,即将第1,2,3,4块冗余代码覆盖;g)利用混沌系统生成的混沌序列,将编码后的水印信息W<sub>2</sub>,利用混沌散列嵌入到除第0,1,2,3,4冗余代码和混沌系统模块、水印解码模块、反逆向工程模块、输入监控模块的嵌入位置以外的所有代码部分,并将嵌入水印后需要保存的信息保存到第0块冗余代码,即将第0块冗余代码覆盖;h)修改执行文件的头部信息,使可执行代码的开始执行位置为输入监控模块,此时得到的目标码O<sub>2</sub>即为嵌入水印后的目标码;其中步骤d)中的冗余代码的嵌入,采用在代码中直接写入特殊值,以精确控制大小,并从目标码中找到冗余块;其中步骤f)中采用的混沌替换将混沌系统模块、水印解码模块、反逆向工程模块、输入监控模块嵌入到软件当中,并保存被覆盖后的代码以备恢复代码时使用;c,i是8-bit的整数,G是步骤a)中的数字化混沌系统,替换之后原来存储i的位置存储c,并保存s以备恢复i,其计算s的过程为:<img file="FSB00000394207800021.GIF" wi="858" he="125" />其中,x∈[0,1)为混沌系统的当前状态,G<sup>(c)</sup>(x)表示混沌系统以x为初值,迭代c次之后的混沌系统的状态,<img file="FSB00000394207800022.GIF" wi="37" he="37" />为模2加;其中,混沌替换方法的逆过程是用c和s恢复i:<img file="FSB00000394207800023.GIF" wi="282" he="55" /><maths num="0002"><![CDATA[<math><mrow><mi>i</mi><mo>=</mo><mo>&PartialD;</mo><mrow><mo>(</mo><mi>i</mi><mo>,</mo><mi>c</mi><mo>,</mo><mi>G</mi><mo>)</mo></mrow><mo>=</mo><mi>s</mi><mo>&CirclePlus;</mo><munderover><mi>&Sigma;</mi><mrow><mi>k</mi><mo>=</mo><mn>1</mn></mrow><mn>8</mn></munderover><msub><mi>y</mi><mi>k</mi></msub></mrow></math>]]></maths><img file="FSB00000394207800025.GIF" wi="480" he="71" />x为混沌系统的当前状态,G<sup>(c)</sup>(x)表示混沌系统以x为初值,迭代c次之后的混沌系统的状态;对于集合A={a<sub>1</sub>,a<sub>2</sub>,…,a<sub>k</sub>}使用混沌替换方法替换B={b<sub>1</sub>,b<sub>2</sub>,…,b<sub>k</sub>},得:<maths num="0003"><![CDATA[<math><mrow><mi>R</mi><mo>=</mo><mo>{</mo><msub><mi>r</mi><mi>j</mi></msub><mo>}</mo><mo>=</mo><mo>&PartialD;</mo><mrow><mo>(</mo><mi>B</mi><mo>,</mo><mi>A</mi><mo>,</mo><mi>G</mi><mo>)</mo></mrow><mo>=</mo><mo>{</mo><mo>&PartialD;</mo><mrow><mo>(</mo><msub><mi>b</mi><mi>j</mi></msub><mo>,</mo><msub><mi>a</mi><mi>j</mi></msub><mo>,</mo><mi>G</mi><mo>)</mo></mrow><mo>}</mo></mrow></math>]]></maths>其中j=1,2,…,k。其逆过程记为:<maths num="0004"><![CDATA[<math><mrow><mi>B</mi><mo>=</mo><msup><mo>&PartialD;</mo><mrow><mo>-</mo><mn>1</mn></mrow></msup><mrow><mo>(</mo><mi>R</mi><mo>,</mo><mi>A</mi><mo>,</mo><mi>G</mi><mo>)</mo></mrow><mo>.</mo></mrow></math>]]></maths>
地址 450002 河南省郑州市金水区俭学街1001信箱