type
status
date
slug
summary
tags
category
icon
password
什么是虚假控制流
之前由说过不透明谓词,虚假控制流也利用了这一点
虚假控制流指,是指通过向正常控制流中插入若干不可达基本块(永远不会被执行的基本块)和由不透明谓词造成的虚假跳转,以产生大量垃圾代码干扰攻击者分析的混淆技术。
比如看一下这个不透明谓词(前面有篇文章,[[代码混淆技术基本原理]],提到过)
这是最简单的一种情况,实际上的虚假控制流复杂情况比这个强千倍
虚假的跳转和冗余的不可达基本块导致了大量垃圾代码,严重干扰了攻击者的分析,比如下面这个虚假控制流
虚假控制流流程结构
与控制流平坦化不同,经过虚假控制流混淆的控制流图呈长条状
虚假控制流混淆原理
虚假控制流是以基本块为单位进行混淆的,每个基本块要经过分裂、克隆、构
建虚假跳转等操作
顺便回顾一下控制流平坦化是以函数为基本单位进行混淆
虚假控制流实现
实现步骤
虚假控制流要比控制流平坦化实现起来要简单一点,只需要三步
- 基本块拆分
- 基本块克隆
- 构造虚假跳转
基本块拆分
- 通过 getFirstNonPHI 函数获取第一个不是 PHINode 的指令,以该指令为界限进行分割,得到 entryBB 和 bodyBB(看一下上面的图就明白了)
- 以 bodyBB 的终结指令为界限进行分割,最终得到头部、中部和尾部三个基本块,也就是 entryBB, bodyBB 和 endBB(上图所示) 代码实现
基本块克隆
- 克隆中间的 bodyBB,得到克隆块 cloneBB
- LLVM 自带 CloneBasicBlock 函数,但该函数为不完全克隆,还需要做一些补充处理,所以我们把基本块的克隆操作写到 createCloneBasicBlock 函数中
CloneBasicBlock 函数引发的问题
- 在克隆的基本块中,仍然引用了原基本块中的 %a 变量,该引用是非法的,所以需要将 %a 映射为 %a.clone,最后再根据 VMap 对克隆基本块中的变量进行修复
构造虚假跳转
- 将 entryBB 到 bodyBB 的绝对跳转改为条件跳转
- 将 bodyBB 到 endBB 的绝对跳转改为条件跳转
- 添加 cloneBB 到 bodyBB 的绝对跳转