首页> 中国专利> 基于动态关键指令序列胎记的软件抄袭检测方法

基于动态关键指令序列胎记的软件抄袭检测方法

摘要

本发明提出了一种基于动态关键指令序列胎记的软件抄袭检测方法,包括:1)基于动态插桩对待分析的程序进行监控,结合动态污点分析,实时地对关键指令进行识别和记录;2)对记录的关键指令序列进行预处理,剥离操作数,抽取助记符序列;3)在此基础之上为待检测的两个软件分别生成其动态关键指令序列胎记;4)计算胎记的相似性;5)通过胎记相似性的均值及给定的阈值,做出抄袭与否的决策。该方法直接针对二进制代码,无需源码存在,更具有现实意义;检测手段不依赖于特定平台或编程语言,具有更广阔的应用范围;对于语义保留的代码混淆技术具有很好的抵抗力,提高了对深度抄袭的检测能力。

著录项

  • 公开/公告号CN103577323A

    专利类型发明专利

  • 公开/公告日2014-02-12

    原文格式PDF

  • 申请/专利权人 西安交通大学;

    申请/专利号CN201310449858.1

  • 发明设计人 郑庆华;田振洲;刘烃;范铭;

    申请日2013-09-27

  • 分类号G06F11/36(20060101);

  • 代理机构61200 西安通大专利代理有限责任公司;

  • 代理人汪人和

  • 地址 710049 陕西省西安市咸宁西路28号

  • 入库时间 2024-02-19 22:40:22

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2016-03-30

    授权

    授权

  • 2014-03-12

    实质审查的生效 IPC(主分类):G06F11/36 申请日:20130927

    实质审查的生效

  • 2014-02-12

    公开

    公开

说明书

技术领域:

本发明涉及程序特征发现及软件抄袭检测领域,特别涉及一种基于动态软件胎记的抄袭检测方法。 

背景技术:

自由或开源软件项目允许用户在遵守License的情况下使用、修改或者发布软件,比如GPL公共许可作为最广泛使用的自由软件的许可,它允许用户可以自由的修改软件,但要求基于GPL程序的演绎作品也要服从GPL,比如gcc及Linux核心都遵从GPL。这一方面促进了软件工业的大力发展。另一方面一些公司为了自身利益,违背软件的许可而私自的将开源软件的代码集成到自己的商业产品中;当然还存在一些公司,特别是大公司,它们经常接收来自上游公司的一些软件组件以集成到自己项目中,而这些组件通常是以二进制代码的形式提交的,很难保证其中不包含第三方代码。这在很大程度上对大公司的利益构成了威胁,经常看到软件侵权事件的发生。由于很多软件开发人员的代码保护意识不强,行业道德参差不齐,再加上越来越强大的自动化代码混淆工具的出现,使得软件抄袭的现象越来越严重;同时很多情况下特别是商业软件都是以二进制形式发布的,通常无法获取源码的,这使得软件抄袭的检测更加困难,也使得抄袭现象更加猖獗。 

为此人们提出了一系列手段防止及检测软件抄袭。其中软件水印是出现比较早的一种抄袭检测技术,它通过在软件发布之前在其中植入特定的水印标记,这 种标记很容易验证但较难被破坏,尽管它不能防止软件抄袭,但在对抄袭软件提起法律诉讼的时候可以作为有力证据,不过Collberg等人认为“一个有决心的攻击者始终能够破坏任何的水印”。因为采用水印的话需要植入额外的代码,所以很多开发人员并不使用水印,而是采用代码混淆技术,使得代码晦涩难懂。然而代码混淆仅仅能防止其他人员难以理解程序的逻辑,无法阻止抄袭人员实现完成的拷贝,而且抄袭人员可以反过来利用混淆技术对代码进行进一步的混淆,以躲避抄袭的嫌疑,毕竟现在自动化源码及二进制代码的混淆工具变得越来越强大。 

最近人们提出基于软件胎记的抄袭检测技术,软件胎记是能够反映程序固有属性的可以唯一标识程序的特征,相关的研究都是通过将抄袭检测转换为两个程序的相似性分析问题,并基于胎记的相似性计算来衡量程序的相似性,关键技术主要涉及到高质量的软件胎记的提取及其相似性计算过程。根据其胎记生成方式,可以分为静态及动态两种。前者主要是基于程序的语法特性而非语义特性,很容易遭受语义保留混淆技术的蒙骗;动态软件胎记则是在程序执行过程中提取出来的,它依赖于程序的运行时行为,反映了程序对输入的处理方式,更多程度上是程序语义的反映。尽管现有研究在一定程度上解决了抄袭检测的问题,但还存在一系列的局限性:1)大部分已有的软件胎记难以应付深度的代码混淆技术;2)很多方法是基于源代码的,而在无确凿证据之前,通常只能获取可疑程序的二进制代码;3)大部分的软件胎记依赖于特定的操作系统或者编程语言,适用范围较小。 

