一种用于代码溯源的程序水印嵌入和提取方法及系统

文档序号:35696584发布日期:2023-10-11 19:33阅读:59来源:国知局
一种用于代码溯源的程序水印嵌入和提取方法及系统

本发明涉及代码溯源的,尤其涉及一种用于代码溯源的程序水印嵌入和提取方法及系统。


背景技术:

1、随着计算机行业的飞速发展,人们的生活发生了巨大的变化。计算机科学技术已经在各个行业广泛使用,各种各样用于娱乐、工作、学习、生活的软件层出不穷。然而,在带了便利的的同时,软件的广泛使用也带了许多版权问题。大量软件被克隆、分析等方式盗用并非法传播,许多靠盗版软件盈利和窃取用户信息的行为越来越猖狂,因此如何保护软件的版权成为了一个亟待解决的问题。

2、随着软件版权问题的日益严重,软件水印这一软件保护方法成为了研究的热点。一直以来,软件水印研究领域,在国内外的专家和研究学者的努力之下,在软件水印技术方面的研究已取得一定的研究成果,各种软件水印保护技术已逐步运用到软件行业当中。

3、软件水印保护技术作为解决软件版权保护问题的热门方法,目前仍处于研究中的探索阶段,在实际应用中存在一些问题:很多方法都是对被保护软件进行整体分析,忽略了软件中局部代码被复用的情况;动态水印方法需要执行代码来实现软件保护,有些甚至需要多次执行,不适用于执行代价较大的程序;一些方法添加与源代码完全无关的自由变量来添加语句,隐蔽性差,水印信息容易被篡改;而基于特征的水印方法需要依赖源代码才能获取特征作对比。

4、针对以上问题,本发明提出一种通过关键节点建立水印与源程序之间的依赖关系的程序水印嵌入和提取方法。对于现实中可能存在的代码泄漏被重复利用的问题,本方法可以在源代码中通过关键节点嵌入用户信息,提高隐蔽性,将用户信息与源代码建立依赖关系,若后续存在代码泄漏的情况,可以通过水印提取,追溯到泄漏的源头,找到被泄露代码对应的用户,不需要依赖源代码。


技术实现思路

1、本部分的目的在于概述本发明的实施例的一些方面以及简要介绍一些较佳实施例。在本部分以及本技术的说明书摘要和发明名称中可能会做些简化或省略以避免使本部分、说明书摘要和发明名称的目的模糊,而这种简化或省略不能用于限制本发明的范围。

2、鉴于上述现有存在的问题,提出了本发明。

3、因此,本发明目的是提供一种用于代码溯源的程序水印嵌入和提取方法,解决目前软件水印保护技术在实际运用中忽略了软件中局部代码被复用的情况、不适用于执行代价较大的程序、隐蔽性差、水印信息容易被篡改以及无法摆脱源代码获取特征作对比的问题。

4、为解决上述技术问题,本发明提供如下技术方案:

5、第一方面,本发明实施例提供了一种用于代码溯源的程序水印嵌入和提取方法方法,包括:

6、将源代码以函数为单位,构建函数调用图;

7、按照逆拓扑排序遍历所述函数调用图,将存在调用关系的函数划分为一个代码块并对所述每一个代码块进行信息流分析得到所述代码块中的信息流关系;

8、基于代码块的抽象语法树、控制流图以及程序依赖图构建源程序的代码属性图;

9、根据所述代码块中的信息流关系和所述代码属性图形成程序联合属性图;

10、对所述程序联合属性图中变量节点的关系边数进行计算并选取关键节点;

11、根据所述关键节点和用户身份信息嵌入水印;

12、将所述关键节点作为依据进行前向程序切片和后向程序的双向程序切片,并根据水印提取规则提取水印。

13、作为本发明所述的一种用于代码溯源的程序水印嵌入和提取方法方法,其中:对所述每一个代码块进行信息流分析得到所述代码块中的信息流关系包括,

14、获取变量与变量、变量与表达式、表达式与变量的关系;

15、其中,设定g(s)为语句s的控制流图,v、v1和v2为变量,e为表达式;

16、则变量与变量的关系λ如下:

17、若v1在g(s)的入口的值,参与计算g(s)中e的值,且e的值用于确定v2在g(s)的出口的值,则称v1和v2具有λ关系,设定v1λv2=1;

18、若v1在g(s)的入口的值不参与v2在g(s)的出口的值的计算,则设定v1λv2=0;

19、变量与表达式的关系ρ如下:

20、若v在g(s)入口处的值,参与计算g(s)中e的值,则称v和e具有ρ关系,设定vρe=1;

21、若v在g(s)入口处的值,不参与计算g(s)中e的值,则设定vρe=0;

22、表达式与变量的关系μ如下:

