代码属性图CPG之数据流图DFG-精简版

admin 2024年6月2日20:46:19评论3 views字数 2504阅读8分20秒阅读模式

引言

CPG中的DFG系列共分为三篇,三篇文章加起来将近10000字了,针对每个表达式类型都做了非常详尽的讲解,内容已经非常全面且细致了,绝对值得一读,先放个链接哈,想要学习的同学可直接点击链接跳转哈:

但笔者转念一想,想要从这么多内容中提取要点(或者自己关注的点)还是需要点功夫的,所以嘞,笔者就以自己粗浅的开发经验,从如何利用CPG中的DFG做开发工作的角度,总结一下常见的使用场景,方便大家更快地理解掌握重点(若对总结的要点有疑惑的,可以点击文章底部合集标签代码属性图CPG,去对应的文章中找详细的介绍)

tips:本文几乎不会讲解新的内容,本文是一个精简版,是对前文CPG中的DFG的提炼,若对这块很熟的同学可以忽略哈~

OK,正文开始~

DFG常见使用场景总结

1.CPG运行逻辑回顾

CPG的运行逻辑图回顾:

代码属性图CPG之数据流图DFG-精简版

不知道大家有没有详细看这张图,我们之前讲的DFG相关的内容都是属于图中红色方框标出来的模块,也就是Passes阶段的Data Flow Graph,当然,在抽丝剥茧代码属性图CPG-第三弹:CPG中的DFG-2Reference小节中,提到了ControlFlowSensitiveDFGPass,这个是属于图中黄色方框模块的,也就是Control-Flow Sensitive Data Flow Graph。对这块不太熟的同学,建议大家点击 抽丝剥茧代码属性图CPG-第一弹:CPG介绍 回顾一下。

在第一篇文章中讲到,CPG中的Pass是有执行顺序的,也就是说,有的Pass要依赖其他Pass的输出结果。

tips: Data Flow Graph 对应源码中的 DFGPass,Control-Flow Sensitive Data Flow Graph 对应源码中的ControlFlowSensitiveDFGPass

现在我们来看看DFGPassControlFlowSensitiveDFGPass与其他Pass的依赖关系

  • DFGPass依赖SymbolResolver
代码属性图CPG之数据流图DFG-精简版
img
  • SymbolResolver依赖TypeResolverTypeHierarchyResolverEvaluationOrderGraphPass
代码属性图CPG之数据流图DFG-精简版
  • TypeHierarchyResolver依赖TypeResolver
代码属性图CPG之数据流图DFG-精简版
  • TypeResolverEvaluationOrderGraphPass不需要依赖其他Pass
代码属性图CPG之数据流图DFG-精简版
代码属性图CPG之数据流图DFG-精简版

这些Pass间的依赖关系与图中从左到右的顺序是对应的,大家可直接看图,比较直观

2.CallExpression之Known function

DFG边

  • CallExpression的实参流向被调用方法的形参
  • 被调用方法的声明流向CallExpression
代码属性图CPG之数据流图DFG-精简版

3. AssignExpression

DFG边

  • rhs 流向 lhs
代码属性图CPG之数据流图DFG-精简版

4.Reference之ControlFlowSensitiveDFGPass

Reference(引用类型)是在日常开发中最常见的的节点类型。

抽丝剥茧代码属性图CPG-第三弹:CPG中的DFG-2中讲到的Reference(引用类型)的DFG构建分为普通的DFGPass与控制流敏感的ControlFlowSensitiveDFGPass,经笔者研究,DFGPass实用性极低,故此处就不再总结。

一元操作符(++,--)及复杂二元操作符(+=-=*=/=)此处不作总结。

DFG边

  • 变量声明:initializer  -->  VariableDeclaration
代码属性图CPG之数据流图DFG-精简版
  • 变量读取:当前读取语句之前的最后一次写入 --> 当前读取

tips:若在变量读取前有分支语句,并且if块和else块内都有对变量的写入操作,CPG会将if块和else块的变量写入语句都流向当前的变量

代码属性图CPG之数据流图DFG-精简版
  • 变量简单赋值(operatorCode为=):
    • rhs --> lhs
    • lhs --> next read access of reference
代码属性图CPG之数据流图DFG-精简版

5.MemberExpression

成员表达式(MemberExpression)关注以下字段:

  • base: Expression: 被访问字段所属的对象表达式
  • refersTo: Declaration?: 被访问字段的声明,如果源码中未实现相应的类,则该字段为null

成员表达式(MemberExpression)代表对对象字段的访问,并通过 base 属性 Reference 类进行了扩展

如果相应类的实现可用(refersTo不为null),其处理方式与Reference一致。如果refersTo字段为null,则base会流向该MemberExpression

DFG边:

  • refersTo != null
    • MemberExpressionReference的子类,若其refersTo字段不为null,那么其处理方式与Reference一致
  • refersTo == null
    • base --> MemberExpression

6.ForStatement

for循环语句(ForStatement)关注以下字段:

  • condition: Statement: for循环的条件
  • conditionDeclaration: Statement: 条件声明语句

DFG边:

  • condition --> ForStatement
  • conditionDeclaration --> ForStatement
代码属性图CPG之数据流图DFG-精简版

7.IfStatement

if语句(IfStatement)关注以下字段:

  • condition: Statement: if语句的条件
  • conditionDeclaration: Statement: 条件声明语句

DFG边:

  • condition --> IfStatement
  • conditionDeclaration --> ForStatement
代码属性图CPG之数据流图DFG-精简版

技术交流群

进群方式:

1.点击公众号菜单栏"点击进群",加笔者好友(备注进群)-- 推荐

2.扫码进群

代码属性图CPG之数据流图DFG-精简版

原文始发于微信公众号(CodeAnalyzer Ultra):代码属性图CPG之数据流图DFG-精简版

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年6月2日20:46:19
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   代码属性图CPG之数据流图DFG-精简版https://cn-sec.com/archives/2806996.html

发表评论

匿名网友 填写信息