joern如何运行——初探

目录

 

1 joern的安装

2 joern导入代码

2.1 填充数据库

2.2 启动数据库服务器

3 使用python-joern分析代码

3.1 测试前的准备

3.2 开始测试


 

1 joern的安装

请看我的上一篇博客【joern安装】

2 joern导入代码

本文算是官方文档的一个搬运,加入了一些自己的理解。小子不才,建议英文基础好的人还是去看官方文档吧。

2.1 填充数据库

  1. 完成joern的安装后,进入joern的安装目录,我的安装目录在/home/linux用户名/joern-0.3.1

  2. 填充数据库

    1. 两种方法,根据填充的数据的大小来采用不同的方法

    2. 第一种:分析小型程序

      1.  // 模板
         java -jar $JOERN/bin/joern.jar $CodeDirectory

        $JOERN:joern安装目录,$CodeDirectory:待分析的程序目录

      2.  // 实际运行,示例
         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,然后重复此步骤。

    3. 第二种:分析大型程序

      1.  // 模板
         java -Xmx$SIZEg -jar $JOERN/bin/joern.jar $CodeDirectory

        $JOERN:joern安装目录,$CodeDirectory:待分析的程序目录,$SIZE:给jvm分配内存 (以GB为单位)

      2.  // 实际运行,实例
         sudo java -Xmx1g -jar /home/linux用户名/joern-0.3.1/bin/joern.jar /home/linux用户名/joern-0.3.1/testcode/
  3. 常见问题:

    1. 问题1:

      1. 问题描述:Caused by: java.lang.NoClassDefFoundError: javax/transaction/TransactionManager

      2. joern如何运行——初探_第1张图片

      3. 解决方法:上网查找,有一位博主遇到过类似的问题。只要下载jta.jar,再将jta.jar放入neo4j-community-2.1.8的lib文件夹中,即可解决该问题。

      4. jta.jar的下载地址: https://download.oracle.com/otndocs/jcp/jta-1.1-classes-oth-JSpec/?submit=Download 下载类文件 Class Files,然后自己打包成jar文件,或者直接修改后缀名zip为jar

      5. 补充:其实不用这么麻烦,之前有这个问题是因为我以前安装jdk的方法错误,导致系统不能有效的识别我安装的jdk1.7。在我的上一篇博客中,有新的jdk安装方法。按照此方法安装jdk,就不会出现这个问题。

    2. 问题2:

      1. 问题描述:

      2. joern如何运行——初探_第2张图片

      3. 问题分析:上次运行该命令后,没有清理.joernIndex文件夹,系统认为环境不安全,建议你先清理文件夹

      4. 解决方案:删了他!!!(即删除.joernIndex文件夹)

      5.  执行命令:
         sudo rm -rf .joernIndex
    3. 问题3:待续

 

2.2 启动数据库服务器

  1. 配置 joern创建的数据库的位置

    1. 进入/usr/Neo4j/neo4j-community-2.1.8目录

    2. 执行命令

       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仅设置一次。

  2. 验证服务器能否开启:

    1. 执行命令:

       cd ..
       cd bin
       sudo ./neo4j start

      可能会启动失败

      使用如下命令再次启动服务器

       sudo ./neo4j start-no-wait
    2. 打开浏览器,输入localhost:7474,即可看到如下网页:

      1. joern如何运行——初探_第3张图片

      2. 证明能成功启动neo4j

    3. 上一步显示成功后,先关闭neo4j,执行命令

       sudo ./neo4j stop
  3. 开启服务器:

    1. 执行命令

       sudo ./neo4j console
    2. 进入浏览器,输入localhost:7474

      1. 可看到如下界面:

      2. joern如何运行——初探_第4张图片

      3. 点击“IS_AST_PARENT”,即可看到如下页面:

      4. joern如何运行——初探_第5张图片

      5. 对上图的一些解释: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是指节点的属性。(参照一篇博客,原文链接:

        https://blog.csdn.net/water_likly/article/details/89378623)

至此,官方文档第二部分已阅读完毕

 

3 使用python-joern分析代码

 

3.1 测试前的准备

  1. 已经执行过“导入代码” ,“填充数据库”的操作

  2. 了解你导入的代码含有哪些函数

  3. 创建一个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")') # 注意:函数名不一定是main,要根据自己的测试程序来填写该参数
     # res =  j.runCypherQuery('...')
     ​
     for r in res: print r
  4. 保证你的neo4j服务器处于开启状态,即已经运行了如下命令:

     sudo ./neo4j console

     

 

3.2 开始测试

  1. 进入test.py所在目录,输入如下命令,运行python程序:

     python test.py
  2. 系统会输出该函数所在的节点,截图如下:

    1. 输出是该节点的一些信息

 

 

未完待续

你可能感兴趣的:(代码分析,joern)