Joern ast json parse

文章目录


在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结构,分别由各节点的字典组成
}


评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值