因此针对以上问题,需要找到一种更好的检测软件抄袭的方法。它应当能够直接操作二进制程序,不依赖于特定平台、系统或编程语言,同时对当下流行的各种自动化代码混淆工具具有很高的抵抗能力。 

发明内容:

本发明主要目的在于提出一种基于动态关键指令序列胎记的软件抄袭检测方法,以克服上述当前基于胎记的抄袭检测手段的局限性。 

本发明的目的通过以下技术方案实现: 

基于动态关键指令序列胎记的软件抄袭检测方法,包括如下步骤: 

1)基于动态插桩技术,对待分析程序实施运行时监控;同时结合数据流分析,进行动态关键指令的识别和记录,生成动态关键指令序列; 

2)对抽取的动态关键指令序列进行预处理,剥离操作数,生成助记符序列; 

3)基于助记符序列,利用k-gram算法,分别为待分析的第一程序及第二程序生成动态关键指令序列胎记; 

4)进行第一程序及第二程序胎记相似性的计算; 

5)依据多次输入下生成的胎记相似性的均值,及给定的阈值判断是否抄袭。 

本发明进一步的改进在于:所述步骤1)中动态关键指令定义及识别原则为:令trace(p,I)表示程序p在输入I下的一条执行trace,对于该trace中的任一条汇编指令ins,当满足如下两个条件时,认为ins是程序p在输入I下的一条关键指令,即a)ins属于值更新指令b)ins属于输入关联指令。 

本发明进一步的改进在于:所述步骤1)中监控实施方法为:针对二进制的待分析程序,使用动态插桩技术,在待分析程序的每条指令执行之前植入相应的分析代码,实现运行时监控,捕获指令级执行信息。 

本发明进一步的改进在于:所述步骤1)中关键指令序列生成方法为:通过指令级的运行时监控,捕获每一条待执行的汇编指令,分析该指令的类型,是否 为值更新指令;同时结合动态污点分析技术,通过污点源的识别及污点信息的传播扩散,辅助识别输入关联指令;最后根据分析结果,对关键指令进行记录,将其加入动态关键指令序列,否则不进行记录。 

本发明进一步的改进在于:所述步骤1)具体包括以下步骤: 

步骤S201:判断是否还存在待执行的指令,如果有则跳至步骤S202,否则直接转入步骤S208; 

步骤S202:对于待分析的指令,解析指令类型,判断其是否为污点传播指令,如果是则转入步骤S203,否则转入步骤S204; 

步骤S203:依据预定义的污点传播规则,进行污点数据的扩散传播; 

步骤S204:对指令进行解析,据其操作符判断是否为值更新指令;如果是则转入步骤S205,不是则转入步骤S207; 

步骤S205:根据污点的扩散状态,识别该指令是否为输入关联指令;如果为输入关联指令则转入步骤S206,否则转入步骤S207; 

步骤S206:识别出该指令为关键指令,并将之加入动态关键指令序列中; 

步骤S207:执行该指令,并转入步骤S201进行下一轮的分析; 

步骤S208:输出动态关键指令序列。 

本发明进一步的改进在于:所述步骤2)中指令序列预处理方法为:对抽取的关键指令序列中的每条汇编指令,解析其语法结构,剥离其操作数,保留其助记符,生成相应的助记符序列。 

本发明进一步的改进在于:所述步骤2)具体包括以下步骤: 

步骤S301:判断抽取的动态关键指令序列中是否还存在待处理的指令,如果存在则转入步骤S302,否则转入步骤S305; 

步骤S302:从动态关键指令序列中按次序取出一条指令,依据指令格式对其进行解析; 

步骤S303:依据解析结果,识别并剥离指令的操作数,保留指令助记符; 

步骤S304:将指令助记符加入助记符序列的末尾;再转入步骤S301进行下一轮分析; 

步骤S305:输出生成的助记符序列,以进一步生成软件胎记。 

