Tigress学习系列【3】(Flatten)

Flatten

Flatten官网地址

1 控制流扁平化混淆过程如下所示。

在这里插入图片描述

2 命令选项

OptionArgumentsDescription
- -TransformFlatten使用Wang Chenxi的算法实现控制流扁平化
- - FlattenDumpBlocksBOOLSPEC如果为真则打印线性化基本块,如果为假则保持原样,默认为假
- -FlattenSplitBasicBlocksBOOLSPEC如果为真,没有中间分支的赋值序列和调用语句的基本块被分割成单独的块,如果为假则保持原样,默认为假
- -FlattenRandomizeBlocksBOOLSPEC如果为真,基本块序列将被随机化,如果为假则保持原样,默认为假
- - FlattenTraceBOOLSPEC如果为真,在每个块执行之前打印一条消息,如果为假则保持原样,默认为假

3 其他命令

3.1 调度方式
OptionArgumentsDescription
- -FlattenDispatchswitch, goto, indirect, call, *Flatten支持switch, goto, indirect, call这四种调度方式。*表示随机选择一种调度方式
- -FlattenNumberOfBlocksPerFunctionINTSPEC每个生成的用于call调度函数的块数,默认为1
- -FlattenSplitNamestringcall调度生成的函数名,默认为split
3.2 分支语句
OptionArgumentsDescription
- -FlattenConditionalKindsbranch, 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 混淆下一个变量
OptionArgumentsDescription
- -FlattenObfuscateNextBOOLSPEC调度变量是否应该使用不透明的表达式进行混淆,默认为假
- -FlattenOpaqueStructslist, array, *要使用的不透明谓词类型,list表示使用链表生成不透明的表达式,array表示使用数组生成不透明的表达式,*表示与链表,数组相同
- -FlattenImplicitFlowNextbool在地址的计算和随后的间接跳转或调用之间插入隐式流,仅适用于indirect, call调度方式,默认为假
- -FlattenImplicitFlowS-Expression插入的隐式流类型,默认为none

4 实验

未混淆程序为flatten.c

tigress --Environment=x86_64:Linux:Gcc:4.8.5 --Transform=Flatten --Functions=main --out=flatten_obf.c flatten.c
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值