如何用joern生成AST和cFG
时间: 2024-06-08 10:12:24 浏览: 19
Joern 是一个用于 C/C++ 代码分析的工具,可以生成 AST 和 cFG,具体操作步骤如下:
1. 安装 Joern 工具,可以参考官方文档进行安装:https://joern.readthedocs.io/en/latest/installation.html
2. 准备要分析的 C/C++ 代码,可以是单个文件或整个项目
3. 运行 Joern 命令,生成 AST 和 cFG:
- 生成 AST:使用命令 `joern-lookup -g "ast" <path/to/source/file>`,其中 `<path/to/source/file>` 为要分析的源代码文件路径,生成的 AST 结果会被输出到标准输出
- 生成 cFG:使用命令 `joern-lookup -g "cfg" <path/to/source/file>`,其中 `<path/to/source/file>` 为要分析的源代码文件路径,生成的 cFG 结果会被输出到标准输出
4. 可以将输出结果保存到文件中,使用命令 `joern-lookup -g "ast" <path/to/source/file> > ast.txt` 或 `joern-lookup -g "cfg" <path/to/source/file> > cfg.txt`
需要注意的是,生成的 AST 和 cFG 结果可能会比较复杂,需要一定的代码分析能力进行解读。
相关问题
怎样从joern的CFG图中获取AST
从Joern的CFG图中获取AST,需要进行以下步骤:
1. 通过Joern提供的Gremlin脚本,将代码转换为AST。可以使用以下命令将AST转换为JSON字符串:
```
gremlin> queryNode().emit().repeat(out()).times(10).hasLabel("Function").dedup().sideEffect{node -> nodeJson.put("type", node.label().toLowerCase()).put("id", node.id()).put("label", node.label().toLowerCase()).put("loc", getLoc(node))}.sideEffect{nodeJson.put("children", [])}.sideEffect{nodeJson.put("parent", null)}.sideEffect{nodeJson.put("index", nodeIndex)}.sideEffect{nodeIndex++}.toStream().toList().get(0)
```
2. 将AST的JSON字符串解析为AST对象,可以使用Python中的json库进行解析,例如:
```
import json
ast_json_str = "..." # 从Gremlin脚本中获取的AST的JSON字符串
ast_dict = json.loads(ast_json_str)
```
3. 将AST对象转换为AST树。在AST对象中,每个节点都有一个id和parent id,可以通过这些信息将AST对象转换为AST树。可以使用以下Python代码将AST对象转换为AST树:
```
class AstNode:
def __init__(self, id, label, loc, children=None):
self.id = id
self.label = label
self.loc = loc
self.children = children or []
self.parent = None
def build_ast_tree(ast_dict):
nodes = {}
for node_dict in ast_dict:
node_id = node_dict["id"]
node_label = node_dict["label"]
node_loc = node_dict["loc"]
nodes[node_id] = AstNode(node_id, node_label, node_loc)
for node_dict in ast_dict:
node_id = node_dict["id"]
parent_id = node_dict["parent"]
if parent_id:
nodes[parent_id].children.append(nodes[node_id])
nodes[node_id].parent = nodes[parent_id]
return nodes.values()
```
然后,可以通过以下代码调用build_ast_tree()函数将AST对象转换为AST树:
```
ast_tree = build_ast_tree(ast_dict)
```
joern 生成很多dot
joern 是一个开源项目,用于静态代码分析和漏洞检测。它可以将源代码转换成图形表示,其中每个节点代表一个代码元素,如函数、类或变量,而边表示它们之间的关系。生成的这些图被称为 dot 图,其中 dot 是一种用于描述图形的标记语言。
生成 dot 图的过程是通过对源代码进行解析和抽象语法树分析来实现的。首先,joern会将代码解析为抽象语法树,将代码中的各种元素转化为节点和边,形成一个包含代码结构的图。然后,joern会根据特定的规则和算法分析这些图,检测代码中的漏洞和潜在问题。最后,joern会将生成的 dot 图输出,以便用户可以可视化、分析和进一步处理。
通过生成 dot 图,用户可以更好地理解和分析代码的结构和逻辑,快速定位可能存在的问题和漏洞,并进行进一步的代码优化和安全性改进。除了 dot 图,joern 还提供了其他功能,如代码查询和导出,从而帮助开发人员更好地进行代码理解和调试。
综上所述,joern 生成很多 dot 图,这些图可帮助开发人员进行代码分析、漏洞检测和代码优化工作。