前言

最近因为项目需要,所以开始阅读joern工具的源码。在阅读源码之前,需要将其导入IDEA中方便我们能够更好地学习源码,因为IDEA中可以查看程序之间的跳转关系,继承关系或是重写关系等等,而且还可以进行debug调试。下面记录下踩到的坑方便后面有需要重新配置环境。

IDEA导入

我们首先需要将Joern工程文件夹导入IDEA。直接导入最上层的文件夹joern即可:

2

导入的时候会遇到Gradle配置选项,这里选择第2项Use grable 'wrapper' task configuration

3

选择OK即可,导入的过程可能会有点漫长,因为需要远程下载所需要的组件:

1

导入完成后,项目结构之间的联系就建立起来了,否则我们可能甚至无法利用IDEA查看类之间的继承和重写关系。

导入的时候可能还会遇到这样的问题:

4

解决方法:https://stackoverflow.com/questions/33727502/gradle-leftshift-operator-with-task-needed-is-it-superfluous

报错的原因就是,操作符 << 在Gradle 4.x中被弃用(deprecated),并且在Gradle 5.0 被移除(removed)。所以相应的解决办法就是将<<改为doLast

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
task deploy(dependsOn: build) << {
copy {
into "projects/octopus/plugins"
from fileTree("projects/plugins").files
include '**/*.jar'
exclude '**/*-plain.jar'
includeEmptyDirs = false
}

copy {
into "projects/octopus/extensions"
from fileTree("projects/extensions").files
include '**/*.jar'
exclude '**/lucene-core-3.6.2.jar'
exclude '**/*-plain.jar'
includeEmptyDirs = false
}

}

改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
task deploy(dependsOn: build) doLast {
copy {
into "projects/octopus/plugins"
from fileTree("projects/plugins").files
include '**/*.jar'
exclude '**/*-plain.jar'
includeEmptyDirs = false
}

copy {
into "projects/octopus/extensions"
from fileTree("projects/extensions").files
include '**/*.jar'
exclude '**/lucene-core-3.6.2.jar'
exclude '**/*-plain.jar'
includeEmptyDirs = false
}

}

5

Debug环境配置

IDEA版本选择

为了方便debug,我直接在虚拟机中安装了IDEA,这里我使用的IDEA版本是2019的,没有使用最新版的IDEA是因为我发现使用2020.3版本的IDEA在打开gradle项目的时候会crash:

6

网上搜索发现了这篇文章https://youtrack.jetbrains.com/issue/IDEA-248140

下面有网友留言因为这个bug,他一直坚持使用2020.1版本,因为更高版本的会有crash的问题:

7

Debug参数设置

我们在使用joern将nodes.csvrels.csv转成cpg_edges.csv代码属性图,对应的命令是:

1
./phpast2cpg nodes.csv rels.csv

所以我们需要传递两个参数nodes.csvrels.csv,如何向IDEA传递命令行参数呢?

8

设置Program arguments为我们需要的命令行参数:

9

然后在程序入口处打上断点:

10

能够命中断点并且传递的参数也正确。执行完发现在相应目录下也生成了cpg_edges.csv文件,说明配置正确。

接下来就可以正常调试了。

后记

这次阅读joern中php-cpg相关部分的源码对我来说也是一个全新的挑战,配好环境后也能更方便地开始学习了。加油💪!!!