基于C和Python编程实现源代码的软件同源性分析与漏洞检测系统

目录
1 毕业设计设计任务书 4
1.1 毕业设计设计目的 4
1.2 毕业设计设计要求 4
1.3 系统环境 5
1.4 实验过程记录 6
2 绪言 7
2.1 字符串匹配同源性检测 7
2.2 控制流程图CFG源代码同源性检测 7
2.3 漏洞检测 8
3 系统方案设计 9
3.1 系统方案设计 9
3.2 字符串匹配同源性检测 9
3.3 CFG匹配源代码同源性检测 9
3.4 栈缓冲区溢出 10
3.5 格式化字符串漏洞检测 10
3.6 分布式任务调度 11
3.7 堆缓冲区检测 11
3.8 整数宽度溢出检测 11
3.9 整数运算溢出检测 11
3.10 空指针引用 11
4 系统实现 12
4.1 字符串匹配的同源性检测 12
4.1.1 检测流程 12
4.1.2 关键函数说明 12
4.1.3 LCS函数 13
4.1.4 相似性计算 15
4.2 CFG控制流程图的同源性检测 16
4.2.1 检测流程 16
4.2.2 关键函数说明 16
4.3 栈缓冲区溢出 17
4.3.1 检测流程 17
4.4 堆缓冲区溢出检测 18
4.4.1 检测流程 18
4.5 整数宽度溢出 18
4.5.1 检测流程 18
4.6 格式化字符串漏洞检测 19
4.6.1 检测流程 19
4.7 空指针引用 19
4.7.1 检测流程 19
4.8 分布式任务调度 19
4.8.1 运行流程 19
4.9 整数运算溢出检测 20
4.9.1 检测流程 20
4.10 UI模块 20
4.10.1 制作流程 20
5 系统测试 21
5.1 字符串匹配同源性检测 21
5.1.1 样例测试 21
5.1.2 问题解决 21
5.2 CFG同源性检测 22
5.2.1 样例检测 22
5.2.2 问题解决 22
5.3 缓冲区溢出 23
5.3.1 样例测试 23
5.4 格式化字符串输出漏洞 23
5.4.1 样例测试 23
5.5 整数溢出检测 24
5.5.1 样例测试 24
5.6 整数宽度溢出 25
5.6.1 样例测试 25
5.7 多进程调度 25
5.7.1 样例测试 25
5.8 空指针引用 26
5.8.1 样本测试 26
5.9 栈溢出检测 27
5.9.1 样本测试 27
5.10 UI界面 27
5.10.1 样例测试 27
6 总结与展望 28
6.1 总结 28
6.2 展望 28
7 参考文献 29
1.3系统环境
操作系统:Windows 10 pro
运行环境:Python 3.7.2, ply, NetworkX,Qt5,PyQt5
编程语言:Python 3.7
备注:ply是python中的Lex词法分析器组件,NetworkX是python中的图算法组件
2绪言
2.1字符串匹配同源性检测
当前,软件同源性检测技术主要分为二进制程序和源代码。计算机语言成分少,针对每门具体的语言都只有有限多个关键字,结构简单,因此基于代码层次的软件同源性检测技术具有实现简单、实行效率高等优势。源代码同源性检测主要有基于文件属性、字符串、Token、树和语义的方法等。
基于文件属性的方法采用文本信息、文本内容散列处理的方法,通过散列值比较,评估源文件(待检测文件)与目标文件的相似性。虽然检测性能高,但对于字符串替换模式的检测有效性较低。基于字符串的方法将源文件转换为字符串组,通常一个字符串对应于一行源代码,通过比对源代码程序段对应的字符串组,评估源代码间的相似性,但该方法只对于代码的完整拷贝或部分拷贝适用,对应代码拷贝修改的检测不鲁棒。基于树的方法采用语法树或抽象语法树产生源代码描述,文件比对通过语法树或抽象语法树中子树的匹配来评估[1], 子树的信息可以进一步生产指纹信息,通过指纹信息的比对,形成可能存在的克隆点。基于语义的方法,通过程序依赖图(program dependency graph)中同构子图的匹配识别不同源代码中代码的克隆关系,该方法也被用于软件重构中的程序提取。基于语法和语义在检测能力方面具有较好的表现,但其性能通常无法满足实际要求。
基于Token的方法通过源代码的词法化产生Token(标号)序列,通过Token的比对实现源代码相似性度量。该方法相对于基于文件属性的方法和基于字符串的方法具有较好的鲁棒性,并且相对于基于树的方法与基于语义的方法具有较好的性能。然而,对于代码块结构中内容的修改,该检测方法还缺乏相应的手段,如在代码块结构中插入新语句、在代码块结构中删除语句等。
2.2控制流程图CFG源代码同源性检测
基于图的抄袭检测方法[2]相对较少 , GPLAG从软件代码中构造程序依赖图(Program Dependency Graph, PDG), 通过子图同构匹配实现相似性计算; 此外, 为提高检测效率, 文章提出有 损过滤机制和基于 G-test 假设检验的过滤机制约减子图搜索空间。PDG 由于捕获了程序的数据和控制依赖关系、编码了程序逻辑, 抄袭者很难在不理解代码的前提下对 PDG作出修改, 实验证实其相比其他方法能更有效应对多种人工混淆手段。然而自动化混淆工具的混淆能力更强, 抄袭隐藏手段更高明; 此外, PDG的构建过程代价很高, 而且子图匹配是NP问题, 难以分析较大规模的软件。总的来说, GPLAG 是从学术抄袭到软件产品抄袭的初步实践, 它考虑了较为复杂的人工混淆手段, 但它对源码的需求及较高的时空花销, 使其不足以应对软件产品的抄袭。
2.3漏洞检测
早期的漏洞挖掘分析一般使用程序分析、模糊测试和符号执行等确定性的程序推理测试方法。随着技术的发展,业界开始尝试多种技术组合的方式以提高分析能力,如KLEE、Mayhem等系统采用基于优化的符号执行技术进行漏洞挖掘,RETracer、CREDAL等系统采用基于内核转储和程序分析定位漏洞点。当前研究方向已开始转向利用人工智能辅助漏洞挖掘分析[3-4],研究人员试图从程序执行历史中总结出漏洞的特征和发生原因,但因缺少先验知识的指导,无法挖掘分析深层漏洞。
基于模式的可利用性分析是当前漏洞利用验证研究的主要方法。AEG(automatic exploit generation)工具针对源码进行漏洞抽象,利用符号执行和约束求解构造exploit,判定漏洞是否可用。Mayhem和CRAX工具分别在PIN和QEMU的支持下获取漏洞相关信息,优化符号执行效率,较好地对识别的漏洞进行exploit自动化构造。Grieco等利用符号执行和模式匹配的方法可对缓冲区溢出的可利用性进行判定,但是,由于漏洞模式众多,模式提取是一项十分具有挑战的工作,限制了该方法的适用面。Miller等[基于二进制分析平台Bitblaze开发了一套异常判定工具,通过对程序执行路径进行追踪获取和异常相关的信息,并检查异常指令是否能被程序输入影响,提高了异常可利用性判定的精确度,但是它利用虚拟机仿真技术,开销很大,同时,能被输入控制的指令不一定在异常指令附近,并且可能会相距很远,依然会产生很多漏报的可用异常。此外,学者们研制出了AEG、CRAX、Driller等半自动工具,但这些工具严重依赖于对漏洞模式的抽象,应用范围有限。这些方法或工具依赖于人工经验难以规模化,或缺少全路径的数据流分析,无法确定数据与用户输入的关系,较易造成误报。
漏洞的危害评估主要依据美国的通用漏洞评分标准CVSS,其度量标准笼统,对漏洞危害性的评估不够准确。目前在大流量环境下,漏洞攻击数据包具有复杂度高,攻击行为具有高隐蔽性、持续性的特点,导致传统流量攻击检测方法精度低。

import os
import sys
import bufferoverflowDetection
import CFG
import Formatstring
import HomologyDetection
import IntegerOverflow
import IntegerWidth
import Multi
import nullpointerdetection
import stackoverflow


from UI import Ui_Dialog
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtWidgets import QApplication,QMainWindow,QWidget,QMessageBox


class window(QWidget, Ui_Dialog):
    def __init__(self):
        super(window, self).__init__()
        self.setupUi(self)

    def set_homology(self):
        res = HomologyDetection.homologyDetection() #res is a str
        self.textBrowser.setText("Homology similarity:"+str(res)+"%")

    def set_CFG(self):
        res = CFG.CFG() #res is a str
        self.textBrowser.setText("CFG similarity:"+str(res)+"%")

    def set_Buffer(self):
        res = bufferoverflowDetection.buffer() #res is a dic
        self.textBrowser.setText("Buffer Over Flow (ALERT):" + str(res))


    def set_Format(self):
        res = Formatstring.FormatString() #res is a str
        self.textBrowser.setText("Dangerous lines that format string may occur:" + str(res))


    def set_Integer(self):
        res = IntegerOverflow.IntegerOver() # res is a str
        self.textBrowser.setText("Dangerous lines that Integer overflow may occur:" + str(res))

    def set_width(self):
        res = IntegerWidth.width() # res is a str
        self.textBrowser.setText("Dangerous lines that integer width may occur:" + str(res))

    def set_Muti(self):
        res = Multi.multiprocess() # res is a list
        self.textBrowser.setText("Homology Similarity:"+str(res[0])+"%"+"\n"+ "CFG Similarity:" + str(res[1]) + "%")

    def set_Null(self):
        res = nullpointerdetection.nullpointer()
        self.textBrowser.setText("Dangerous lines that null pointers may occur:" + str(res))

    def set_stackover(self):
        res = stackoverflow.stackover()
        self.textBrowser.setText("Dangerous lines that stack over flow may occur:" + str(res))


if __name__=='__main__':
    app = QApplication(sys.argv)
    w = window()
    w.setWindowTitle('Software Security')
    w.show()
    w.pushButton.clicked.connect(w.set_homology)
    w.pushButton_2.clicked.connect(w.set_CFG)
    w.pushButton_3.clicked.connect(w.set_Buffer)
    w.pushButton_4.clicked.connect(w.set_Format)
    w.pushButton_5.clicked.connect(w.set_Integer)
    w.pushButton_6.clicked.connect(w.set_width)
    w.pushButton_7.clicked.connect(w.set_Muti)
    w.pushButton_8.clicked.connect(w.set_Null)
    w.pushButton_9.clicked.connect(w.set_stackover)

    sys.exit(app.exec_())

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值