本文仅作交流学习使用,严谨转载!!!
参考上篇博客https://blog.csdn.net/water_likly/article/details/88415127
Joern的使用主要涉及到python-joern,neo4j的操作,本文仅作初步的学习。参考链接:Joern
首先,Joern是用来分析C/C++程序的,因此,我们先从网上或者自己编写一个简单的C程序,我直接从github上下载一个自己感兴趣的项目。
1 cd $JOERN //转入你安装的joern目录(这个目录比较重要,下面会用到!)
2 插入代码:代码原型:java -jar $JOERN/bin/joern.jar $CodeDirectory
要是分析大型程序的话,需要指定内存:java -Xmx$SIZEg -jar $JOERN/bin/joern.jar $CodeDirectory
$JOERN:joern安装目录,$CodeDirectory:待分析的程序目录,$SIZE:给jvm分配内存
本文的代码为:sudo java -jar /home/****/joern-0.3.1/bin/joern.jar /home/****/testcode/giri-master
该命令运行完后会在该目录(joern-0.3.1)下生成一个 .joernIndex的隐藏文件(ctrl+h可以查看)。注意,如果此目录已经存在,则joern.jar就会在其中添加代码,因此在每次你想要创建一个新的数据库之前需要删除.joernIndex,然后重复此步骤。
3 设置neo4j,该部分为重点,如果你按照我上篇博客来安装的话,应该在/usr下发现neo4j目录,里面应该是neo4j的社区2.1.8版(我记得应该是2.1.5,但是2.1.8是完好的)。在/usr/Neo4j/neo4j-community-2.1.8/conf目录下找到neo4j-server.properties文件,并修改为上面.joernIndex的目录,之后保存退出。
4 尝试启动neo4j,首先转到neo4j的bin目录:cd /usr/Neo4j/neo4j-community-2.1.8/bin
之后运行:sudo ./neo4j start
启动失败,使用sudo ./neo4j start-no-wait
打开浏览器,localhost:7474
成功启动 neo4j。
5 验证neo4j能够正常启动后,先将neo4j关闭,运行:sudo ./neo4j stop即可。
6 运行joern:在joern的安装目录下,运行:sudo ./joern /home/*****/testcode/giri-master,结果如下:
7 之后转到neo4j的目录打开neo4j:sudo ./neo4j console //控制台下运行neo4j
8 打开浏览器,输入127.0.0.1:7474或者localhost:7474查看,按下图点击页面:
9 出现的效果:
至此,我们完成了joern对代码的初步分析,joern是借助neo4j来显示代码、文件之间的相关性的。
对上面的一些解释:
IS_PARENT_DIR_OF:为每个目录创建一个节点,并使用IS_PARENT_DIR_OF边连接这些节点,可以公开目录层次结构。
IS_FILE_OF:为每个文件创建一个节点,并使用IS_PARENT_DIR_OF边连接这些节点,结合IS_PARENT_DIR_OF可以公开目录层次结构。
IS_CLASS_OF:属性和方法声明通过IS_CLASS_OF边连接到类节点,可以通过IS_FILE_OF边和文件节点相连接。
IS_AST_PARENT_OF:抽象语法树节点通过IS_AST_PARENT_OF边连接到它们的子节点。
IS_FUNCTION_OF_AST:通过IS_FUNCTION_OF_AST边将对应的函数节点连接到AST根节点。
FLOWS_TO、REACHES:语句节点通过FLOWS_TO以及REACHES边连接到其他语句节点(
抽象语法树节点的子集)
,分别表示控制和数据流。
USE、DEF:符号节点通过use -edge连接到使用符号的所有语句节点,并通过def -edge连接到分配给符号的所有语句节点。
其他的信息:DECLERAS,POST_DOM,CONTROLS,IS_FUNCTION_OF_CFG等还没有找到具体的说明。看官们可以自行理解,要是有好的解释,可以留言,我会添加并修改。
property keys是指节点的属性。
Joern有很多优点,我会在后面的学习中慢慢掌握,希望在学习joern的同时,也能对neo4j这个图数据库有所了解。本文的内容比较简单,但却是后面分析的基础。好啦,今天到此为止!