joern 基本使用介绍

目录

  • 写在前面
  • 参考文章
  • Install
  • 启动joern
  • 生成CPG(常用)
    • 使用importCode生成CPG(最常用,在命令行端解析c/java代码为属性图等)
    • 直接导入source code snipt(在命令行端直接解析输入的一段代码)
    • 使用joern-parse生成CPG(主要用于python代码中的调用解析,并不是直接用于命令行端的,命令行详细调用见写在文章最前面的本人另一篇博客地址)
    • 查看生成的CPG所在位置
    • 导出为json文件
    • 导出为dot文件
  • CPG可视化
    • 在控制台端直接画图
    • 获取.dot文本形式
  • loadCpg加载已经解析好的cpg.bin
  • runScript
    • scala script
    • Importing Additional Scripts
  • search call、 argument
    • filrter过滤器
    • where 过滤器
    • map过滤器

写在前面

看完这个有了基础之后有需要的话可以参考我的另外一篇在python中批量生成CPG等图的文章

参考文章

JOERN后续可能会有更新,如果本文和官方文档有冲突的地方建议参考最新官方文档
joern官方文档
CSDN 破落之实用户的一些文章
破落之实
破落之实

Install

Prerequisites:Java 8 or higher
Link: https://openjdk.java.net/install/
JOERN运行环境需要Java8或者以上版本支持,需要提前安装。在有Java环境之后,最简单的办法就是安装预编译的joern-cli。预编译我理解的就是类似windows下的.exe文件,可以一键安装应用
注意Joern官方目前很活跃,在持续更新,有朋友补充了自己踩的坑:Joern只支持jdk11,不支持其他jdk,大家可以作为参考。博文里面的内容执行起来有问题的话建议大家去看一下最新版的Joern官方文档,博客里面有地址。
这里我直接安装的预编译版本的joern-cli

# Install pre-built binaries of the joern-cli 
git clone https://github.com/ShiftLeftSecurity/joern
cd joern
sudo ./joern-install.sh

在这里插入图片描述

启动joern

如下图,启动joern,进入命令行界面
joern 基本使用介绍_第1张图片

生成CPG(常用)

使用importCode生成CPG(最常用,在命令行端解析c/java代码为属性图等)

进入目录/joern-cli/,执行下列指令下载示例程序x42

git clone git@github.com:ShiftLeftSecurity/x42.git
# 上面的git clone命令不好使的话,写下面的
git clone https://github.com/ShiftLeftSecurity/x42.git

joern 基本使用介绍_第2张图片

使用importCode指令为程序x42 下的c代码文件创建一个代码属性图

注意:joern解析c语言文件的时候,导入到指令的是folder,而不是.c或者.cpp文件,这里的"./x42/c"内容如下:
joern 基本使用介绍_第3张图片
从上图可以看出,./x42/c是一个包含4个.c文件的文件夹

importCode(inputPath="./x42/c", projectName="x42-c")
# inputPath是代码路径,projectName是工程名称,

#下次用joern就可以直接使用open(projectName)打开
#如:open("x42-c")
open("x42-c")

joern解析C语言代码的时候输入的是文件夹,解析Java的时候,输入的是jar包

# java的解析
joern> importCode("./x42/java/X42.jar", "x42-java")
Creating project `x42-java` for code at `./x42/java/X42.jar`
// ...output trimmed
res2: Option[Cpg] = Some(io.shiftleft.codepropertygraph.Cpg@5d41bf70)

直接导入source code snipt(在命令行端直接解析输入的一段代码)

val code = """
void foo () {
  int x = source();
  if(x < MAX) {
    int y = 2*x;
    sink(y);
  }
}
"""
importCode.c.fromString(code)

使用joern-parse生成CPG(主要用于python代码中的调用解析,并不是直接用于命令行端的,命令行详细调用见写在文章最前面的本人另一篇博客地址)

注意,使用joern-parse生成CPG是在没有使用./joern启动joern情况下使用joern-parse

# 指令格式
joern-parse $CodeDirectory 

# 运行之后就可以在testaa文件夹下看到生成的内容
使用importCpg载入testaa下生成好的cpg、
importCpg("../tarpitc.bin.zip")

查看生成的CPG所在位置

分析过程中生成的所有文件都保存在workspace中,projectName="x42-c"保存位置如下:
joern 基本使用介绍_第4张图片

可以在joern的shell界面通过workspace命令对其进行访问,查看你之前建立的所有工程状态

这样我们可以查询到各个工程的状态,有时候忘记自己建立的工程的名字,也可以在这里查看到。

joern 基本使用介绍_第5张图片

共有三栏信息:
第一栏:项目地址/名称
第二栏:内容CPG/PDG...
第三栏:True/False是该工程是否在内存中打开

joern 基本使用介绍_第6张图片

导出为json文件

joern shell支持Linux的管道

将所有方法节点写入/tmp/foo.json

cpg.method.toJson |> "/tmp/foo.json"

joern 基本使用介绍_第7张图片

导出为dot文件

#生成cpg.bin 
joern-parse /src/directory  
#基于cpg.bin文件生成别的图 
joern-export [cpg-name] --repr pdg --out outdir

在这里插入图片描述
参考博客里面有具体介绍,我不再赘述

joern 基本使用介绍_第8张图片

CPG可视化

需要安装graphviz工具

sudo apt-get install graphviz

我出现了以下错误:
joern 基本使用介绍_第9张图片
尝试解决:

# 暂时不知道原因
sudo apt --fix-broken install

joern 基本使用介绍_第10张图片

然后重新使用apt-get安装,成功

joern 基本使用介绍_第11张图片

在控制台端直接画图

# 先导入一段代码,得到cpg
joern> importCode.c.fromString( """
           int myfunc(int b) {
             int a = 42;
             if (b > 10) {
                foo(a)
             }
             bar(a);
           }
           """
       ) 
# ??
joern> run.ossdataflow
# You can now plot the AST as follows:
joern> cpg.method("myfunc").plotDotAst 

# 其他
cpg.method($name).plotDotAst // plot AST
cpg.method($name).ploDotCfg // plot CFG
...
cpg.method($name).plotDotCpg14 // plot CPG'14

joern 基本使用介绍_第12张图片

获取.dot文本形式

# You can obtain the dot representation of the AST as well:
cpg.method("myfunc").dotAst.l

# 其他
cpg.method($name).dotAst.l // output AST in dot format
cpg.method($name).dotCfg.l // output CFG in dot format
...
cpg.method($name).dotCpg14.l // output CPG'14 in dot format

joern 基本使用介绍_第13张图片
joern 基本使用介绍_第14张图片
joern 基本使用介绍_第15张图片

loadCpg加载已经解析好的cpg.bin

loadCpg 指令
或者 open指令
open("x42-c")

具体如下图:
joern 基本使用介绍_第16张图片
joern 基本使用介绍_第17张图片

runScript

后续有时间再更

scala script

Importing Additional Scripts

search call、 argument

filrter过滤器

where 过滤器

map过滤器

你可能感兴趣的:(程序依赖图,程序语义理解,程序表示,joern)