文章目录
在joern中可以通过运行脚本来对生成的CPG进行分析,首先我们提取出其AST。
cpg.runScripts("graph/ast-for-funcs-dumps.sc")
这时会在当前目录下,也就是 joern-cli/$
下生成一个 ast-for-funcs.json 的文件。然后我们用Python来对此文件进行分析。
首先我们要弄清楚,AST的数据结构是怎么构建的?我们输入的是每个函数实体,joern会将这个函数的内部调用函数组成的子AST。在生成的json文件中,节点或边是以 id: 的形式出现的。即io.shiftleft.codepropertygraph.generated.edges
io.shiftleft.codepropertygraph.generated.nodes
对于其内部的每个函数来说,具体数据结构如下 :
一个json文件通过 load() 方法载入后,会转换成一个字典。而这个字典是一个嵌套的结构,在第一层只有一个key即是 functions,value是一个列表。这个列表里存着的元素也是字典。字典的数目即是生成的子AST的数目。
每个字典有以下几种键值对。
{
"function":"gwy_resource_class_mkdir", #此函数的函数名
"id":"io.shiftleft.codepropertygraph.generated.nodes.Method@7", #此节点的类型 .nodes表示节点 .Method表明节点类型是一个调用的方法 @7表明编号
"AST":[
{
"id":"io.shiftleft.codepropertygraph.generated.nodes.MethodParameterIn@8", #表明这第一个节点类型是 MethodParameterIn,@8 表明编号
"edges":[
{
"id":"io.shiftleft.codepropertygraph.generated.edges.Ast@191a2",
"in":"io.shiftleft.codepropertygraph.generated.nodes.MethodParameterIn@8",
"out":"io.shiftleft.codepropertygraph.generated.nodes.Method@7",
}], #每个节点的边用列表来进行存储,其中每条用字典来存储,其键值对有三对 key:边的id,源节点,终节点,value都是id。
"properties":[
{
"key":"NAME",
"value":"klass"
},
{
"key":"COLUMN_NUMBER",
"value":"25"
},
{
"key":"ORDER",
"value":"1"
},
{
"key":"LINE_NUMBER",
"value":"1"
},
{
"key":"EVALUATION_STRATEGY",
"value":"BY_VALUE"
},
{
"key":"TYPE_FULLNAME",
"value":"GwyResourceClass *"
}
]#每个节点还有几个性质,每个性质是一个字典,可能为了方便用key和value键值对来进行查询,不建在一个字典内。分别是name、column_number、line_number、order、evaluation_strategy、type_fullname。name表示该节点本身的string 表示;type_fullname表示该节点的类型的全称(这个节点是变量,即变量的类型);column_number、line_number是表示该节点的位置、evaluation_strategy(这个不知道是什么)。每个节点的性质不是固定的,某些性质有些节点有但有些节点没有。
}
...
{}
] #这是此函数的AST结构,分别由各节点的字典组成
}
节点有但有些节点没有。
}
…
{}
] #这是此函数的AST结构,分别由各节点的字典组成
}