简介
控制流平坦化通过将程序中的条件分支语句转化为等价的平铺控制流来实现。通常,这包括将原始的分支语句(如if语句、switch语句)中的每个分支提取出来,并将它们放置在一系列连续的基本块中,然后使用一个状态变量或标志来选择要执行的基本块。这样,原本嵌套的条件分支结构就被展开成了一个扁平的基本块序列。
原理
具体来说,控制流平坦化的过程如下:
- 将原始的条件分支语句(如if语句)拆分为独立的基本块。
- 将这些基本块按照一定的顺序排列在一起,形成一个新的程序流程。
- 引入一个控制变量或标志,用于表示当前应该执行的基本块。
- 在程序中插入条件语句或跳转指令,根据控制变量或标志来选择执行哪个基本块。
- 在每个基本块末尾设置控制变量或标志的值,以确定下一个要执行的基本块。
- 函数的开始地址为序言的地址
- 序言的后继为主分发器
- 后继为主分发器的块为预处理器
- 后继为预处理器的块为真实块
- 无后继的块为retn块
- 剩下的为无用块
反混淆思路
https://github.com/cq674350529/deflat
实战
参考