代码混淆技术系列
代码混淆技术之虚假控制流
00 分钟
2022-12-21
2024-11-11
type
status
date
slug
summary
tags
category
icon
password

什么是虚假控制流

之前由说过不透明谓词,虚假控制流也利用了这一点
虚假控制流指,是指通过向正常控制流中插入若干不可达基本块(永远不会被执行的基本块)和由不透明谓词造成的虚假跳转,以产生大量垃圾代码干扰攻击者分析的混淆技术。
比如看一下这个不透明谓词(前面有篇文章,[[代码混淆技术基本原理]],提到过)
notion image
这是最简单的一种情况,实际上的虚假控制流复杂情况比这个强千倍 虚假的跳转和冗余的不可达基本块导致了大量垃圾代码,严重干扰了攻击者的分析,比如下面这个虚假控制流
notion image

虚假控制流流程结构

与控制流平坦化不同,经过虚假控制流混淆的控制流图呈长条状
notion image

虚假控制流混淆原理

虚假控制流是以基本块为单位进行混淆的,每个基本块要经过分裂、克隆、构 建虚假跳转等操作 顺便回顾一下控制流平坦化是以函数为基本单位进行混淆
notion image

虚假控制流实现

实现步骤

虚假控制流要比控制流平坦化实现起来要简单一点,只需要三步
  1. 基本块拆分
  1. 基本块克隆
  1. 构造虚假跳转

基本块拆分

  • 通过 getFirstNonPHI 函数获取第一个不是 PHINode 的指令,以该指令为界限进行分割,得到 entryBB 和 bodyBB(看一下上面的图就明白了)
  • 以 bodyBB 的终结指令为界限进行分割,最终得到头部、中部和尾部三个基本块,也就是 entryBB, bodyBB 和 endBB(上图所示) 代码实现

基本块克隆

  • 克隆中间的 bodyBB,得到克隆块 cloneBB
    • notion image
  • LLVM 自带 CloneBasicBlock 函数,但该函数为不完全克隆,还需要做一些补充处理,所以我们把基本块的克隆操作写到 createCloneBasicBlock 函数中

CloneBasicBlock 函数引发的问题

  • 在克隆的基本块中,仍然引用了原基本块中的 %a 变量,该引用是非法的,所以需要将 %a 映射为 %a.clone,最后再根据 VMap 对克隆基本块中的变量进行修复

构造虚假跳转

  • 将 entryBB 到 bodyBB 的绝对跳转改为条件跳转
  • 将 bodyBB 到 endBB 的绝对跳转改为条件跳转
  • 添加 cloneBB 到 bodyBB 的绝对跳转
notion image

参考于

上一篇
代码混淆技术之指令替换
下一篇
代码混淆技术之控制流平坦化