Tigress混淆c文件初探
由于用ollvm编译clang比较耗资源,这里尝试用Tigress项目来混淆c文件
Tigress由亚利桑那大学开发,主要用于学术研究,遵循 C89/C99 标准。不同于OLLVM工作在链接前的中间层,Tigress 是一个源代码到源代码的转换器,它在设计上主要针对单个翻译单元(即单个 .c 文件)。如果代码使用 GNU 扩展(如 __attribute__)、内联汇编、或者较新的 C11/C17 特性,Tigress 很可能会解析失败或生成错误的代码。
先在官网下载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
移除Tigress自动生成有冲突的extern声明:sed -i ‘//* missing proto *//d’ out1_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全部参数如下:
- 控制流混淆类 (最常用)
这类变换主要使程序的流程逻辑变得极其复杂,难以还原逻辑图
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
混淆后的流程图
混淆后的伪代码
混淆前的流程图
混淆前的伪代码
发现混淆前后出现了flag不一致的情况
后面发现由于算法高度依赖移位,用Tigress混淆会出现问题,于是将算法实现部分放到另一个c文件中分离编译,只用Tigress混淆out.c
最终成功混淆且flag验证正确
- 标题: Tigress混淆c文件初探
- 作者: j1ya
- 创建于 : 2026-03-12 11:38:02
- 更新于 : 2026-08-23 12:10:30
- 链接: https://redefine.ohevan.com/2026/03/12/tigress混淆c文件初探/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。