目录
1 joern的安装
请看我的上一篇博客
2 joern导入代码
本文算是官方文档的一个搬运,加入了一些自己的理解。小子不才,建议英文基础好的人还是去看官方文档吧。
2.1 填充数据库
-
完成joern的安装后,进入joern的安装目录,我的安装目录在/home/linux用户名/joern-0.3.1
-
填充数据库
-
两种方法,根据填充的数据的大小来采用不同的方法
-
第一种:分析小型程序
-
// 模板 java -jar $JOERN/bin/joern.jar $CodeDirectory
$JOERN:joern安装目录,$CodeDirectory:待分析的程序目录
-
// 实际运行,示例 sudo java -jar /home/linux用户名/joern-0.3.1/bin/joern.jar /home/linux用户名/joern-0.3.1/testcode/
joern-0.3.1文件夹内自带一个testcode文件夹,用于测试
该命令运行完后会在该目录(joern-0.3.1)下生成一个 .joernIndex的隐藏文件(ctrl+h可以查看)。注意,如果此目录已经存在,则joern.jar就会在其中添加代码,因此在每次你想要创建一个新的数据库之前需要删除.joernIndex,然后重复此步骤。
-
-
第二种:分析大型程序
-
// 模板 java -Xmx$SIZEg -jar $JOERN/bin/joern.jar $CodeDirectory
$JOERN:joern安装目录,$CodeDirectory:待分析的程序目录,$SIZE:给jvm分配内存 (以GB为单位)
-
// 实际运行,实例 sudo java 1 -jar /home/linux用户名/joern-0.3.1/bin/joern.jar /home/linux用户名/joern-0.3.1/testcode/
-
-
-
常见问题:
-
问题1:
-
问题描述:Caused by: java.lang.NoClassDefFoundError: javax/transaction/TransactionManager
-
-
解决方法:上网查找,有一位博主遇到过类似的问题。只要下载jta.jar,再将jta.jar放入neo4j-community-2.1.8的lib文件夹中,即可解决该问题。
-
jta.jar的下载地址: https://download.oracle.com/otndocs/jcp/jta-1.1-classes-oth-JSpec/?submit=Download 下载类文件 Class Files,然后自己打包成jar文件,或者直接修改后缀名zip为jar
-
补充:其实不用这么麻烦,之前有这个问题是因为我以前安装jdk的方法错误,导致系统不能有效的识别我安装的jdk1.7。在我的上一篇博客中,有新的jdk安装方法。按照此方法安装jdk,就不会出现这个问题。
-
-
问题2:
-
问题描述:
-
-
问题分析:上次运行该命令后,没有清理.joernIndex文件夹,系统认为环境不安全,建议你先清理文件夹
-
解决方案:删了他!!!(即删除.joernIndex文件夹)
-
执行命令: sudo rm -rf .joernIndex
-
-
问题3:待续
-
2.2 启动数据库服务器
-
配置 joern创建的数据库的位置
-
进入/usr/Neo4j/neo4j-community-0.3.1目录
-
执行命令
cd conf sudo gedit neo4j-server.properties 在该文件中,找到org.neo4j.server.database.location这一行 修改为: org.neo4j.server.database.location = / $ path_to_index / .joernIndex /
/$path_to_index/是joern文件夹的存放位置
例如,如果你的
.joernIndex位于/home/user/joern/.joernIndex,则配置文件应包含以下行:#neo4j-server.properties org.neo4j.server.database.location = / home / user / joern / .joernIndex /
请确保
org.neo4j.server.database.location仅设置一次。
-
-
验证服务器能否开启:
-
执行命令:
cd .. cd bin sudo ./neo4j start
可能会启动失败
使用如下命令再次启动服务器
sudo ./neo4j start-no-wait
-
打开浏览器,输入localhost:7474,即可看到如下网页:
-
-
证明能成功启动neo4j
-
-
上一步显示成功后,先关闭neo4j,执行命令
sudo ./neo4j stop
-
-
开启服务器:
-
执行命令
sudo ./neo4j console
-
进入浏览器,输入localhost:7474
-
可看到如下界面:
-
-
点击“IS_AST_PARENT”,即可看到如下页面:
-
-
对上图的一些解释: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是指节点的属性。(参照一篇博客,原文链接:
-
-
至此,官方文档第二部分已阅读完毕
3 使用python-joern分析代码
3.1 测试前的准备
-
已经执行过“导入代码” ,“填充数据库”的操作
-
了解你导入的代码含有哪些函数
-
创建一个test.py文件,内含如下内容:
from joern.all import JoernSteps j = JoernSteps() j.setGraphDbURL('http://localhost:7474/db/data/') # j.addStepsDir('Use this to inject utility traversals') j.connectToDatabase() res = j.runGremlinQuery('getFunctionsByName("main")') # res = j.runCypherQuery('...') for r in res: print r -
保证你的neo4j服务器处于开启状态,即已经运行了如下命令:
sudo ./neo4j console
3.2 开始测试
-
进入test.py所在目录,输入如下命令,运行python程序:
python test.py
-
系统会输出该函数所在的节点,截图如下:
-
-
输出是该节点的一些信息
-
未完待续