Flatten
Flatten官网地址
1 控制流扁平化混淆过程如下所示。
2 命令选项
Option Arguments Description - -Transform Flatten 使用Wang Chenxi的算法实现控制流扁平化 - - FlattenDumpBlocks BOOLSPEC 如果为真则打印线性化基本块,如果为假则保持原样,默认为假 - -FlattenSplitBasicBlocks BOOLSPEC 如果为真,没有中间分支的赋值序列和调用语句的基本块被分割成单独的块,如果为假则保持原样,默认为假 - -FlattenRandomizeBlocks BOOLSPEC 如果为真,基本块序列将被随机化,如果为假则保持原样,默认为假 - - FlattenTrace BOOLSPEC 如果为真,在每个块执行之前打印一条消息,如果为假则保持原样,默认为假
3 其他命令
3.1 调度方式
Option Arguments Description - -FlattenDispatch switch, goto, indirect, call, * Flatten支持switch, goto, indirect, call这四种调度方式。*表示随机选择一种调度方式 - -FlattenNumberOfBlocksPerFunction INTSPEC 每个生成的用于call调度函数的块数,默认为1 - -FlattenSplitName string call调度生成的函数名,默认为split
3.2 分支语句
Option Arguments Description - -FlattenConditionalKinds branch, compute, flag 变换条件分支的方法,默认为branch
其中,branch用于普通分支,如if (a>b) goto L1 else goto L2。compute用于计算分支,如 x=(a>b); goto *(expression over x)。flag用于根据标志寄存器的值计算的分支,如 asm(“cmp a b;pushf;pop”); goto *(expression over flag register)。
3.3 混淆下一个变量
Option Arguments Description - -FlattenObfuscateNext BOOLSPEC 调度变量是否应该使用不透明的表达式进行混淆,默认为假 - -FlattenOpaqueStructs list, array, * 要使用的不透明谓词类型,list表示使用链表生成不透明的表达式,array表示使用数组生成不透明的表达式,*表示与链表,数组相同 - -FlattenImplicitFlowNext bool 在地址的计算和随后的间接跳转或调用之间插入隐式流,仅适用于indirect, call调度方式,默认为假 - -FlattenImplicitFlow S-Expression 插入的隐式流类型,默认为none
4 实验
未混淆程序为flatten.c
tigress --Environment= x86_64:Linux:Gcc:4.8.5 --Transform= Flatten --Functions= main --out= flatten_obf.c flatten.c