本发明进一步的改进在于:所述步骤3)中动态关键指令序列胎记生成方法为:令s(p,I)=<ins1,ins2,…,insn为程序p在输入I下抽取得到的一条关键指令序列,t(p,I)=<e1,e2,…,en>表示与s(p,I)对应的助记符序列,即对于其中每个元素ei,都有ei=mnemonicOf(insi);对t(p,I)应用k-gram算法得到一个长度为k子序列的集合Set(p,I)={gj|gj=(ej,ej,…,ej+k-1)},j∈{1,2,…,n-k+1};然后统计独有的k-gram的个数及其频率,最终生成一个键值对集合 BirthpI(k)={gm,freq(gm)|gmSet(p,I)andm1m2,gm1gm2},其中freq(g'm)表示g'm在集合set(p,I)中出现的次数,则将称为程序p在输入I下的动态关键指令序列胎记;k=4或5。 

本发明进一步的改进在于:所述步骤3)具体包括以下步骤: 

步骤S401:判断未处理的子序列长度是否大于可调参数k的值,如果是则转入步骤S402,否则转入步骤S408; 

步骤S402:利用k-gram算法,生成一个长度为k的助记符子序列; 

步骤S403:顺序依次连接生成的长度为k的助记符子序列中的每个元素,生成一个字符串,计算其hash值并将之作为键值查找集合B(初始集合B为空)中是否已存在相应元素;如果存在则转入步骤S406,不存在则转入步骤S404; 

步骤S404:创建一新的以该子序列的hash值为键的元素,并设置键值为1; 

步骤S405:将新生成的键值对元素加入集合B中,转入步骤S407; 

步骤S406:依据hash键值在集合B中查找到该元素,并更新该元素的键值; 

步骤S407:删除助记符序列的首元素,转入步骤S401开展下一轮的处理; 

步骤S408:输出由键值对构成的集合B,即动态关键指令序列胎记。 

本发明进一步的改进在于:所述步骤4)中选用cosine距离衡量第一程序及第二程序胎记的相似性,首先从二者胎记中构造长度相等的两个特征向量,然后计算它们的cosine值作为相似性的值。 

本发明进一步的改进在于:所述步骤5)中抄袭决策模块将多次输入下得到的第一程序及第二程序胎记相似性的值作为输入,计算其均值相似性作为程序的相似性;并依据输入的可调节阈值ε做出抄袭与否的判断,输出检测结果。 

本发明进一步的改进在于:步骤5)中阈值ε的取值范围为0.2-0.3; 

其中sim(PA,PB)为第一程序及第二程序胎记相似性的均值。 

相对于现有技术,本发明具有以下优点: 

(1)本发明检测对象无需源码存在,可直接对二进制代码进行分析,更具实用价值:大部分情况下,可疑抄袭程序是以二进制代码形式发布的,在无确凿证据之前,无法获取其源码,传统的基于源码的抄袭检测手段就失效了。本发明基于动态插桩对软件进行监控,分析对象直接为二进制代码,不存在这种局限性。 

(2)本发明最底层的分析对象是每一条汇编指令,不依赖于特定的操作系统和编程语言,具有更广阔的适用范围。 

(3)本发明通过在软件胎记生成过程中引入数据流分析,使得胎记与程序语义紧密关联,从而对各种各样语义保留的混淆技术具有更强的抵抗力。 

(4)本发明基于监控抽取的动态关键指令序列生成软件胎记,属于动态胎记的范畴,对加密、压缩、封装等浅层混淆手段具有天生的抵抗力,因为这类混淆后的程序最终要想执行,必须在运行时先进行解密、解压缩或解封装。 

附图说明

图1为本发明基于动态关键指令序列胎记的软件抄袭检测方法整体流程图; 

图2为基于运行时监控的动态关键指令序列抽取过程流程图; 

图3为预处理过程流程图; 

图4为动态关键指令序列胎记生成流程图。 

具体实施方式

以下结合附图详细说明本发明基于动态关键指令序列胎记的软件抄袭检测方法的实施方式。 

图1为基于动态关键指令序列胎记的软件抄袭检测方法的处理流程,其中第一程序(原告程序)指的是程序所有者开发的原始程序,第二程序(被告程序)指被认为抄袭了原始程序的可疑程序。 

本发明一种基于动态关键指令序列胎记的软件抄袭检测方法,包括以下步骤: 

步骤S101:使用动态插桩工具如Pin、Valgrind等,在待分析程序的每条指令执行之前植入分析代码,实现对二进制程序指令级信息的监控;同时在待分析程序执行过程中,进行动态污点分析,实现污点源的识别和污点的传播扩散,以辅 助关键指令的识别。 

结合图2,具体而言,在每条指令执行之前植入分析代码,实现对二进制程序指令级信息的监控具体包括以下步骤: 

