看完这个有了基础之后有需要的话可以参考我的另外一篇在python中批量生成CPG等图的文章
JOERN后续可能会有更新,如果本文和官方文档有冲突的地方建议参考最新官方文档
joern官方文档
CSDN 破落之实用户的一些文章
破落之实
破落之实
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-cli/,执行下列指令下载示例程序x42
git clone git@github.com:ShiftLeftSecurity/x42.git
# 上面的git clone命令不好使的话,写下面的
git clone https://github.com/ShiftLeftSecurity/x42.git
使用importCode指令为程序x42 下的c代码文件创建一个代码属性图
注意:joern解析c语言文件的时候,导入到指令的是folder,而不是.c或者.cpp文件,这里的"./x42/c"内容如下:
从上图可以看出,./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)
val code = """
void foo () {
int x = source();
if(x < MAX) {
int y = 2*x;
sink(y);
}
}
"""
importCode.c.fromString(code)
注意,使用joern-parse生成CPG是在没有使用./joern
启动joern情况下使用joern-parse
# 指令格式
joern-parse $CodeDirectory
# 运行之后就可以在testaa文件夹下看到生成的内容
使用importCpg载入testaa下生成好的cpg、
importCpg("../tarpitc.bin.zip")
分析过程中生成的所有文件都保存在workspace
中,projectName="x42-c"
保存位置如下:
可以在joern的shell界面通过workspace
命令对其进行访问,查看你之前建立的所有工程状态
这样我们可以查询到各个工程的状态,有时候忘记自己建立的工程的名字,也可以在这里查看到。
共有三栏信息:
第一栏:项目地址/名称
第二栏:内容CPG/PDG...
第三栏:True/False是该工程是否在内存中打开
joern shell支持Linux的管道
将所有方法节点写入/tmp/foo.json
cpg.method.toJson |> "/tmp/foo.json"
#生成cpg.bin
joern-parse /src/directory
#基于cpg.bin文件生成别的图
joern-export [cpg-name] --repr pdg --out outdir
需要安装graphviz工具
sudo apt-get install graphviz
# 暂时不知道原因
sudo apt --fix-broken install
然后重新使用apt-get安装,成功
# 先导入一段代码,得到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
# 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
loadCpg 指令
或者 open指令
open("x42-c")
后续有时间再更