AI 逆向工程与代码理解实战 · 第 07 章 代码属性图Joern


AI 逆向工程与代码理解实战 · 第 07 章 代码属性图Joern

章节摘要:第 06 章的两台引擎各自封闭:semgrep 活在规则文件里,CodeQL 活在数据库里。本章引入第三种表达——代码属性图(CPG):把 AST 的结构、CFG 的流向、PDG 的依赖融合成一张可查询的图,代表平台是 Joern(约 3.6k stars,Apache-2.0,Scala 实现)。7.1 节讲清三张旧地图各自的盲区,以及「一张图」为什么改变了分析方式,并与 CodeQL 数据库做同异对比;7.2 节上手实战:导入代码库无需构建环境,在 REPL 里用几条 Scala DSL 查询找危险函数调用、追参数流向;7.3 节是本书的差异化卖点——经 Ghidra 前端把 x86 二进制也生成 CPG,让源码图谱与二进制图谱说同一种查询语言。学完本章,你手里的代码模型从「引擎私产」变成「一张可自由遍历的图」,且这张图同时覆盖源码与二进制两个世界。

学习目标

  • 说清 AST、CFG、PDG 各自回答什么问题、看不见什么。
  • 理解 CPG 把三种图融合为一张图的 schema 思想与查询优势。
  • 独立完成 Joern 安装、源码导入与 REPL 查询。
  • 写出「找危险函数调用」与「追参数到 sink 的可达性」两类典型查询。
  • 了解经 Ghidra 前端导入 x86 二进制生成 CPG 的流程与边界。
  • 与 CodeQL 数据库做同异对比,形成三工具选型直觉。

核心概念速览

# ch07_cpg.txt —— 代码属性图(CPG):三张旧地图拼成一张新地图 AST(结构) CFG(流向) PDG(依赖) 谁包含谁 执行到哪 谁影响谁 │ │ │ └──────────────────┼──────────────────┘ ▼ 同一套节点,三种边并存 CPG │ Scala DSL 自由遍历 (源码图谱与二进制图谱同语言) ​

一句话金句:AST 管结构、CFG 管流向、PDG 管依赖——CPG 让你一次遍历同时问三个问题。

(文字流程图)代码 ──▶ 节点与边的统一 schema ──▶ 图遍历查询 ──▶ 结构、流向、依赖混合答案。

子章节导航

  • 第 7.1 节《CPG:一张图看懂代码》:三张旧地图的盲区、CPG 三合一的 schema、一张图如何改变分析方式、与 CodeQL 数据库的异同。
  • 第 7.2 节《Joern查询实战》:安装与 REPL、导入代码库、找危险函数调用、追参数流向、无构建环境导入的便利。
  • 第 7.3 节《Ghidra二进制前端》:x86 二进制经 Ghidra 前端入图、同一套查询语言查 stripped 二进制、源码图与二进制图对照分析。

三节递进:7.1 建图思维,7.2 在源码图上练手,7.3 把同样的功夫用到二进制图上。

子章节之间的逻辑关系

# ch07_logic.txt —— 三节递进:导入练查询,同语言查二进制 ┌──────────────┐ 导入源码练查询 ┌──────────────┐ 同语言查二进制 ┌──────────────┐ │ 7.1 CPG 模型 │ ──────────────▶ │ 7.2 Joern 实战│ ───────────────▶ │ 7.3 二进制前端│ │ 三合一 schema │ │ DSL 与污点 │ │ 源码与二进制 │ │ (为什么) │ │ (怎么用) │ │ 打通(差异化)│ └──────────────┘ └──────────────┘ └──────────────┘ ​

7.2 的每条查询语法在 7.3 原样可用——这正是「一张图」承诺的兑现:学会一次,源码与二进制通吃。

前置知识与后续延伸

  • 前置:第 06 章双引擎建立的「代码可查询」心智;第 01 章《Ghidra地基》的反汇编基础(7.3 节用到);AST 与编译器术语出处见《build-your-own-x》第 09 章《造操作系统与编译器》。
  • 延伸阅读:Joern 官方文档(joern.io)与官方教程是查询语法的权威来源,本节细节以官方文档为准。
  • 后续:第 08 章用符号执行回答「图上可能的路径,运行时是否真的可达」;第 10 章把 CPG 查询用作 AI 假设的验证器之一。

合规声明:本节内容仅用于授权范围内的安全研究与教育目的;未经授权对他人软件进行逆向工程可能违反法律与许可协议。


作者与出处
原作者: 灏天文库
整理: 灏天文库整理
本站整理收录,版权归原作者/开源协议所有;欢迎通过原文链接访问源仓库。
发布者: 作者: 灏天文库 转发
评论区 (0)
U