SySeVR复现指南

前言

该文章是对SySeVR框架进行复现,环境搭建可以看以下文章,复现的过程笔者会尽量详细一些,但可能难免包含一些错误,仅供大家参考。

SySeVR环境搭建指南-CSDN博客文章浏览阅读806次,点赞20次,收藏21次。最近在学习通过深度学习进行漏洞检测,而SySeVR作为一个经典的框架,就准备将其复现出来,看了许许多多的文章,大多讲的的不是很清楚,并且老版本的joern也很难搭建成功,会引发各种各样的问题,于是就记录一下复现的过程,主要参考以下博主的资料(讲的很细,但是笔者跟着做的时候出现了难以解决的问题,遂放弃)1、SySeVR环境配置(上)_sysevr 复现代码-CSDN博客文章浏览阅读1.4k次。kali切换中文 kali换源 kali安装并切换Java版本_sysevr 复现代码。icon-default.png?t=O83Ahttps://blog.csdn.net/qq_51507718/article/details/134931634?spm=1001.2014.3001.5501

环境:joern 0.3.1(jdk 1.7)、neo4j 2.1.5、python 3.6、tensorflow 1.6、gensim 3.4

以下有几点说明

实验用到的数据集是我只从NVD数据集里面挑选的一些,然后在桌面新建一个文件夹NVD,把挑选好的数据放到里面,另外还要把NVD_diff解压到桌面,这个可以不用筛选github上面的代码有点错误,改正的代码除了最后的神经网络训练部分是自己改的,其他都是参考这个博主的

4、SySeVR复现——Generating slices-CSDN博客文章浏览阅读1.9k次,点赞6次,收藏7次。SySeVR复现_sysevr复现icon-default.png?t=O83Ahttps://blog.csdn.net/qq_55202378/article/details/127973104?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170252519616800226525615%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170252519616800226525615&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-4-127973104-null-null.nonecase&utm_term=SySeVR&spm=1018.2226.3001.4450

在运行过程中要注意路径、文件夹建立的问题最后的结果笔者也不能保证是对的,一来没有调参数、二来数据量可能比较少,并且准确率虽然可观,但是精确率却很低,不知道是啥原因,找到原因的希望能够告知。

笔者也写了自己的切片代码,供大家参考,如下所示。

https://github.com/glkfc/gen_sliceicon-default.png?t=O83Ahttps://github.com/glkfc/gen_slice

一、生成切片(即 SeVC)

1、使用joern解析源代码:输入是源代码文件,输出是名为.joernIndex的文件。

删除.joernIndex(这个文件是导入数据时创建的,先关闭neo4j再删除文件,不然会出现问题)  导入代码

        3. 打开数据库

2、get_cfg_relation.py:该文件用于使用 joern 工具获取函数的 CFG 图。输入是第一步的输出,输出与cfg_db中的文件夹一起存储。

mkdir cfg_db

     2.运行get_cfg_relation.py

3、Complete_PDG.py:该文件用于获取函数的PDG图。输入是 cfg_db 中的文件,输出与 pdg_db 中的文件夹一起存储。(如果数据量太大,这一步要花费好长时间,NVD的整个数据4个小时没跑完)

        1.mkdir pdg_db

        2.运行complete_PDG.py

4、access_db_operate.py:该文件用于获取函数的调用图。输入是 pdg_db 中的文件,输出与 dict_call2cfgNodeID_funcID 中的文件夹一起存储

        1.mkdir dict_call2cfgNodeID_funcID

        2.运行access_db_operate.py

5、point_get.py:该文件用于获取四种SyVC。输入是dict_call2cfgNodeID_funcID中的文件,输出是四种SyVC。

        1.运行point_get.py

6、extract_df.py:该文件用于提取切片。输入是由points_get.py生成的文件,输出是切片文件。

        1.mkdir -pv C/test_data/4

        2.python2 extract_df.py

        生成四种漏洞类型对应的SeVCs

        获得未加标签的程序切片

        查看相对应的文件,下面是snprintf相对应的切片,其中snprintf后面的30指的是这个函数位于源程序的第几行,这个表示在后面程序中会用到

7、dealfile.py:该文件用于获取nvd数据集中存在漏洞的行的行号。输入是源代码文件或func文件和diff文件。

       1. python2 dealfile.py  (运行之前要将里面的路径改一下)

        运行之后获得了一个vul_context_fun.pkl文件

        打开文件,可以看到是每一个文件中被修改的代码的行数

8、make_label_sard.py:该文件用于获取sard切片的标签(没用到)

