当前位置:   article > 正文

Joern的代码使用-devign_joern1.0版本

joern1.0版本

最近一直在做关于图神经网络试验的复现,但是开源的代码真的是少之又少,说起我和joern的爱恨离愁还真是有很长时间了

一. 初试

最近开始对于图神经网络开始初步进行研究,结合之前所做的漏洞检测相关方向,结合趋势决定做使用图神经网络应用漏洞检测问题,通过阅读国内外论文,总结该问题上解决的基本步骤,以及不同论文中在个步骤中采取的不同措施。
在这里插入图片描述
总而言之,分为以下三步

  • 代码构图
  • 图的向量化
  • 神经网络设计
    综合考虑,结合创新型与可实现行而言,指定以下策略用于后期的实现
  • 代码构图—joern
  • 图的向量化—word2vec+ onehot
  • 神经网络设计
    从此我joern结缘

二. joern

对于joern的安装,我参考了以下文章,特此感谢
[https://blog.csdn.net/jlu_wangqi/article/details/109412399](https://blog.csdn.net/jlu_wangqi/article/details/109412399)
[https://blog.csdn.net/water_likly/article/details/88415127](https://blog.csdn.net/water_likly/article/details/88415127)
[https://blog.csdn.net/u013648063/article/details/106811275](https://blog.csdn.net/u013648063/article/details/106811275)
[https://blog.csdn.net/water_likly/article/details/89378623?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4.pc_relevant_default&utm_relevant_index=](https://blog.csdn.net/water_likly/article/details/89378623?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-4.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-4.pc_relevant_default&utm_relevant_index=5)
[https://blog.csdn.net/m0_37924639/article/details/78783592](https://blog.csdn.net/m0_37924639/article/details/78783592)
[https://blog.csdn.net/God_Jn/article/details/103238013](https://blog.csdn.net/God_Jn/article/details/103238013)
**主要通过第一二文章做,最后选择第三篇中的方法**
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 最后做到完全配置成功,但是最后由于Neo4j的版本问题导致失败,失败的过程可单独发文说明,总共耗时两天,最后无果而终,但是除了Neo4j的版本问题我感觉我的配置绝对没有任何问题,如果有合适老版本的Neo4j的小伙伴欢迎私信我。
  • 不建议尝试老版本的joern安装,建议使用新版本的joern-cli,直接进入joern的官方网站查看官方文档安装即可,具体的安装过程见文章

三. joern-cli

关于joern-cli的安装我直接参考的joern官方安装文档,这我一看不有手就行,但是三个问题限制了我

sudo ./joern-parse / home/code/
sudo ./joern-export cpg.bin --repr pdg --out /home/joern-cli/pdg
dot -Tpng -o test1.png ./pdg/1-pdg.dot
  • 1
  • 2
  • 3

AST
在这里插入图片描述
CPG
在这里插入图片描述
PDG
在这里插入图片描述
CFG
在这里插入图片描述

answer three :导出图的时候已经除夕当天了,过年解决了工作的问题,嘿嘿嘿

四. 代码中使用问题

由于见识到了joern的威力,所以这个论文复现的活一致拖到了开学,最近两天再复现文章的时候遇到了种种问题
  • 1
(一)指定计划
  1. 确定复现文章:基于关系图卷积网络的源代码漏洞检测
  2. 寻找合适的开源文章:Devign Effective Vulnerability Identification by Learning Comprehensive Program Semantics via Graph Neural Networks
  3. 选择代码:第一个链接是一位大佬自己复现的,代码容易看懂,但是对于边的处理仅限于AST。第二个链接是论文的官方作者的代码仅关于训练过程,第二个链接是论文的对于数据处理,建立图,以及图的向量化过程代码。但是由于第二个代码量很大,并且数据比较大实现难度较大,同时我们并不想复现改文章而是主要想借用其建立图的过程,故选择开源代码一
    https://github.com/epicosy/devign
    https://github.com/saikat107/Devign
    https://github.com/VulDetProject/ReVeal
    代码一的代码结构如下
    在这里插入图片描述
(二)跑代码
  1. 配置环境:环境要求如下,对于joern来说,直接把之前下好的joern-cli压缩包放入joern文件夹下即可,同时使用anaconda建立虚拟环境GNN,然后对于Python库可以使用pip ininstall 一切。
    在这里插入图片描述
    note:
    **tip1:**除了gensim库的版本要求为3.8.1以外,其他库版本无要求,pip就行,用高版本的gensim也可以就是需要修改一些代码中的参数名比较麻烦,
    **tip2:**在windows下配环境的时候遇到过安装torch_sparse和torch_geometic报错的问题,详见文章

  2. 调整代码:
    problem one 详见文章
    problem two 由于joern版本问题在 devign-master\src\prepare\cpg_generator需修改输出文件夹参数,并且由于java与joern版本适配问题需添加执行sudo,故修改joern_parse函数为

def joern_parse(joern_path, input_path, output_path, file_name):
    out_file = file_name + ".bin"
    joern_parse_call = subprocess.run([sudo,"./" + joern_path + "joern-parse", input_path, "--out", output_path + out_file],
                                      stdout=subprocess.PIPE, text=True, check=True)
    print(str(joern_parse_call))
    return out_file
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

此时我并未注意危险的来临,一顿操作也让代码运行了起来,没想到埋下了很大隐患

四. 问题解决

(一)问题的产生

清早起来拥抱太阳,满满的正能量,我想通过自己的想法复现那篇文章,想通过生成图后的节点和边提取入手,但是让我发现了一个问题。那就是当执行python main.py -c时虽然成功调用了joern,但是产生了一些报错,同时提示文件not process。
在这里插入图片描述
我发现是graph-for-funcs.sc文件产生报错

(二)解决方案的查找
  • 上各大网站查找,但是发现很少附后
  • 后来想到可能由于这个开源代码并没有很多人复现,不如上github上找这个项目看看有无伙伴提出问题,直接在github上搜graph-for-funcs.sc选择issue专题查看,查看再三发现以下几个解决入口
(三)解决方案的查找
  • java版本
    首先根据joern在github上的官方文档上的要求jdk11,并且同时根据报错我发现是库引入错误,同时并不是每一条import均有问题,考虑到是java版本升级的问题,故将jdk8升至jdk11,但最终升级也无济于事。
  • graph-for-funcs.sc版本
    在这里插入图片描述
    通过作者的提示我明显感觉到了graph-for-funcs.sc版本与joern-cli版本的适配问题十分关键,接着查看作者所说issue3,在隐藏问题当中,我们看到作者更新过,所以我尝试使用新版本以及老版本,同时在https://github.com/epicosy/devign/issues/9
    中同样有人提出版本问题,总共实验三次,均无果,值得说的是在第三种版本的graph-for-funcs.sc文件很多人提出解决了问题,所有版本文件均保留
    在这里插入图片描述
  1. joern-cli版本
    通过在github上搜寻关键字graph-for-funcs.sc查看一些解答,https://github.com/epicosy/devign/issues/9
    最终问题在上面网页中得到解答,通过阅读这些讨论内容我得到以下几个结论
  • java版本不是问题的根源

  • graph-for-funcs.sc 和 joern-cli的适配问题是问题的根源,同时两者适配性很强

  • joern-cli更新极快,可能每天都在更新

  • 该graph-for-funcs.sc 代码下,joern-cli 1.0.170比较适用,但是我们现在使用官方文档方法默认下载最新版本。
    在这里插入图片描述

    最后我上joern-cli的各版本下载网站查看joern-cli 1.0.170,同时查看devign开源代码中文件graph-for-funcs.sc更新时间

joern-cli 1.0.170
在这里插入图片描述
graph-for-funcs.sc更新时间
在这里插入图片描述
发现graph-for-funcs.sc更新时间在joern-cli 1.0.170发布后两天,作者应该是基于joern-cli 1.0.170做的graph-for-funcs.sc,故下载joern-cli 1.0.170压缩包解压放入代码的joern文件夹下运行,解决问题。并且在后续无意中我发现了一个更好玩的事情详见文章
在这里插入图片描述
如果大家实操过程存在问题或者有什么想和博主交流的,可以关注博主公众号
在这里插入图片描述

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号