步骤S201:判断待分析程序是否还存在待执行的指令,如果有则跳至步骤S202,否则直接转入步骤S208; 

步骤S202:对于待分析的指令,解析指令类型,判断其是否为污点传播指令,如果是则转入步骤S203,否则转入步骤S204; 

步骤S203:依据预定义的污点传播规则,进行污点数据的扩散传播; 

步骤S204:对指令进行解析,据其操作符判断是否为值更新指令(指令的执行会造成CPU或者内存单元中数据值的变化),如算数运算指令、位移指令、逻辑运算指令等等。如果是则转入步骤S205,不是则转入步骤S207; 

步骤S205:根据污点的扩散状态,识别该指令是否为输入关联指令,即判断该指令的执行是否会导致与CPU或内存单元关联的污点标记的改变,具体而言即是否会导致该指令目的操作数污点标记的更新。如果为输入关联指令则转入步骤S206,否则转入步骤S207; 

步骤S206:识别出该指令为关键指令,并将之加入动态关键指令序列中; 

步骤S207:执行该指令,并转入步骤S201进行下一轮的分析; 

步骤S208:输出动态关键指令序列,作为下一步分析的基础。 

步骤S102:对抽取的动态关键指令序列中的每条汇编指令,解析其语法结构,剥离操作数,保留其助记符,生成相应的助记符序列。具体流程如图3所示: 

步骤S301:判断抽取的动态关键指令序列中是否还存在待处理的指令,如果存在则转入步骤S302,否则转入步骤S305。 

步骤S302:从动态关键指令序列中按次序取出一条指令,依据指令格式对其进行解析。 

步骤S303:依据解析结果,识别并剥离指令的操作数,保留指令助记符。 

步骤S304:将指令助记符加入助记符序列的末尾;再转入步骤S301进行下一轮分析; 

步骤S305:输出生成的助记符序列,以进一步生成软件胎记。 

步骤S103:基于预处理得到的助记符序列和可调参数k(一般取4或5),应用k-gram算法生成一系列长度为k的子序列,同时统计各个不同的子序列出现的频率,则将子序列及其出现频率构成的键值对集合作为动态关键指令序列胎记。具体而言,胎记生成流程如图4所示: 

步骤S401:判断未处理的子序列长度是否大于可调参数k的值,如果是则转入步骤S402,否则转入步骤S408; 

步骤S402:利用k-gram算法,生成一个长度为k的助记符子序列; 

步骤S403:顺序依次连接生成的长度为k的助记符子序列中的每个元素,生成一个字符串,计算其hash值并将之作为键值查找集合B(初始集合B为空)中是否已存在相应元素;如果存在则转入步骤S406,不存在则转入步骤S404。 

步骤S404:创建一新的以该子序列的hash值为键的元素,并设置键值为1。 

步骤S405:将新生成的键值对元素加入集合B中,转入步骤S407。 

步骤S406:依据hash键值在集合B中查找到该元素,并更新该元素的键值。 

步骤S407:删除助记符序列的首元素,转入步骤S401开展下一轮的处理。 

步骤S408:输出由键值对构成的集合B,即动态关键指令序列胎记。 

执行两次步骤S101-S103,以获得第一程序和第二程序的动态关键指令序列 胎记。 

步骤S104:通过计算cosine距离来衡量第一程序和第二程序的动态关键指令序列胎记的相似性,计算方法描述如下:假定为要检测的两个程序分别生成的胎记为A={<k1,v1>,<k2,v2>,…,<kn,vn>}和B={<k'1,v'1>,<k'2,v'2>,…,<k'm,v'm>};令S=keySet(A)∪keySet(B),构建,其中 ai=vi,ifSikeySet(A)0,ifSikeySet(A)1il,vi为键Si的元素的键值,l表示S的长度;按照同样的方式构造则第一与第二程序的胎记的相似值为 sim(A,B)=A·B|A||B|.

步骤S105:不同输入下生成的胎记可能会不一样,提供多次输入,会计算得到一系列的相似值(S1,S2,…,Sn),取其均值作为最终衡量两个程序相似性的依据,以减小随机因素的影响;并依据输入的可调节阈值ε(取值0.2-0.3)做出抄袭与否的决策,输出检测结果。 

具体描述为:对于两个软件PA和PB,为它们提供一系列的输入I1,I2,…,In(第一程序和第二程序每次的输入相同),生成的一系列胎记分别为A1,A2,…,An和B1,B2,…,Bn,则然后依据这两个程序的相似性和给定的可调阈值ε来确定抄袭与否,即: 

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号