9、make_label_nvd.py:该文件用于获取nvd切片的标签。

        1.python2 make_label_nvd.py,运行前先改一下路径

运行,运行之前先创建label_data文件夹

查看标签文件

10、data_preprocess.py:该文件用于将标签写入切片文件。

        1.修改文件

        2.创建文件节夹,运行程序

        3.查看文件

到了这边,程序切片和标签标记都已经完成了

步骤2:数据预处理

1、create_hash.py:该文件用于获取切片的哈希值。输入是extract_df.py生成的切片文件,输出是切片的哈希列表。

        1.调整路径

        2.运行程序,每一个切片都对应着一个hash,以便于把数据集中重复的元素去除(能看到相关的值是因为我在程序中输出了hash)

2、delete_list.py:该文件用于获取需要删除的切片的索引。输入是create_hash.py生成的hashlist,输出是list_delete。

        1.调整路径

        2.在当前路径下创建delete_slices文件夹,运行程序

        3.查看pkl文件,文件中存储的是重复切片的编号,比如3号切片可能与某个切片重复了

3、process_dataflow_func.py:该文件用于对切片进行处理,包括读取pkl文件以及将代码拆分到语料库中。输入是由 extract_df.py 和 make_label_sard.py(make_label_nvd.py) 生成的切片文件和标签文件,输出是以测试用例 id 命名的语料库文件。

        1、修改路径,四个路径分别为没有标签的切片路径、标签路径、重复的切片路径、要保存文件的路径

        2、运行程序

4、create_w2vmodel.py:该文件用于训练word2vec模型。输入是语料库文件,输出是 word2vec 模型。到这一步就是用pyhton3运行了

        1.修改路径,将model.txt保存在桌面上(随便哪都行)

        2.运行程序,因为要用到gensim3.4库,记得用python3安装一下

 5、get_dl_input.py:该文件用于通过训练好的word2vec模型将语料库文件中切片的标记转换为向量。输入是训练好的word2vec模型和语料库文件,输出是向量文件。

        1.修改路径

        2.运行程序

6、dealrawdata.py:该文件用于将get_dl_input.py生成的向量定长。

        1.修改路径

        2.运行程序

        3.查看生成的数据,下图是训练数据

到此数据预处理完成!!!

第三步:深度学习模型

1、bgru.py:该文件用于训练BGRU模型并获得测试结果。输入是由dealrawdata.py生成的向量文件,输出是训练模型和测试结果。 运行该程序的时候,我用的是python 3.6、tensorflow 1.6,可以用conda创建虚拟环境,代码用的是github上面的代码,但是有一个测试数据和训练数据路径的问题,注意甄别,可以和其他博主的代码比对一下

      训练过程

到此论文复现完成!!!

当涉及到复现diffusion算法的代码时,我需要确一下您指的是哪个具体的diffusion算法。Diffusion算法是一种用于图像处理和计算机视觉任务的图像扩散方法,有多种不同的变体和实现方式。 以下是一个简单的示例,展示了如何使用Python和OpenCV库来实现基于Diffusion的图像去噪算法: ```python import cv2 def diffusion_denoising(image, iterations, kappa, delta): # 将图像转换为灰度图 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 将灰度图转换为浮点型 gray = gray.astype(float) # 迭代应用Diffusion算法 for _ in range(iterations): # 计算梯度 grad_x = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3) grad_y = cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize=3) # 计算梯度的平方和 grad_xx = cv2.multiply(grad_x, grad_x) grad_yy = cv2.multiply(grad_y, grad_y) grad_xy = cv2.multiply(grad_x, grad_y) # 应用Diffusion公式 laplacian = cv2.Laplacian(gray, cv2.CV_64F) diffusion = kappa * (grad_xx + grad_yy) - delta * laplacian # 更新图像 gray += diffusion # 将浮点型图像转换为8位灰度图 denoised = cv2.convertScaleAbs(gray) return denoised # 读取图像 image = cv2.imread('input.jpg') # 调用Diffusion去噪函数 denoised_image = diffusion_denoising(image, iterations=10, kappa=0.1, delta=0.2) # 显示原始图像和去噪后的图像 cv2.imshow('Original Image', image) cv2.imshow('Denoised Image', denoised_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,这只是一个简单的示例,实际的Diffusion算法可能有更复杂的实现方式和参数设置。具体的复现代码可能会因算法的不同而有所变化。如果您有特定的Diffusion算法或代码实现要求,请提供更多详细信息,以便我能够更好地帮助您。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值