CN116414445B - 一种基于源代码水印的同源性检测方法及系统 - Google Patents

一种基于源代码水印的同源性检测方法及系统 Download PDF

Info

Publication number
CN116414445B
CN116414445B CN202310667105.1A CN202310667105A CN116414445B CN 116414445 B CN116414445 B CN 116414445B CN 202310667105 A CN202310667105 A CN 202310667105A CN 116414445 B CN116414445 B CN 116414445B
Authority
CN
China
Prior art keywords
watermark
features
module
source code
code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202310667105.1A
Other languages
English (en)
Other versions
CN116414445A (zh
Inventor
谢朝海
齐大伟
李志勇
谢朝战
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shenzhen Secidea Network Security Technology Co ltd
Original Assignee
Shenzhen Secidea Network Security Technology Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Shenzhen Secidea Network Security Technology Co ltd filed Critical Shenzhen Secidea Network Security Technology Co ltd
Priority to CN202310667105.1A priority Critical patent/CN116414445B/zh
Publication of CN116414445A publication Critical patent/CN116414445A/zh
Application granted granted Critical
Publication of CN116414445B publication Critical patent/CN116414445B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • G06F8/751Code clone detection
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F18/00Pattern recognition
    • G06F18/20Analysing
    • G06F18/22Matching criteria, e.g. proximity measures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/16Program or content traceability, e.g. by watermarking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/10Text processing
    • G06F40/12Use of codes for handling textual entities
    • G06F40/151Transformation
    • G06F40/154Tree transformation for tree-structured or markup documents, e.g. XSLT, XSL-FO or stylesheets
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/10Text processing
    • G06F40/194Calculation of difference between files
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/20Natural language analysis
    • G06F40/253Grammatical analysis; Style critique
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/30Semantic analysis
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Artificial Intelligence (AREA)
  • General Health & Medical Sciences (AREA)
  • Health & Medical Sciences (AREA)
  • Audiology, Speech & Language Pathology (AREA)
  • Computational Linguistics (AREA)
  • Software Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Bioinformatics & Cheminformatics (AREA)
  • Bioinformatics & Computational Biology (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Evolutionary Biology (AREA)
  • Evolutionary Computation (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Editing Of Facsimile Originals (AREA)

Abstract

本发明涉及一种基于源代码水印的同源性检测方法及系统,通过预处理源代码,转换为抽象语法树,提取语法结构和语义特征;采用插件式架构,适应不同编程语言和框架,提取水印特征;对比源代码的语法、语义和水印特征相似度,设定阈值,判断是否具有同源性,避免误判;如有同源性,核验非混淆性质水印特征,如特定字符串、代码片段或算法实现。本发明具有快速、准确、灵活和稳定等有益效果,能够有效地应用于软件版权保护、代码安全审计等领域,对保护软件版权和保障信息安全具有重要意义。

Description

一种基于源代码水印的同源性检测方法及系统
技术领域
本发明涉及计算机软件技术领域,更具体地说,涉及一种基于源代码水印的同源性检测方法及系统。
背景技术
源代码同源性检测(也称为代码相似度检测或代码抄袭检测)是一种在计算机科学和软件工程领域用于检测和比较不同源代码文件之间相似性的技术。其主要目的是确定两个或多个代码片段是否具有相似的结构或内容,以便识别潜在的抄袭行为或重复代码。通过源代码同源性检测可发现重复或相似的代码片段,有针对性地优化和重构代码,提高代码的可读性和可维护性,降低软件中的潜在缺陷和漏洞,进而提高整体软件质量。源代码同源性检测还可以及时发现源代码中存在的漏洞,防止这些漏洞在多个软件系统中传播,这对于确保软件系统的安全性至关重要,可以降低潜在的安全风险和损失。
目前,源代码同源性检测主要依赖文本相似检测和功能相似检测技术。文本相似检测技术虽在大规模、复制性克隆代码检测方面较为有效,但由于软件源代码中的变量名称和程序结构可以被轻易替换,这使得替换后的代码难以被检测到。功能相似检测技术主要关注程序段之间的结构和语义相似性,而不考虑词法上的差异,这种方法在避免变量名称混淆方面具有优势,但它可能会产生较多误判,在某些应用场景下的软件源代码许多功能逻辑都极为相似,不能仅凭此来判断它们是否同源。因此,现有利用文本相似检测或功能相似检测技术的源代码同源性检测技术都存在一定的局限性和缺陷,一方面无法提供快速而准确的源代码同源性检测结果,另一方面无法针对不同应用场景和需求提供更加灵活、稳定且可靠的同源性检测方法。目前为保护源代码防止被抄袭和侵权,虽引入源代码水印的方法也得到发展,旨在通过插桩植入或特征提取水印来判断源代码同源性,但这种方法面临一定的检测挑战,例如插桩植入水印可能因检测难度而影响程序运行性能,由于程序的编程语言众多,水印特征的提取也受限于特定编程语言或框架。
发明内容
本发明要解决的技术问题在于,针对现有技术的上述缺陷,一种基于源代码水印的同源性检测方法及系统。
本发明解决其技术问题所采用的技术方案是:
一种基于源代码水印的同源性检测方法,包括以下步骤:
S1、读取待比较的至少两段源代码;
S2、对每段所述源代码执行预处理方法,包括源代码语言的识别和移除注释、空白字符、格式预处理步骤,以及归一化变量命名;
S3、将每段所述源代码转换成抽象语法树AST表示;
S4、对每个所述AST进行模式匹配,提取语法结构特征和语义特征;
S5、使用插件式架构,根据不同的编程语言和框架,提取和匹配所述源代码中的水印特征;
S6、比较两段所述源代码的语法结构特征、语义特征和水印特征相似度;
S7、设定相似度阈值,并根据计算出的所述相似度阈值判断两段所述源代码是否具有同源性,以避免误判问题;
S8、若判断出两段所述源代码具有同源性,则进一步核验非混淆性质的所述水印特征,非混淆性质的所述水印特征包括但不限于代码中的特定字符串、特定代码片段或特定算法实现。
进一步地,在步骤S5中,所述插件式架构允许用户根据需要编写自定义插件以适应特定的所述编程语言和框架,以便更准确地提取和匹配所述源代码中的所述水印特征。
进一步地,在步骤S4中,使用序列比对、编辑距离或其他先进的匹配算法来提高所述水印特征匹配和核验的精度。
进一步地,缓存已提取的所述水印特征以便在后续比较中直接使用,并实现增量处理机制,只分析源代码的改动部分。
进一步地,所述方法采用多线程或多进程并行处理多个源代码文件,以提高处理速度。
进一步地,所述方法进一步包括对所述源代码中的控制流和数据流进行分析,以提取更丰富的语义信息,所述控制流和所述数据流分析可采用基于程序切片、数据依赖图或数据流图的方法实现,以便更好地识别代码的执行路径和数据传递关系,提高语义特征的提取精度。
一种基于源代码水印的同源性检测系统,包括:
输入模块:用于读取待比较的至少两段源代码;
预处理模块:用于对每段所述源代码执行预处理方法,包括源代码语言的识别和移除注释、空白字符、格式预处理步骤,以及归一化变量命名;
抽象语法树AST转换模块:用于将每段所述源代码转换成抽象语法树AST表示;
特征提取模块:用于对每个所述AST进行模式匹配,提取语法结构特征和语义特征;
插件管理模块:用于加载并管理提取所述源代码特征的插件,根据不同的编程语言和框架,提取和匹配所述源代码中的水印特征;
特征比较模块:用于比较两段源代码的语法结构特征、语义特征和水印特征相似度;
判断模块:用于设定相似度阈值,并根据计算出的相似度阈值判断两段所述源代码是否具有同源性,以避免误判问题;
匹配和核验模块:用于匹配和核验所述源代码中的非混淆性质的所述水印特征,包括但不限于代码中的特定字符串、特定代码片段或特定算法实现;
所述输入模块读取待比较的至少两端所述源代码并传递给所述预处理模块;所述预处理模块进行预处理操作并将预处理后的所述源代码传递给所述抽象语法树AST转换模块;所述抽象语法树AST转换模块生成AST并将所述AST传递给所述特征提取模块;所述特征提取模块提取语法结构特征和语义特征,并将提取的特征传递给所述特征比较模块和所述插件管理模块;所述插件管理模块加载和调用插件,提取和匹配所述源代码中的所述水印特征,并将提取的所述水印特征传递给所述特征比较模块;所述特征比较模块计算两段所述源代码的相似度,并将计算得出的相似度值传递给所述判断模块;所述判断模块设定相似度阈值并根据计算得出的所述相似度值判断所述源代码是否具有同源性,若具有同源性则将结果传递给所述匹配和核验模块进行所述水印特征的匹配和核验;所述匹配和核验模块输出匹配和核验结果。
进一步地,所述插件管理模块允许用户根据需要编写自定义插件以提取特定的所述水印特征。
进一步地,所述特征比较模块使用序列比对、编辑距离或其他先进的匹配算法来提高所述水印特征匹配和核验的精度。
进一步地,所述系统缓存已提取的所述水印特征以便在后续比较中直接使用,并实现增量处理机制,只分析所述源代码的改动部分。
本发明的有益效果在于:基于抽象语法树的特征提取和相似度比较算法,本申请能够在较短的时间内对源代码进行同源性检测,并发现源码中的变量名称或程序结构的替换痕迹;在判断源代码是否具有同源性时,设定了相似度阈值,避免了应用功能场景及变量名称混淆带来的误判问题;采用插件式架构,允许用户根据需要编写自定义插件以适应特定的编程语言和框架,以便更准确地提取和匹配源代码中的水印特征;使用先进的特征提取和相似度比较算法,结合插件式架构和多线程或多进程并行处理,能够稳定地提取源码水印特征,解决了水印特征的提取受限于编程语言和框架的问题,提高了检测的准确性和稳定性。本申请一种基于源代码水印的同源性检测方法及系统具有快速、准确、灵活和稳定等有益效果,能够有效地应用于软件版权保护、代码安全审计等领域,对保护软件版权和保障信息安全具有重要意义。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将结合附图及实施例对本发明作进一步说明,下面描述中的附图仅仅是本发明的部分实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获取其他附图:
图1是本发明实施例的一种基于源代码水印的同源性检测方法的流程示意图;
图2是本发明实施例的一种基于源代码水印的同源性检测系统的数据控制流程参考示意图。
具体实施方式
为了使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的技术方案进行清楚、完整的描述,显然,所描述的实施例是本发明的部分实施例,而不是全部实施例。基于本发明的实施例,本领域普通技术人员在没有付出创造性劳动的前提下所获取的所有其他实施例,都属于本发明的保护范围。
本发明提供了一种基于源代码水印的同源性检测方法,具体实施步骤如下:
S1: 读取待比较的至少两段源代码
首先,从用户输入或文件系统中读取待比较的两段源代码,例如:
- codeA:一个Python文件,包含一个类和若干个函数;
- codeB:另一个Python文件,包含相似的类和函数结构。
S2: 预处理源代码
对每段源代码执行以下预处理方法:
1. 识别所述源代码的编程语言,例如Python、Java或C++;
2. 移除所述源代码中的注释、空白字符和格式;
3. 归一化变量命名,例如将所有变量名替换为通用名称,如var1、var2等。
S3: 将所述源代码转换成抽象语法树AST表示
使用相应编程语言的解析器,将每段所述源代码转换成AST表示。例如,使用Python的ast模块将codeA和codeB转换成两个所述AST对象。
S4: 提取语法结构特征和语义特征
遍历每个所述AST,提取以下特征:
1. 语法结构特征:例如循环结构、条件结构和异常处理结构;
2. 语义特征:例如变量类型、函数参数类型和返回值类型。
S5: 提取和匹配源代码中的水印特征
使用插件式架构,根据不同的编程语言和框架,提取和匹配源代码中的水印特征。例如,针对Python语言,可以使用一个插件检测函数名、类名和导入的库名等。
S6: 比较源代码的语法结构特征、语义特征和水印特征相似度
将codeA和codeB的语法结构特征、语义特征和所述水印特征进行比较,计算相似度。例如,可以使用余弦相似度、Jaccard相似度或编辑距离等方法。
S7: 判断源代码是否具有同源性
设定一个相似度阈值(例如0.8),根据计算出的相似度判断两段所述源代码是否具有同源性。如果相似度大于或等于阈值,则认为两段所述源代码具有同源性。
具体例子:
假设我们有两段Python代码,分别为code1和code2。我们想要比较它们之间的相似度,并根据预设的相似度阈值来判断它们是否同源。我们可以使用以下Python代码来实现这个功能:
import difflib
def compare(code1, code2):
# 对代码进行处理
code1 = code1.strip()
code2 = code2.strip()
# 计算相似度
seq_matcher = difflib.SequenceMatcher(None, code1, code2)
similarity = seq_matcher.ratio()
# 判断是否同源
threshold = 0.8 # 相似度阈值
if similarity>= threshold:
print("这两段源代码具有同源性!")
else:
print("这两段源代码不具有同源性。")
在这个实施例中,我们使用Python标准库中的difflib模块来计算代码之间的相似度。具体来说,我们使用SequenceMatcher类来比较两个字符串之间的相似度,返回一个介于0和1之间的浮点数。如果相似度大于或等于预设的相似度阈值,则认为这两段代码具有同源性。
S8: 核验非混淆性质的水印特征
若判断出两段所述源代码具有同源性,则进一步核验非混淆性质的所述水印特征。非混淆性质的所述水印特征包括但不限于以下几种:
1. 特定字符串:在源代码中查找特定的字符串,如版权声明、开发者信息等;
2. 特定代码片段:检查两段源代码中是否包含相同的特定代码片段,如某种算法实现或功能模块;
3. 特定算法实现:比较两段源代码中的算法实现是否相同或相似,如排序算法、加密算法等。
若在非混淆性质的水印特征核验中发现两段源代码具有显著相似之处,则最终确定它们具有同源性。若未发现显著相似之处,则需要对初始的同源性判断进行修正。
进一步,在步骤S5中,所述插件式架构允许用户根据需要编写自定义插件以适应特定的所述编程语言和框架,以便更准确地提取和匹配所述源代码中的所述水印特征。例如先定义一个插件类,然后让该类继承自同源性检测工具的基本插件类,操作例子如下:
from base_plugin import BasePlugin
class DjangoWatermarkPlugin(BasePlugin):
def extract_watermark_features(self, ast):
"""
提取Python语言和Django框架中特定的水印特征
"""
features = []
# 提取Django类和方法特征
django_class_features = self.extract_django_class_features(ast)
features.extend(django_class_features)
# 提取Django URL配置和路由特征
django_url_features = self.extract_django_url_features(ast)
features.extend(django_url_features)
# 提取Django模板引擎特征
django_template_features = self.extract_django_template_features(ast)
features.extend(django_template_features)
# 提取Python库和函数调用特征
python_library_features = self.extract_python_library_features(ast)
features.extend(python_library_features)
return features
def extract_django_class_features(self, ast):
# 提取Django特定类和方法特征的实现
pass
def extract_django_url_features(self, ast):
# 提取Django URL配置和路由特征的实现
pass
def extract_django_template_features(self, ast):
# 提取Django模板引擎特征的实现
pass
def extract_python_library_features(self, ast):
# 提取Python库和函数调用特征的实现
pass
def match_watermark_features(self, features1, features2):
"""
匹配两个源代码中提取到的水印特征
"""
# 计算两个特征列表的相似度并返回结果
pass
以上例子为Python语言和Django框架编写了一个自定义插件,可以更准确地提取和匹配源代码中的水印特征,从而提高同源性检测的准确性。
进一步,在步骤S4中,还可使用序列比对、编辑距离或其他先进的匹配算法来提高所述水印特征匹配和核验的精度。简单举个例子,假设我们已经提取了两个源代码文件的所述水印特征,现在需要比较这些特征以评估源代码文件之间的相似性。我们首先需要将提取到的特征列表转换为字符串,再将这些特征连接成一个长字符串;接下来,我们将使用编辑距离算法来计算这两个字符串之间的相似度,编辑距离是指将一个字符串转换为另一个字符串所需的最少操作次数,操作包括插入、删除和替换字符,在Python中,我们可以使用Levenshtein库来计算编辑距离。为了评估相似度,我们还可以计算两个字符串的编辑距离与最长字符串长度的比值。得到的值将介于0和1之间,其中0表示完全相同,1表示完全不同。这种方法可以在源代码文件之间进行更精确的特征比较,从而提高同源性检测的准确性。
进一步,所述方法采用多线程或多进程并行处理多个源代码文件,以提高处理速度。
进一步,所述方法进一步包括对所述源代码中的控制流和数据流进行分析,以提取更丰富的语义信息,所述控制流和所述数据流分析可采用基于程序切片、数据依赖图或数据流图的方法实现,以便更好地识别代码的执行路径和数据传递关系,提高语义特征的提取精度。
以下是一个使用Python编写的实现该同源性检测方法的简化示例:
import ast
import similarity_calculator
def main():
codeA = read_source_code("fileA.py")
codeB = read_source_code("fileB.py")
codeA_preprocessed = preprocess_code(codeA)
codeB_preprocessed = preprocess_code(codeB)
astA = ast.parse(codeA_preprocessed)
astB = ast.parse(codeB_preprocessed)
featuresA = extract_features(astA)
featuresB = extract_features(astB)
watermark_featuresA = extract_watermark_features(codeA_preprocessed)
watermark_featuresB = extract_watermark_features(codeB_preprocessed)
similarity = similarity_calculator.calculate(featuresA, featuresB,watermark_featuresA, watermark_featuresB)
if similarity>= SIMILARITY_THRESHOLD:
non_obfuscated_watermark_similarity = verify_non_obfuscated_watermark(codeA_preprocessed, codeB_preprocessed)
if non_obfuscated_watermark_similarity>= NON_OBFUSCATED_WATERMARK_THRESHOLD:
print("源代码具有同源性")
else:
print("源代码不具有同源性")
else:
print("源代码不具有同源性")
if __name__ == "__main__":
main()
基于上述例子,还可以根据不同编程语言和框架的特点,调整预处理方法、特征提取方法和相似度计算方法,以提高同源性检测的准确性和鲁棒性。
具体实施步骤中,步骤S2、S3、S4、S5、S6的融合实现了快速发现源码中变量名称或程序结构被替换的痕迹:步骤S7、S8的融合实现了准确避免应用功能场景及变量名称混淆带来的误判问题:步骤S5、S8的融合实现了灵活自定义提取匹配和核验水印特征:步骤S5实现了稳定源码水印特征的提取受限于编程语言和框架,解决后稳定提取等有益效果。
本申请还提供了一种基于源代码水印的同源性检测系统,以下将详细描述该系统的各个模块、实现细节和交互关系。所述系统包括:
输入模块,用于读取待比较的至少两段源代码。实现细节包括:
语言识别:识别所述源代码的编程语言,如Python、Java或C++;
编码转换:将所述源代码转换为统一的字符编码,如UTF-8;
字符过滤:移除非法字符和控制字符,确保正确读取所述源代码。
所述输入模块将读取的所述源代码传递给预处理模块,实现细节包括语言识别、编码转换和字符过滤等操作,以确保正确地读取所述源代码。
所述预处理模块,用于对所述源代码进行预处理操作。实现细节包括:
注释移除:使用正则表达式移除所述源代码中的注释;
空白字符和格式移除:使用正则表达式移除所述源代码中的空白字符和格式;
变量命名归一化:基于词法分析,将所述源代码中的变量名替换为通用名称,如var1、var2等。
所述预处理模块将预处理后的所述源代码传递给抽象语法树AST转换模块。
所述抽象语法树AST转换模块,用于将所述源代码转换成AST表示。实现细节包括:
词法分析:将所述源代码分解为语法单元(tokens);
语法分析:根据编程语言的语法规则,将语法单元组织成AST。
所述抽象语法树AST转换模块将生成的所述AST传递给特征提取模块。
所述特征提取模块,用于提取语法结构特征和语义特征。实现细节包括:
所述语法结构特征提取:遍历所述AST,提取循环结构、条件结构和异常处理结构等;
所述语义特征提取:使用程序切片和数据依赖图提取变量类型、函数参数类型和返回值类型等。
所述特征提取模块将提取的所述特征传递给特征比较模块和插件管理模块。
所述插件管理模块,用于加载和管理提取所述源代码特征的插件。实现细节包括:
插件接口定义:为插件提供统一的接口,方便不同编程语言和框架的插件集成;
插件加载:动态加载提取源代码特征的插件;
插件参数配置:为插件提供参数配置接口,方便用户根据需要调整插件行为;
插件调用和结果合并:调用插件提取所述源代码中的水印特征,并将结果合并到特征比较模块。
所述插件管理模块将提取的所述水印特征传递给特征比较模块。
特征比较模块,用于比较两段源代码的语法结构特征、语义特征和水印特征相似度。实现细节包括:
相似度计算算法:采用余弦相似度、Jaccard相似度等算法计算特征相似度;
阈值设定:根据实际需求和经验,设定相似度阈值;
相似度判断:根据计算得出的相似度值和设定的阈值,判断两段所述源代码是否具有同源性;
相似度结果输出:将判断结果输出给用户或保存到检测报告中。
所述特征比较模块将计算得出的相似度值传递给判断模块。
所述判断模块,用于根据计算出的相似度值判断所述源代码是否具有同源性,以避免误判问题。实现细节包括:
阈值设定:根据实际需求和经验,设定相似度阈值;
判断算法:根据计算得出的相似度值和设定的阈值,判断两段所述源代码是否具有同源性;
误判问题处理:若存在误判问题,通过反馈机制进行调整和优化。
所述判断模块将判断结果传递给匹配和核验模块。
所述匹配和核验模块,用于匹配和核验所述源代码中的非混淆性质的所述水印特征,包括但不限于代码中的特定字符串、特定代码片段或特定算法实现。实现细节包括:
匹配算法:使用字符串匹配、模式匹配等算法匹配所述水印特征;
核验机制:对匹配到的所述水印特征进行核验,确保其为有效的所述水印特征;
所述水印特征提取和存储:将匹配和核验后的所述水印特征提取出来并存储,以备后续分析和使用。
匹配和核验模块将匹配和核验的结果输出给用户或存储到检测报告中。
系统模块交互关系参考说明:
输入模块读取待比较的源代码并传递给预处理模块;
预处理模块进行预处理操作并将预处理后的源代码传递给抽象语法树AST转换模块;
抽象语法树AST转换模块生成AST并将AST传递给特征提取模块;
特征提取模块提取语法结构特征和语义特征,并将提取的特征传递给特征比较模块和插件管理模块;
插件管理模块加载和调用插件,提取和匹配源代码中的水印特征,并将提取的水印特征传递给特征比较模块;
特征比较模块计算两段源代码的相似度,并将计算得出的相似度值传递给判断模块;
判断模块设定相似度阈值并根据计算得出的相似度值判断源代码是否具有同源性,若具有同源性则将结果传递给匹配和核验模块进行水印特征的匹配和核验;
匹配和核验模块输出匹配和核验结果。
进一步地,所述插件管理模块允许用户根据需要编写自定义插件以提取特定的所述水印特征。假设一个Python项目中可能包含特定的字符串水印,这些水印以特定的前缀和后缀进行标记,例如 WM_START 和 WM_END。为了识别这些特定的水印特征,我们可以编写一个自定义插件,例如创建一个插件的基本框架。插件需要遵循一定的接口约定,以便与主检测系统进行交互,我们可以定义一个名为 CustomPlugin 的类,该类包含一个名为extract_watermark_features 的方法;接下来,使用正则表达式来搜索包含WM_START 和WM_END前缀和后缀标记的字符串水印。在注册了自定义插件之后,主检测系统将自动调用CustomPlugin 类的 extract_watermark_features 方法来提取特定的水印特征。这种插件式的架构允许用户轻松地扩展系统的功能,以满足特定的需求。
进一步,所述特征比较模块使用序列比对、编辑距离或其他先进的匹配算法来提高所述水印特征匹配和核验的精度。
进一步,所述系统可缓存已提取的所述水印特征以便在后续比较中直接使用,并实现增量处理机制,只分析所述源代码的改动部分。
示例应用参考:假设有两段Python代码,我们希望通过本系统判断它们是否具有同源性。以下是实施过程:
1. 输入模块读取待比较的两段Python代码;
2. 预处理模块移除代码中的注释、空白字符和格式,并对变量命名进行归一化;
3. 抽象语法树AST转换模块将源代码转换为AST;
4. 特征提取模块提取语法结构特征和语义特征,并将提取的特征传递给特征比较模块和插件管理模块;
5. 插件管理模块加载Python插件,提取和匹配代码中的水印特征,并将提取的水印特征传递给特征比较模块;
6. 特征比较模块计算两段代码的语法结构特征、语义特征和水印特征相似度;
7. 判断模块根据计算得出的相似度值判断两段代码是否具有同源性;
8. 若具有同源性,匹配和核验模块匹配和核验源代码中的非混淆性质的水印特征,例如特定字符串、特定代码片段或特定算法实现;
9. 匹配和核验模块输出匹配和核验结果,将结果呈现给用户或保存到检测报告中。
应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。

Claims (3)

1.一种基于源代码水印的同源性检测方法,其特征在于,包括以下步骤:
S1、读取待比较的至少两段源代码;
S2、对每段所述源代码执行预处理方法,包括源代码语言的识别和移除注释、空白字符、格式预处理步骤,以及归一化变量命名;
S3、将每段所述源代码转换成抽象语法树AST表示;
S4、对每个所述AST进行模式匹配,提取语法结构特征和语义特征,所述语法结构特征提取包括:遍历所述AST,提取循环结构、条件结构和异常处理结构,所述语义特征的提取包括:使用程序切片和数据依赖图提取变量类型、函数参数类型和返回值类型;
S5、使用插件式架构,根据不同的编程语言和框架,提取和匹配所述源代码中的水印特征,所述插件式架构允许用户根据需要编写自定义插件以适应特定的所述编程语言和框架,以便更准确地提取和匹配所述源代码中的所述水印特征,缓存已提取的所述水印特征以便在后续比较中直接使用,并实现增量处理机制,只分析源代码的改动部分;
S6、比较两段所述源代码的语法结构特征、语义特征和水印特征相似度;
S7、设定相似度阈值,并根据计算出的所述相似度阈值判断两段所述源代码是否具有同源性,以避免误判问题;
S8、若判断出两段所述源代码具有同源性,则进一步核验非混淆性质的所述水印特征,所述核验方法包括若在非混淆性质的所述水印特征核验中发现两段所述源代码具有显著相似之处,则最终确定它们具有同源性,若未发现显著相似之处,则需要对初始的同源性判断进行修正;非混淆性质的所述水印特征包括代码中的特定字符串、特定代码片段或特定算法实现,所述特定算法包括排序算法或加密算法;
所述方法包括使用序列比对或编辑距离匹配算法来提高所述水印特征匹配和核验的精度;
所述方法包括对所述源代码中的控制流和数据流进行分析,以提取更丰富的语义信息,所述控制流和所述数据流分析可采用基于程序切片、数据依赖图或数据流图的方法实现,以便更好地识别代码的执行路径和数据传递关系,提高语义特征的提取精度。
2.根据权利要求1所述的基于源代码水印的同源性检测方法,其特征在于,所述方法采用多线程或多进程并行处理多个源代码文件,以提高处理速度。
3.一种基于源代码水印的同源性检测系统,所述系统用于实现权利要求1所述的方法,其特征在于,包括:
输入模块:用于读取待比较的至少两段源代码;
预处理模块:用于对每段所述源代码执行预处理方法,包括源代码语言的识别和移除注释、空白字符、格式预处理步骤,以及归一化变量命名;
抽象语法树AST转换模块:用于将每段所述源代码转换成抽象语法树AST表示;
特征提取模块:用于对每个所述AST进行模式匹配,提取语法结构特征和语义特征,所述语法结构特征提取包括:遍历所述AST,提取循环结构、条件结构和异常处理结构,所述语义特征的提取包括:使用程序切片和数据依赖图提取变量类型、函数参数类型和返回值类型;
插件管理模块:用于加载并管理提取所述源代码特征的插件,根据不同的编程语言和框架,提取和匹配所述源代码中的水印特征,所述插件管理模块允许用户根据需要编写自定义插件以提取特定的所述水印特征;
特征比较模块:用于比较两段源代码的语法结构特征、语义特征和水印特征相似度,所述特征比较模块使用序列比对或编辑距离匹配算法来提高所述水印特征匹配和核验的精度;
判断模块:用于设定相似度阈值,并根据计算出的相似度阈值判断两段所述源代码是否具有同源性,以避免误判问题;
匹配和核验模块:用于匹配和核验所述源代码中的非混淆性质的所述水印特征,包括代码中的特定字符串、特定代码片段或特定算法实现;
所述输入模块读取待比较的至少两段所述源代码并传递给所述预处理模块;所述预处理模块进行预处理操作并将预处理后的所述源代码传递给所述抽象语法树AST转换模块;所述抽象语法树AST转换模块生成AST并将所述AST传递给所述特征提取模块;所述特征提取模块提取语法结构特征和语义特征,并将提取的特征传递给所述特征比较模块和所述插件管理模块;所述插件管理模块加载和调用插件,提取和匹配所述源代码中的所述水印特征,并将提取的所述水印特征传递给所述特征比较模块;所述特征比较模块计算两段所述源代码的相似度,并将计算得出的相似度值传递给所述判断模块;所述判断模块设定相似度阈值并根据计算得出的所述相似度值判断所述源代码是否具有同源性,若具有同源性则将结果传递给所述匹配和核验模块进行所述水印特征的匹配和核验;所述匹配和核验模块输出匹配和核验结果,所述系统缓存已提取的所述水印特征以便在后续比较中直接使用,并实现增量处理机制,只分析所述源代码的改动部分。
CN202310667105.1A 2023-06-07 2023-06-07 一种基于源代码水印的同源性检测方法及系统 Active CN116414445B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310667105.1A CN116414445B (zh) 2023-06-07 2023-06-07 一种基于源代码水印的同源性检测方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310667105.1A CN116414445B (zh) 2023-06-07 2023-06-07 一种基于源代码水印的同源性检测方法及系统

Publications (2)

Publication Number Publication Date
CN116414445A CN116414445A (zh) 2023-07-11
CN116414445B true CN116414445B (zh) 2023-08-29

Family

ID=87059666

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310667105.1A Active CN116414445B (zh) 2023-06-07 2023-06-07 一种基于源代码水印的同源性检测方法及系统

Country Status (1)

Country Link
CN (1) CN116414445B (zh)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101567958A (zh) * 2009-05-19 2009-10-28 杭州海康威视软件有限公司 基于非冗余的Contourlet变换的半脆弱性数字水印系统
CN103065095A (zh) * 2013-01-29 2013-04-24 四川大学 一种基于指纹识别技术的web漏洞扫描方法和漏洞扫描器
CN111126031A (zh) * 2019-12-12 2020-05-08 南京谦萃智能科技服务有限公司 代码文本处理方法及相关产品
CN111240687A (zh) * 2020-01-09 2020-06-05 华东师范大学 源代码静态分析装置
CN115309451A (zh) * 2022-06-28 2022-11-08 腾讯科技(深圳)有限公司 代码克隆检测方法、装置、设备、存储介质及程序产品
CN115422541A (zh) * 2022-09-22 2022-12-02 浙江工商大学 基于ast多维特征融合的智能合约代码克隆检测方法

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9110769B2 (en) * 2010-04-01 2015-08-18 Microsoft Technology Licensing, Llc Code-clone detection and analysis
US9886249B2 (en) * 2015-11-16 2018-02-06 Sap Se Universal transcompiling framework

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101567958A (zh) * 2009-05-19 2009-10-28 杭州海康威视软件有限公司 基于非冗余的Contourlet变换的半脆弱性数字水印系统
CN103065095A (zh) * 2013-01-29 2013-04-24 四川大学 一种基于指纹识别技术的web漏洞扫描方法和漏洞扫描器
CN111126031A (zh) * 2019-12-12 2020-05-08 南京谦萃智能科技服务有限公司 代码文本处理方法及相关产品
CN111240687A (zh) * 2020-01-09 2020-06-05 华东师范大学 源代码静态分析装置
CN115309451A (zh) * 2022-06-28 2022-11-08 腾讯科技(深圳)有限公司 代码克隆检测方法、装置、设备、存储介质及程序产品
CN115422541A (zh) * 2022-09-22 2022-12-02 浙江工商大学 基于ast多维特征融合的智能合约代码克隆检测方法

Also Published As

Publication number Publication date
CN116414445A (zh) 2023-07-11

Similar Documents

Publication Publication Date Title
Jain et al. Contrastive code representation learning
Tufano et al. Deep learning similarities from different representations of source code
CN109885479B (zh) 基于路径记录截断的软件模糊测试方法及装置
CN102339252B (zh) 基于xml中间模型以及缺陷模式匹配的静态检测系统
Roy et al. NICAD: Accurate detection of near-miss intentional clones using flexible pretty-printing and code normalization
US11775414B2 (en) Automated bug fixing using deep learning
CN106843840B (zh) 一种基于相似度分析的源代码版本演化注释复用方法
Brody et al. A structural model for contextual code changes
CN109857641B (zh) 对程序源文件进行缺陷检测的方法及装置
CN112699665B (zh) 一种安全报告文本的三元组抽取方法、装置及电子设备
CN108170468B (zh) 一种自动检测注释和代码一致性的方法及其系统
US20100199355A1 (en) Method of protecting digital documents against unauthorized uses
CN115309451A (zh) 代码克隆检测方法、装置、设备、存储介质及程序产品
CN112131120B (zh) 一种源代码缺陷检测方法及装置
CN111881300A (zh) 面向第三方库依赖的知识图谱构建方法及系统
CN115269427A (zh) 针对web注入漏洞的中间语言表示方法及系统
CN110750297B (zh) 一种基于程序分析和文本分析的Python代码参考信息生成方法
Sheneamer CCDLC detection framework-combining clustering with deep learning classification for semantic clones
Yuan et al. Java code clone detection by exploiting semantic and syntax information from intermediate code-based graph
CN113778852B (zh) 一种基于正则表达式的代码分析方法
Prado et al. X9: An Obfuscation Resilient Approach for Source Code Plagiarism Detection in Virtual Learning Environments.
Harmon et al. Toward automated grammar extraction via semantic labeling of parser implementations
CN116414445B (zh) 一种基于源代码水印的同源性检测方法及系统
KR102671575B1 (ko) 교차 아키텍처 바이너리에 대한 이진 비교 방법
CN114546836A (zh) 基于下推自动机引导的公共组件库自动化测试方法及装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant