面向C++语言的源代码去匿名化方法以及相关设备与流程

    专利查询2022-07-07  106


    面向c 语言的源代码去匿名化方法以及相关设备
    技术领域
    1.本技术涉及源代码处理化技术领域,尤其涉及一种面向c 语言的源代码去匿名化方法以及相关设备。


    背景技术:

    2.当前,随着互联网技术的蓬勃发展,信息的共享方式由单一转变为多元化,海量的信息涌入人们的视野之中,人们可以通过这些信息丰富自身知识。但是,信息共享在为人们带来便利的同时,也造成了一系列的问题,例如,人们可以肆意的拷贝、存储别人的内容。假使人们将这些内容用于一些错误的途径,例如,擅自使用别人的内容作为自己的内容,窃取别人的观点、别人的成果作为自己的观点、成果,这将导致抄袭、知识产权纠纷等问题。
    3.还有人通过一些恶意应用程序骗取人们的钱财、个人信息等。据《2019年android恶意软件专题报告》的统计结果,仅2019年,360安全大脑共截获约180.9万个移动端新增恶意软件样本。其中,在1月和12月,新增恶意软件数量较多,而在其他月份新增数量差距不大。同时,据《cncert互联网安全威胁报告》的统计结果,仅在2019年11月,境内感染木马或僵尸恶意程序的终端数为120万余个,该类恶意程序在未经用户允许的情况下,私自安装和执行,以达到不正当目的。上述行为都涉及利用恶意代码侵犯用户的权益。
    4.针对上述提到的代码抄袭现象以及恶意代码现象,迫切需要有效的措施来遏制这些行为。


    技术实现要素:

    5.有鉴于此,本技术的目的在于提出一种面向c 语言的源代码去匿名化方法以及相关设备。
    6.基于上述目的,本技术提供了一种面向c 语言的源代码去匿名化方法,包括:获取目标源代码,所述目标源代码为c 语言代码;提取所述目标源代码在动态执行时产生的时间动态特征和空间动态特征;利用学习模型,根据所述时间动态特征和所述空间动态特征对所述目标源代码进行相似性检测,确定所述目标源代码的作者。
    7.可选地,所述时间动态特征包括涉及函数数量、函数平均调用时间、函数时间占比利用率、函数调用次数以及程序运行时间;所述函数平均调用时间包括:包含衍生函数调用时间的函数平均调用时间和不包含衍生函数调用时间的函数平均调用时间。
    8.可选地,计算所述涉及函数数量的特征值包括:获取所述目标源代码的函数数量f与所述目标源代码中代码行数l,所述涉及函数数量的特征值nf的计算公式为计算所述函数时间占比利用率的特征值包括:获取所述目标源代码的函数执行时间t与所述目标源代码的总运行时间v,所述函数时间占比利用率的特征值rf的计算公式为
    9.可选地,所述空间动态特征包括所述目标源代码是否存在内存泄漏、内存分配次
    数、内存释放次数、平均单次分配内存大小、内存释放比率、申请总内存、释放总内存以及函数平均使用内存;响应于所述目标源代码发生内存泄漏,所述空间动态特征还包括内存泄漏类型以及泄露的内存所占比率。
    10.可选地,提取所述目标源代码在动态执行时产生的时间动态特征,包括:在所述目标源代码执行过程中使用第一性能分析工具并使用第一命令对所述目标源代码进行编译,所述编译过程中添加第一选项,基于所述第一选项,生成第一可执行文件;使用所述第一性能分析工具并使用第二命令执行所述第一可执行文件,并生成第一文本文件;使用所述第一性能分析工具并使用第三命令对所述第一文本文件进行文本解析,生成第一数据文件;统计并提取所述第一数据文件中所述目标源代码的时间动态特征的特征值;提取所述目标源代码在动态执行时产生的空间动态特征,包括:在所述目标源代码执行过程中使用第二性能分析工具对所述目标源代码进行编译并生成第二文本文件;使用所述第二性能分析工具对所述第二文本文件进行文本解析,生成第二数据文件;使用所述第二性能工具统计并提取所述第二数据文件中所述目标源代码的空间动态特征的特征值。
    11.可选地,所述方法还包括:构建初始学习模型;获取源代码数据库,所述源代码数据库包括多个不同作者的所写的多个样本源代码;提取所述样本源代码的样本时间动态特征和样本空间动态特征,所述初始学习模型基于所述样本源代码的样本时间动态特征和样本空间动态特征进行训练,将训练完成后的所述初始学习模型作为所述学习模型。
    12.可选地,所述样本时间动态特征包括样本涉及函数数量、样本函数平均调用时间、样本函数时间占比利用率、样本函数调用次数以及样本程序运行时间;所述函数平均调用时间包括:包含衍生函数调用时间的函数平均调用时间和不包含衍生函数调用时间的函数平均调用时间;计算所述涉及函数数量的特征值包括:获取所述目标源代码的函数数量f与所述目标源代码中代码行数l,所述涉及函数数量的特征值nf的计算公式为计算所述函数时间占比利用率的特征值包括:获取所述目标源代码的函数执行时间t与所述目标源代码的总运行时间v,所述函数时间占比利用率的特征值rf的计算公式为所述样本空间动态特征包括所述样本源代码是否存在内存泄漏、样本内存分配次数、样本内存释放次数、样本平均单次分配内存大小、样本内存释放比率、样本技术总内存、样本释放总内存以及样本函数平均使用内存;响应于所述样本目标源代码发生内存泄漏,所述样本空间动态特征还包括样本内存泄漏类型以及样本泄露的内存所占比率。
    13.基于相同目的,本技术还提供了一种面向c 语言的源代码去匿名化装置,包括:获取模块,被配置为获取目标源代码,所述目标代码为c 语言代码;特征提取模块,被配置为提取所述目标源代码在动态执行时产生的时间动态特征和空间动态特征;确定模块,被配置为利用学习模型,根据所述时间动态特征和所述空间动态特征对所述目标源代码进行相似性检测,确定所述目标源代码的作者。
    14.基于上述目的,本技术还提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行任意一种所述面向c 语言的源代码去匿名化方法。
    15.基于上述目的,本技术还提供了一种非暂态计算机可读存储介质,所述非暂态计
    算机可读存储介质存储计算机指令,其特征在于,所述计算机指令用于使计算机执行任意一种所述面向c 语言的源代码去匿名化方法。
    16.从上面所述可以看出,本技术针对现有代码去匿名化方法无法向c 语言迁移的问题,提供了一种面向c 语言的源代码去匿名化方法以及相关设备,包括利用提取的目标源代码在动态执行时产生的时间动态特征和空间动态特征对源代码进行相似性检测,确定所述目标源代码的作者。本技术提供的去匿名化方法在代码动态执行的过程中提取的时间动态特征和空间动态特征可以表征作者的编程风格,保证了源代码去匿名的准确率。
    附图说明
    17.为了更清楚地说明本技术或相关技术中的技术方案,下面将对实施例或相关技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
    18.图1为本技术实施例的面向c 语言的源代码去匿名化方法流程示意图;
    19.图2为本技术另一种实施例的面向c 语言的源代码去匿名化方法流程示意图;
    20.图3为本技术实施例的面向c 语言的源代码去匿名化装置示意图;
    21.图4为本技术实施例的用于面向c 语言的源代码去匿名化方法的电子设备框图。
    具体实施方式
    22.为使本技术的目的、技术方案和优点更加清楚明白,以下结合具体实施例,并参照附图,对本技术进一步详细说明。
    23.需要说明的是,除非另外定义,本技术实施例使用的技术术语或者科学术语应当为本技术所属领域内具有一般技能的人士所理解的通常意义。本技术实施例中使用的“第一”、“第二”以及类似的词语并不表示任何顺序、数量或者重要性,而只是用来区分不同的组成部分。“包括”或者“包含”等类似的词语意指出现该词前面的元件或者物件涵盖出现在该词后面列举的元件或者物件及其等同,而不排除其他元件或者物件。“连接”或者“相连”等类似的词语并非限定于物理的或者机械的连接,而是可以包括电性的连接,不管是直接的还是间接的。“上”、“下”、“左”、“右”等仅用于表示相对位置关系,当被描述对象的绝对位置改变后,则该相对位置关系也可能相应地改变。
    24.相关技术中,早在1997年,对源代码去匿名化的研究已有了很好的进展。例如,部分文献针对代码结构方面特征进行深入研究,取得了不错的成果。在caliskan等人的研究中,将句法特征加入到了源代码去匿名化的特征集合之中,因为针对词汇特征和布局特征,比较容易通过一些方式进行混淆,影响源代码去匿名化的结果,对比词汇特征和布局特征,句法特征被混淆的可能性更小。句法特征的提取涉及将源代码解析成抽象语法树(abstract syntax tree,ast),并解析树的内部结构,获取有效信息。在句法特征的设计上,分为了多个子特征,例如,抽象语法树的最大深度、在排除叶子节点后58种类型节点的平均深度等。在alsulami等人的研究中,对上述caliskan等人的研究成果进行了进一步研究。因为上述抽象语法树相关特征需要人工进行设计并对提取方案进行实现,该研究加入了长短期记忆人工神经网络(long short-term memory,lstm)和双向长短期记忆人工神经
    网络(bidirectional long short-term memory,bilstm)算法,可以实现对抽象语法树中的特征进行自动提取。实验结果表明,该方案在涉及70个作者时,能达到88.86%的准确率。
    25.在frantzeskou等人的研究中,他们提出了一种新的方案,该方案为源代码作者标识文件(source code author profiles,scap),不同于以往表示代码作者风格信息的方式,该方案结合汉语言模型(n-gram),使用二进制的形式表示代码作者的风格信息。在后续实验中,实验结果表明frantzeskou等人的方案是有效的,其中在涉及8个编程作者时,能达到100%的准确率。在burrow等人在2009年的研究中,他们提出了一种新的方案,结合汉语言模型,基于词级别的形式,对源代码进行去匿名化,并取得了平均76.78%的准确率。burrows等人在2014年的后续研究中,针对现存较多的对源代码去匿名化的研究,因为不同研究成果不能直接比较,不同研究使用的评估方法不同,burrows等人将多类研究成果进行总结并进行比较,包括基于信息检索技术的研究、基于机器学习的研究等。实验表明,在机器学习算法中,支持向量机(support vector machine,svm)和神经网络较优,汉语言模型能有效用于机器学习等。
    26.因大型系统中多为多人协作开发,在meng等人的研究中,提出了第一种细粒度技术用于识别二进制文件中的多个作者。为确定作者归属的粒度,对三个大型且长期存在的开源项目进行研究,确定以函数还是基本块为一个属性单元。meng等人的研究朝着库代码识别迈出了第一步。
    27.但上述提到的特征都忽略了代码可以动态执行的特质,忽略了代码在动态执行的过程中产生的大量信息可以表征作者的编程风格。虽然在wang等人的研究中,第一次提出了动态特征的概念,并设计了基于python编程语言的动态特征类别及提取方案。但是,上述方案无法用于其他编程语言,而且上述方案是基于memory profile和cprofile模块生成的分析数据进行设计,在其他编程语言中,首先需重新设计动态特征的提取方案,然后基于动态特征的提取方案,对部分动态特征进行重新设计。因此,上述方案存在向其他编程语言迁移难的问题,如在c 语言就存在上述问题。
    28.有鉴于此,本技术一个实施例提供了面向c 语言的源代码去匿名化方法,如图1所示,包括:
    29.s101、获取目标源代码,所述目标源代码为c 语言代码。
    30.s102、提取所述目标源代码在动态执行时产生的时间动态特征和空间动态特征。
    31.s103、利用学习模型,根据所述时间动态特征和所述空间动态特征对所述目标源代码进行相似性检测,确定所述目标源代码的作者。
    32.本技术的实施例针对现有代码去匿名化方法无法向c 语言迁移的问题,提供了一种面向c 语言的源代码去匿名化方法,包括利用提取的目标源代码在动态执行时产生的时间动态特征和空间动态特征对源代码进行相似性检测,从而确定所述目标源代码的作者。本技术实施例提供的去匿名化方法在代码动态执行的过程中,提取时间动态特征来表征作者书写的代码的时间复杂度以及作者对于库函数的使用习惯和喜好程度;提取空间动态特征来表征作者的内存空间释放习惯、内存空间开辟习惯、内存管理习惯以及代码的空间复杂度。本技术实施例提供的去匿名化方法通过提取时间动态特征以及空间动态特征综合表征了作者的编程风格,保证了源代码去匿名化的准确率。
    33.在另一种实施例中,本技术所述面向c 语言的源代码去匿名化方法还可以如图2
    所示。
    34.在一些实施例中,所述时间动态特征包括涉及函数数量、函数平均调用时间、函数时间占比利用率、函数调用次数以及程序运行时间;所述函数平均调用时间包括:包含衍生函数调用时间的函数平均调用时间和不包含衍生函数调用时间的函数平均调用时间。
    35.所述时间动态特征包括源代码在执行中的多个角度的特征,能够全面表征作者的写作偏好,保证了源代码去匿名的准确率。
    36.所述涉及函数数量(numfunction)统计源代码文件在运行时所涉及的函数数量,这与词汇特征中的函数数量的不同是这里会包括函数中调用的库函数的数量,该特征可以表明作者对于库函数的使用习惯。
    37.所述函数调用次数(functioncalls)统计源代码文件在运行过程中涉及的函数调用次数,这其中包括了库函数的调用情况,该特征可以表明作者对于函数的喜好程度,和对函数调用相关(类似递归等)的喜好程度。
    38.所述函数平均调用时间(avgfunctiontime)统计源代码文件在运行过程中函数的平均运行时间(函数总运行时间/函数调用次数),该特征可以表明作者对于函数的使用偏好。
    39.所述函数时间占用比率(radiofunctiontime)统计源代码文件在运行过程中函数的运行时间在总时间中所占的比率,该特征同函数平均调用时间一起可以表明作者对函数的使用偏好。
    40.所述程序运行时间(runtime)统计源代码文件在运行过程中所使用的总时间,该特征可以表明作者书写的代码的时间复杂度。
    41.具体实施时,本技术实施例基于性能分析工具gprof出发,对所述时间动态特征进行设计,与相关技术相比,本技术加入了函数数量特征(numfunction),该特征涉及的函数不仅仅包括了作者自定义的函数还包含了内部调用的库函数,此特征值用于表征作者对库函数喜好程度。其次,本技术在函数平均调用时间(avgfunctiontime)部分,将其分为两部分,分别为包含衍生函数调用时间的函数平均调用时间和不包含衍生函数调用时间的函数平均调用时间,该值用于表征作者对函数的编写偏好。最后,本技术加入了函数时间占用比率(radiofunctiontime)特征,该特征也可用于表征作者对函数的编写偏好。本技术上述相比于相关技术新加入的涉及函数数量、函数平均调用时间以及函数时间占用比率三个特征,进一步保证了源代码去匿名化的准确率。
    42.在一些实施例中,计算所述涉及函数数量的特征值包括:获取所述目标源代码的函数数量f与所述目标源代码中代码行数l,所述涉及函数数量的特征值nf的计算公式为计算所述函数时间占比利用率的特征值包括:获取所述目标源代码的函数执行时间t与所述目标源代码的总运行时间v,所述函数时间占比利用率的特征值rf的计算公式为
    43.在一些实施例中,所述空间动态特征包括所述目标源代码是否存在内存泄漏、内存分配次数、内存释放次数、平均单次分配内存大小、内存释放比率、申请总内存、释放总内存以及函数平均使用内存;响应于所述目标源代码发生内存泄漏,所述空间动态特征还包
    括内存泄漏类型以及泄露的内存所占比率。
    44.所述空间动态特征包括源代码在执行中的多个角度的特征,能够全面表征作者的写作偏好,保证了源代码去匿名的准确率。
    45.是否存在内存泄漏(memleak)统计在源代码文件执行过程中是否发生了内存泄漏的情况,它可以表明作者的内存释放习惯。
    46.内存泄漏类型(memleaktype)统计发生的内存泄漏的类型(如果该源代码文件执行过程中发生了内存泄漏的情况)。内存泄漏类型主要分为definitely lost、indirecty lost、possibly lost、still reachable、suppressed。
    47.平均单次分配内存大小(avgmemalloc)统计在源代码文件执行时,平均每次空间开辟时内存分配的大小,该特征可以表明作者的空间开辟习惯。令变量am为特征值、变量m为程序开辟空间值、变量t为程序内存分配次数,平均单次分配内存大小特征值的计算方法为:
    48.泄漏的内存所占比率(radioleakmem)统计在源代码文件执行时,分配的内存大小以及泄露的内存大小,并计算它们的比值,该特征可以表明作者的内存管理习惯。令变量rl为特征值、变量m为程序开辟空间值、变量l为泄漏的内存值,radioleakmem特征值的计算方法为:
    49.内存释放比率(radiofree)统计在源代码文件执行时,内存分配的次数以及内存释放的次数,并计算它们的比值,该特征同泄漏的内存所占比率一起可以表明作者的内存管理习惯。
    50.内存分配次数(alloctimes)统计在源代码文件执行时,内存分配的次数。该特征可以表明作者的空间开辟习惯。
    51.内存释放次数(freetimes)统计在源代码文件执行时,内存释放的次数。该特征可以表明作者的空间释放习惯。
    52.申请总内存(allocmem)统计在源代码文件执行时,分配的内存大小。该特征可以表明作者代码的空间复杂度。
    53.释放总的内存(freemem)统计在源代码文件执行时,释放的内存大小。该特征可以表明作者的空间释放习惯.
    54.函数平均使用内存(avgfunctionmemuse)统计在源代码文件执行时,分配的内存大小和代码中包含的函数数量,并计算函数的平均使用内存大小。该特征可以表明用户空间开辟习惯。
    55.具体实施时,本技术基于性能分析工具valgrind出发进行空间动态特征的设计,与现有技术相比,本技术加入内存泄漏相关特征,如是否存在内存泄漏(memleak)、内存泄漏类型(memleaktype)等。因为代码中内存泄漏的情况,可以表示出代码作者对该类情况平时是否有注意去避免的情况,这可以表征作者的编程习惯。其次,本技术加入内存分配次数相关特征,包括内存分配次数(alloctimes)、内存释放次数(freetimes)等,该特征可以表征作者在编写代码时针对内存分配的喜好。本技术上述相比于相关技术新加入的是否存在内存泄漏、内存泄漏类型、内存分配次数以及内存释放次数四个特征,进一步保证了源代码去匿名化的准确率。
    56.在一些实施例中,s102中的提取所述目标源代码在动态执行时产生的时间动态特征包括:
    57.s201、在所述目标源代码执行过程中使用第一性能分析工具并使用第一命令对所述目标源代码进行编译,所述编译过程中添加第一选项,基于所述第一选项,生成第一可执行文件。
    58.s202、使用所述第一性能分析工具并使用第二命令执行所述第一可执行文件,并生成第一文本文件。
    59.s203、使用所述第一性能分析工具并使用第三命令对所述第一文本文件进行文本解析,生成第一数据文件。
    60.s204、统计并提取所述第一数据文件中所述目标源代码的时间动态特征的特征值。
    61.具体实施时,本技术实施例采用了gprof工具提取所述时间动态特征,gprof是gnu profile工具,可以在linux、aix、sun等操作系统上运行,并用作c 程序的性能分析。在运行源代码文件时,使用该工具会以日志的形式记录程序的运行信息,并生成分析文件(flat profile);在此基础上,通过对涉及函数数量、函数平均调用时间、函数时间占比利用率、函数调用次数以及程序运行时间等指标进行统计,最终生成时间动态特征。具体过程如算法伪代码1所示,首先三次使用os.system方法,该方法可将内部字符串以命令的形式在系统上执行。第一次执行os.system内命令的目的是使用gcc命令编译源代码文件,并且添加-pg选项,目的是能生成供gprof剖析用的可执行文件。第二次执行os.system内命令的目的是执行上一条命令生成的可执行文件,并将该编程文件对应的题目中的数据作为输入数据加入。加入timeout的意义是因为部分编程文件出现死循环的情况,即程序一直在执行,没有终止,故添加最长执行时间用于解决该类情况。因为在第一次执行os.system的gcc命令时添加了-pg选项,所以在第二次执行os.system后,会生成gmon.out文件,该文件为程序执行完毕后,gprof工具生成的分析数据。但是该文件需使用命令进行解析。所以第三次执行os.system内命令的目的是解析gmon.out文件,并将解析出的内容放入temp.txt文件中。然后,调用包括numfunction、functioncalls等在内的多个方法,完成对多个子特征类型的获取,从而实现对temp.txt中的文本内容的分析,生成时间动态特征值。
    [0062][0063]
    gprof工具生成的flat profile文件包含多项数据,如%time、seconds、calls、ts/call等,该类数据用于表示用户程序在执行过程中记录的各类函数相关运行信息,例如,时间占用百分比、程序累积运行时间等。因为在本文中所涉及的源代码文件都是从google code jam中获取的,在动态执行时,题目数据输入都来自题目样例数据,而gprof在部分数据统计方面不适用于分析时间较短的程序,所以部分特征采用了语句内嵌,并对程序输出做文本分析的方式实现。
    [0064]
    在一些实施例中,s102中的提取所述目标源代码在动态执行时产生的空间动态特征包括:
    [0065]
    s301、在所述目标源代码执行过程中使用第二性能分析工具对所述目标源代码进行编译并生成第二文本文件。
    [0066]
    s302、使用所述第二性能分析工具对所述第二文本文件进行文本解析,生成第二数据文件。
    [0067]
    s303、使用所述第二性能工具统计并提取所述第二数据文件中所述目标源代码的空间动态特征的特征值。
    [0068]
    具体实施时,本技术采用valgrind工具提取空间动态特征。valgrind是一套在linux下,开放源代码(gpl v2)的仿真调试工具的集合。valgrind中包含了内核和基于内核的其他相关的调试工具。valgrind可用于检测内存泄漏、监测程序缓存等问题。valgrind中包含了多个工具,包括memcheck、callgrind、cachegrind、helgrind等。在本文中主要使用了memcheck工具。如算法伪代码2所示,在程序执行的过程中使用valgrind工具,生成日志文件记录程序的运行信息,并生成分析文件;在此基础上,通过对是否存在内存泄漏、内存泄漏类型、内存分配次数、内存分配大小等指标进行统计,最终生成动态特征,具体与上述时间动态特征提取的过程类似。
    [0069]
    [0070][0071]
    在一些实施例中,所述方法还包括:构建初始学习模型;获取源代码数据库,所述源代码数据库包括多个不同作者的所写的多个样本源代码;提取所述样本源代码的样本时间动态特征和样本空间动态特征,所述初始学习模型基于所述样本源代码的样本时间动态特征和样本空间动态特征进行训练,将训练完成后的所述初始学习模型作为所述学习模型。
    [0072]
    具体实施时,所述学习模型采用随机森林的方式构建,具体构建方式包括:
    [0073]
    s401、有放回的随机选择n个样本源代码(每次随机选择一个样本,然后返回继续选择)。选择好的n个样本源代码用来训练一个决策树,作为决策树根节点处的样本。
    [0074]
    s402、每个样本有m个特征,在决策树的每个节点需要分裂时,随机从这m个特征中选取出m个特征,满足条件m《《m。然后从这m个特征中采用某种策略(比如说信息增益)来选择1个特征作为该节点的分裂属性。
    [0075]
    s403、决策树形成过程中每个节点都要按照s402来分裂(如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝。
    [0076]
    s404、按照步骤s401至s403建立大量的决策树,构成随机森林。
    [0077]
    所述学习模型采用随机森林的方式构建,所述随机森林算法可以产生高准确度的分类器,并且可以处理大量的输入变数;在建造森林时,它可以在内部对于一般化后的误差产生不偏差的估计,并且有着很快的学习速度。
    [0078]
    在一些实施例中,所述样本时间动态特征包括样本涉及函数数量、样本函数平均调用时间、样本函数时间占比利用率、样本函数调用次数以及样本程序运行时间;所述函数平均调用时间包括:包含衍生函数调用时间的函数平均调用时间和不包含衍生函数调用时间的函数平均调用时间;计算所述涉及函数数量的特征值包括:获取所述目标源代码的函数数量f与所述目标源代码中代码行数l,所述涉及函数数量的特征值nf的计算公式为计算所述函数时间占比利用率的特征值包括:获取所述目标源代码的函数执行时间t与所述目标源代码的总运行时间v,所述函数时间占比利用率的特征值rf的计算公式为所述样本空间动态特征包括所述样本源代码是否存在内存泄漏、样本内存分配次数、样本内存释放次数、样本平均单次分配内存大小、样本内存释放比率、样本技术总内存、样本释放总内存以及样本函数平均使用内存;响应于所述样本目标源代码发生内存泄漏,所述样本空间动态特征还包括样本内存泄漏类型以及样本泄露的内存所占比
    率。
    [0079]
    使用时间动态特征与空间动态特征对学习模型进行训练,涵括了源代码在执行中的多个角度的特征,能够全面表征作者的写作偏好,保证了源代码去匿名的准确率。
    [0080]
    与相关技术相比,本技术实施例提供的面向c 语言的源代码去匿名化的准确率如表1所示,其中,方案1为frantzeskou等人的研究,具体方案为源代码作者标识文件(source code author profiles,scap),该方案结合汉语言模型(n-gram),使用二进制的形式表示代码作者的风格信息;
    [0081]
    方案2为burrow等人在2009年的研究,具体方案为结合汉语言模型,基于词级别的形式,对源代码进行去匿名化;
    [0082]
    方案3为alsulami等人的研究,具体方案为对将句法特征加入到源代码去匿名化的成果的进一步研究,该研究加入了长短期记忆人工神经网络(long short-term memory,lstm)和双向长短期记忆人工神经网络(bidirectional long short-term memory,bilstm)算法,可以实现对抽象语法树中的特征进行自动提取;
    [0083]
    方案4为burrow等人在2014年的研究,具体方案为将多类研究成果进行总结并进行比较,包括基于信息检索技术的研究、基于机器学习的研究等;实验表明,在机器学习算法中,支持向量机(support vector machine,svm)和神经网络较优,汉语言模型能有效用于机器学习等;
    [0084]
    方案5为meng等人的研究中,具体方案为将细粒度技术用于识别二进制文件中的多个作者;为确定作者归属的粒度,对三个大型且长期存在的开源项目进行研究,确定以函数还是基本块为一个属性单元。
    [0085]
    表1中每个方案用于训练学习模型的训练文件个数均为15份。
    [0086]
    表1:源代码去匿名化的准确率对比
    [0087][0088]
    由表1中的数据可以看出来,本技术提供的面向c 语言的源代码去匿名化方法准确率高于相关技术所使用的方法,保证了c 语言的源代码去匿名化的准确率。
    [0089]
    需要说明的是,本技术实施例的方法可以由单个设备执行,例如一台计算机或服务器等。本实施例的方法也可以应用于分布式场景下,由多台设备相互配合来完成。在这种分布式场景的情况下,这多台设备中的一台设备可以只执行本技术实施例的方法中的某一
    个或多个步骤,这多台设备相互之间会进行交互以完成所述的方法。
    [0090]
    需要说明的是,上述对本技术的一些实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于上述实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
    [0091]
    基于同一发明构思,与上述任意实施例方法相对应的,本技术还提供了一种面向c 语言的源代码去匿名化装置,如图3所示,包括:获取模块10,被配置为获取目标源代码,所述目标代码为c 语言代码;特征提取模块20,被配置为提取所述目标源代码在动态执行时产生的时间动态特征和空间动态特征;确定模块30,被配置为利用学习模型,根据所述时间动态特征和所述空间动态特征对所述目标源代码进行相似性检测,确定所述目标源代码的作者。
    [0092]
    本技术的实施例针对现有代码去匿名化方法无法向c 语言迁移的问题,提供了一种面向c 语言的源代码去匿名化装置,包括利用提取的目标源代码在动态执行时产生的时间动态特征和空间动态特征对源代码进行相似性检测,从而确定所述目标源代码的作者。本技术实施例提供的去匿名化装置在代码动态执行的过程中,提取时间动态特征来表征作者书写的代码的时间复杂度以及作者对于库函数的使用习惯和喜好程度;提取空间动态特征来表征作者的内存空间释放习惯、内存空间开辟习惯、内存管理习惯以及代码的空间复杂度。本技术实施例提供的去匿名化装置通过提取时间动态特征以及空间动态特征综合表征了作者的编程风格,保证了源代码去匿名化的准确率。
    [0093]
    在一些实施例中,所述时间动态特征包括涉及函数数量、函数平均调用时间、函数时间占比利用率、函数调用次数以及程序运行时间;所述函数平均调用时间包括:包含衍生函数调用时间的函数平均调用时间和不包含衍生函数调用时间的函数平均调用时间。
    [0094]
    在一些实施例中,计算所述涉及函数数量的特征值包括:获取所述目标源代码的函数数量f与所述目标源代码中代码行数l,所述涉及函数数量的特征值nf的计算公式为计算所述函数时间占比利用率的特征值包括:获取所述目标源代码的函数执行时间t与所述目标源代码的总运行时间v,所述函数时间占比利用率的特征值rf的计算公式为
    [0095]
    在一些实施例中,所述空间动态特征包括所述目标源代码是否存在内存泄漏、内存分配次数、内存释放次数、平均单次分配内存大小、内存释放比率、申请总内存、释放总内存以及函数平均使用内存;响应于所述目标源代码发生内存泄漏,所述空间动态特征还包括内存泄漏类型以及泄露的内存所占比率。
    [0096]
    在一些实施例中,所述特征提取模块还包括时间动态特征提取子模块以及空间动态特征提取子模块,所述时间动态特征提取子模块被配置为在所述目标源代码执行过程中使用第一性能分析工具并使用第一命令对所述目标源代码进行编译,所述编译过程中添加第一选项,基于所述第一选项,生成第一可执行文件;使用所述第一性能分析工具并使用第二命令执行所述第一可执行文件,并生成第一文本文件;使用所述第一性能分析工具并使用第三命令对所述第一文本文件进行文本解析,生成第一数据文件;统计并提取所述第一
    memory,随机存取存储器)、静态存储设备,动态存储设备等形式实现。存储器42可以存储操作系统和其他应用程序,在通过软件或者固件来实现本说明书实施例所提供的技术方案时,相关的程序代码保存在存储器42中,并由处理器41来调用执行。
    [0105]
    输入/输出接口43用于连接输入/输出模块,以实现信息输入及输出。输入输出/模块可以作为组件配置在设备中(图中未示出),也可以外接于设备以提供相应功能。其中输入设备可以包括键盘、鼠标、触摸屏、麦克风、各类传感器等,输出设备可以包括显示器、扬声器、振动器、指示灯等。
    [0106]
    通信接口44用于连接通信模块(图中未示出),以实现本设备与其他设备的通信交互。其中通信模块可以通过有线方式(例如usb、网线等)实现通信,也可以通过无线方式(例如移动网络、wifi、蓝牙等)实现通信。
    [0107]
    总线45包括一通路,在设备的各个组件(例如处理器41、存储器42、输入/输出接口43和通信接口44)之间传输信息。
    [0108]
    需要说明的是,尽管上述设备仅示出了处理器41、存储器42、输入/输出接口43、通信接口44以及总线45,但是在具体实施过程中,该设备还可以包括实现正常运行所必需的其他组件。此外,本领域的技术人员可以理解的是,上述设备中也可以仅包含实现本说明书实施例方案所必需的组件,而不必包含图中所示的全部组件。
    [0109]
    上述实施例的电子设备用于实现前述任一实施例中相应的面向c 语言的源代码去匿名化方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
    [0110]
    基于同一发明构思,与上述任意实施例方法相对应的,本技术还提供了一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令用于使所述计算机执行如上任一实施例所述的面向c 语言的源代码去匿名化方法。
    [0111]
    本实施例的计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。
    [0112]
    上述实施例的存储介质存储的计算机指令用于使所述计算机执行如上任一实施例所述的面向c 语言的源代码去匿名化方法,并且具有相应的方法实施例的有益效果,在此不再赘述。
    [0113]
    所属领域的普通技术人员应当理解:以上任何实施例的讨论仅为示例性的,并非旨在暗示本技术的范围(包括权利要求)被限于这些例子;在本技术的思路下,以上实施例或者不同实施例中的技术特征之间也可以进行组合,步骤可以以任意顺序实现,并存在如上所述的本技术实施例的不同方面的许多其它变化,为了简明它们没有在细节中提供。
    [0114]
    另外,为简化说明和讨论,并且为了不会使本技术实施例难以理解,在所提供的附图中可以示出或可以不示出与集成电路(ic)芯片和其它部件的公知的电源/接地连接。此外,可以以框图的形式示出装置,以便避免使本技术实施例难以理解,并且这也考虑了以下事实,即关于这些框图装置的实施方式的细节是高度取决于将要实施本技术实施例的平台
    的(即,这些细节应当完全处于本领域技术人员的理解范围内)。在阐述了具体细节(例如,电路)以描述本技术的示例性实施例的情况下,对本领域技术人员来说显而易见的是,可以在没有这些具体细节的情况下或者这些具体细节有变化的情况下实施本技术实施例。因此,这些描述应被认为是说明性的而不是限制性的。
    [0115]
    尽管已经结合了本技术的具体实施例对本技术进行了描述,但是根据前面的描述,这些实施例的很多替换、修改和变型对本领域普通技术人员来说将是显而易见的。例如,其它存储器架构(例如,动态ram(dram))可以使用所讨论的实施例。
    [0116]
    本技术实施例旨在涵盖落入所附权利要求的宽泛范围之内的所有这样的替换、修改和变型。因此,凡在本技术实施例的精神和原则之内,所做的任何省略、修改、等同替换、改进等,均应包含在本技术的保护范围之内。
    转载请注明原文地址:https://tc.8miu.com/read-1679.html

    最新回复(0)