23、若e参与v在g(s)出口处值的计算,则e和v具有关系μ,设定eμv=1;

24、若e不参与v在g(s)出口处值的计算,则设定eμv=0。

25、作为本发明所述的一种用于代码溯源的程序水印嵌入和提取方法方法,其中:根据所述代码块中的信息流关系和所述代码属性图形成程序联合属性图包括在所述代码属性图上增加表示信息流关系的边和函数调用边,构成程序联合属性图。

26、作为本发明所述的一种用于代码溯源的程序水印嵌入和提取方法方法,其中:对所述程序联合属性图中变量节点的关系边数进行计算并选取边关系最多的节点作为关键节点包括,

27、将图中变量节点的关系边数作为重要度imp(a)的度量标准,计算所述程序联合属性图中每个变量节点的关系边数sume(a),得到imp(a)=sume(a);

28、选取边关系最多的节点作为关键节点key;

29、其中,若存在多个节点重要度相等的情况,则检查几个节点之间是否存在λ关系;

30、若存在存在λ关系,则根据所述λ关系选取关键节点;

31、否则选取程序中最先出现的节点作为关键节点。

32、作为本发明所述的一种用于代码溯源的程序水印嵌入和提取方法方法,其中:根据所述关键节点和用户身份信息嵌入水印包括,

33、采用二进制身份码表示分发到的用户身份;

34、根据所述关键节点的控制流关系表示水印开始,数据流关系表示水印结束和身份码;

35、通过不影响程序的控制流和数据流语句与所述关键节点建立依赖关系表示水印信息,保证进行水印提取时通过程序切片提取到水印信息;

36、在水印中添加水印开始与结束的标志,便于水印提取;

37、选取合适的位置嵌入水印信息:

38、遍历代码块寻找关键节点;

39、在所述关键节点之后嵌入水印信息;

40、寻找分支语句,并避开循环体减少程序运行时不必要的消耗。

41、作为本发明所述的一种用于代码溯源的程序水印嵌入和提取方法方法,其中:寻找分支语句,并避开循环体减少程序运行时不必要的消耗包括,

42、若有分支语句,则将水印嵌入分支语句中;

43、否则,构造一个分支语句嵌入水印;

44、记录每个用户对应的水印嵌入信息并作为水印库用于对比;

45、其中,所述水印库中包含用户身份码和对应的嵌入语句。

46、作为本发明所述的一种用于代码溯源的程序水印嵌入和提取方法方法,其中:将所述关键节点作为依据进行前向程序切片和后向程序的双向程序切片,并根据水印提取规则提取水印包括,

47、检测待检测所述水印开始与结束的标志,截取水印开始标志与水印结束标志之间的代码段做分析,并通过语句得到关键节点;

48、若无法成功找到标志,则遍历代码;

49、由控制依赖和数据依赖得到代码段的程序依赖图;

50、以关键节点为依据进行双向程序切片,取前向切片与后向切片结果的并集;

51、检测切片结果,根据水印匹配规则提取水印。

52、第二方面,本发明实施例提供了一种用于代码溯源的程序水印嵌入和提取方法系统,包括,

53、程序联合属性图构建模块,将源代码以函数为单位,构建函数调用图;

54、按照逆拓扑排序遍历函数调用图,将存在调用关系的函数划分为一个代码块并对所述每一个代码块进行信息流分析得到所述代码块中的信息流关系;

55、基于代码块的抽象语法树、控制流图以及程序依赖图构建源程序的代码属性图;

56、根据所述代码块中的信息流关系和所述代码属性图形成程序联合属性图;

57、关键节点选取模块,对所述程序联合属性图中变量节点的关系边数进行计算并选取关键节点;

58、水印嵌入模块,根据所述关键节点和用户身份信息嵌入水印;

59、水印提取模块,将所述关键节点作为依据进行前向程序切片和后向程序的双向程序切片,并根据水印提取规则提取水印。

60、第三方面,本发明实施例提供了一种计算设备,包括:

61、存储器和处理器;

62、所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令,当所述一个或多个程序被所述一个或多个处理器执行,使得所述一个或多个处理器实现如本发明任一实施例所述的一种用于代码溯源的程序水印嵌入和提取方法方法。

63、第四方面,本发明实施例提供了一种计算机可读存储介质,其存储有计算机可执行指令,该计算机可执行指令被处理器执行时实现所述一种用于代码溯源的程序水印嵌入和提取方法方法。

64、本发明的有益效果:本发明提供的方法,在源代码中分布嵌入水印,减小因截取片段而损失水印的风险,通过关键节点的控制依赖关系与数据依赖关系嵌入水印,能够加强水印与源代码之间的依赖关系并提高隐蔽性,降低在静态分析中被发现的风险,根据水印提取方法,不需要依赖源代码也能提取到水印信息。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1