Tigress混淆c文件初探
由于用ollvm编译clang比较耗资源,这里采用Tigress项目来混淆c文件
先在官网下载Tigress:tigress.wtf/tigress-download.html
设置Tigress安装路径,同时将当前目录添加到环境变量
生成混淆的c文件test1_obf.c:./tigress –Seed=0 –Environment=x86_64:Linux:Gcc:7.3 –Transform=Flatten –Functions=main test1.c –out=test1_obf.c
用gcc编译生成二进制文件:gcc -O0 -std=c99 -I. test1_obf.c -o test1_obf
如果生成混淆的c文件遇到rellocarray相关报错,可以在c文件中把头文件<stdlib.h>删除,因为Tigress 的解析器无法处理现代linux发行版中stdlib.h包含的GCC属性,从而导致崩溃
Transform全部参数如下:
- 控制流混淆类 (最常用)
这类变换主要针对 IDA Pro 等反编译工具,使程序的流程逻辑变得极其复杂,难以还原逻辑图
- **
Flatten(控制流平坦化)**:这是最经典的方法。将程序的 if-else、for 等结构拉平,放入一个大的 switch 中 - **
Virtualize(代码虚拟化)**:Tigress 的核心技术。将 C 函数转换为自定义指令集(字节码),并在程序里嵌入一个解释器运行这些字节码 - **
AntiBranchAnalysis**:插入大量难以预测的跳转,破坏静态分析工具对条件分支的判断
- 数据与算术混淆类
这类变换专门用来对抗“变量跟踪”和“数学逻辑逆向”
- **
EncodeArithmetic**:将简单的a + b转换成复杂的算术表达式组合,增加运算的复杂度 - **
EncodeData**:对数据变量进行混淆(如使用不同编码或分拆变量),使内存中的数据呈现乱码状态 - **
EncodeLiterals**:隐藏程序中的常量字符串和数字,防止通过字符串搜索定位关键逻辑 - **
AntiTaintAnalysis/AntiAliasAnalysis**:防止污点分析和别名分析,让自动化的反混淆工具无法追踪变量流向
- 环境与完整性防御类
这类变换确保程序只能在预期的环境下运行,且未被篡改
- **
InitCheckEnvironment/CheckEnvironment**:插入检测代码,检查当前运行环境(如是否在调试器下、CPUID 等) - **
Checksum**:为代码块或数据段生成校验和,如果程序被修改(Patch),程序会崩溃或停止运行 - **
InitOpaque/AddOpaque/UpdateOpaque**:添加“不透明谓词”(总是真或总是假的判断条件),让反汇编器看到不存在的分支
- 辅助与初始化类 (必要步骤)
- **
Initialize**:必须先运行这个,初始化混淆环境 - **
CleanUp**:在多次混淆后进行清理,优化代码结构,防止文件无限膨胀 - **
Inline**:将函数内联,改变原始代码的结构 - **
Split**:将一个大函数拆分成多个小函数 - **
Merge**:将多个函数合并成一个,隐藏逻辑边界 - **
RandomFuns**:插入无意义的垃圾代码函数,干扰逆向工程师的注意力
- 进阶与特殊技术类
- **
SelfModify(自修改代码)**:程序运行时通过修改自身内存中的指令来实现功能,这是最高级的混淆手段之一,极难调试 - **
Jit/JitDynamic**:运行时生成机器码执行,直接对抗静态反汇编工具 - **
Measure/SoftwareMetrics**:分析并输出代码复杂度数据,用于评估混淆的效果 - **
Ident**:对函数名和变量名进行随机化(伪随机命名)
./tigress –Seed=0 –Environment=x86_64:Linux:Gcc:7.3
–Transform=Initialize
–Transform=Flatten –Functions=main,MD5Transform,MD5Update
–Transform=Virtualize –Functions=main
–Transform=CleanUp
out1.c –out=out1_obf.c
混淆后的流程图
混淆后的伪代码
混淆前的流程图
混淆前的伪代码