前言
最近因为项目需要,所以开始阅读joern工具的源码。在阅读源码之前,需要将其导入IDEA中方便我们能够更好地学习源码,因为IDEA中可以查看程序之间的跳转关系,继承关系或是重写关系等等,而且还可以进行debug调试。下面记录下踩到的坑方便后面有需要重新配置环境。
IDEA导入
我们首先需要将Joern工程文件夹导入IDEA。直接导入最上层的文件夹joern
即可:
导入的时候会遇到Gradle配置选项,这里选择第2项Use grable 'wrapper' task configuration
:
选择OK
即可,导入的过程可能会有点漫长,因为需要远程下载所需要的组件:
导入完成后,项目结构之间的联系就建立起来了,否则我们可能甚至无法利用IDEA查看类之间的继承和重写关系。
导入的时候可能还会遇到这样的问题:
报错的原因就是,操作符 <<
在Gradle 4.x中被弃用(deprecated),并且在Gradle 5.0 被移除(removed)。所以相应的解决办法就是将<<
改为doLast
:
1 | task deploy(dependsOn: build) << { |
改为:
1 | task deploy(dependsOn: build) doLast { |
Debug环境配置
IDEA版本选择
为了方便debug,我直接在虚拟机中安装了IDEA,这里我使用的IDEA版本是2019的,没有使用最新版的IDEA是因为我发现使用2020.3版本的IDEA在打开gradle项目的时候会crash:
网上搜索发现了这篇文章https://youtrack.jetbrains.com/issue/IDEA-248140
下面有网友留言因为这个bug,他一直坚持使用2020.1版本,因为更高版本的会有crash的问题:
Debug参数设置
我们在使用joern将nodes.csv
和rels.csv
转成cpg_edges.csv
代码属性图,对应的命令是:
1 | ./phpast2cpg nodes.csv rels.csv |
所以我们需要传递两个参数nodes.csv
和rels.csv
,如何向IDEA传递命令行参数呢?
设置Program arguments
为我们需要的命令行参数:
然后在程序入口处打上断点:
能够命中断点并且传递的参数也正确。执行完发现在相应目录下也生成了cpg_edges.csv
文件,说明配置正确。
接下来就可以正常调试了。
后记
这次阅读joern中php-cpg相关部分的源码对我来说也是一个全新的挑战,配好环境后也能更方便地开始学习了。加油💪!!!