Search-Based Local Black-Box Deobfuscation:Understand,Improve and Mitigate
基于搜索的局部黑盒反混淆:理解,改进和减轻
背景
混淆
含义:将程序P转换为功能等效但更复杂的程序P’
混合布尔算术编码(MBA) 结合算术和布尔运算(即位运算),可迭代使用以增加语法复杂性。SMT求解器无法解决MBA表达式的化简问题
虚拟化用代码P和虚拟机共同生成字节码B,程序执行依赖于虚拟机中的语义未知的处理程序(Handler)
反混淆
白盒反混淆是基于高级程序分析技术的符号方法,主要缺点是对语法异常敏感。
定义:语法是表达式的形式,语义是等价表达式的最简形式
基于搜索的黑盒反混淆
搜索——在给定搜索空间中搜索等价表达式,黑盒——只能在选定的输入下执行以观察结果。
基于搜索的黑盒反混淆遵循一定的算法框架,包括采样策略、学习策略和简化后处理。
理想的黑盒反混淆技术是无视语法复杂度的。
设计目标
本文采用基于搜索的黑盒反混淆,希望实现快速、简单性、正确性、健壮性
理解黑盒反混淆
Syntia简介
算法实现:Syntia采用随机采样输入,蒙特卡罗树搜索(MCTS)作为学习策略,Z3 SMT求解器化简
工作目标:Syntia工作于受混淆的局部代码,分析其简单语义
工作流程:
- 获取输入和输出
- 对输入进行随机采样,并观察结果输出
- 在部分表达式(例如U+x)空间上使用蒙特卡罗树搜索,尝试综合
- 正确->表达式化简;失败
对Syntia的评估
评估指标:
- 成功率(Succ. Rate):推断出的表达式的数量
- 等价率(Equiv. Rate):推断出且语义等价的表达式的数量
- 质量(Qual.):恢复表达式与原表达式运算符数量的比率
Synita原始评估采用随机生成的基准B1,因此存在输入数量和表达式类型分布不均、且半数以上为\alpha等价的问题。 本文引入的新基准B2解决了上述问题,并且将输入变量数量的上限由3个拓展到6个,且引入MBA表达式进行测试。
算子集:
评估结果:
- 在15次运行中,Syntia能够生成的表达式数量的差异约为3%。因此Syntia在运行过程中非常稳定
- 由上图可见,成功率和等价率十分接近,并且平均质量比原始表达式更好。因此Syntia是简单且正确的
- Syntia在B2上综合成功率很低,并且受超时影响很大。因此Syntia不够快速、健壮
- Syntia默认在FULL上运行,改为MBA(更小的算子集)时成功率从21%到42%。因此Syntia是算子集敏感的
最佳的Syntia
本文找到在参数上完美配置的Syntia对MBA综合成功率仅约50%,因此认为Syntia的不足是MCTS所固有的
蒙特卡罗树搜索(MCTS)
基本思想:MCTS创建一棵搜索树,每个节点可以是终点表达式(例如a+1)或部分表达式(例如U+a,其中U是非终点记号),首先关注最相关节点。
-
评估终点节点的相关性通过采样(Sampling) 来完成
-
评估部分节点,依赖于仿真(Simulation)
- 仿真:将语法的随机规则应用于部分表达式(U+a->b+a),直到它变成终点。进行采样评估,更新部分的相关性
MCTS的根本缺陷——基于仿真的部分表达式相关性估计是极不可靠的
- 部分表达式搜索空间极不稳定,随机仿真可能会返回截然不同的结果(如下图)
猜想验证:
- 受仿真指导的Syntia其行为类似枚举(BFS)搜索(如下图)
- 只有34/341(20/376)成功合成的表达式是先前最有希望的节点的子节点,表明Syntia成功合成表达式完全依靠其探索性行为
改进黑盒反混淆
作为优化问题的反混淆
改进思路:
- 建模为优化问题,而非游戏。目标是将表达式和目标表达式的距离优化到零。
- 仅操作终点而不操作部分,避免了部分表达式相关性难以评估的缺陷。
- 采用相比MCTS更具有健壮性的算法ILS,ILS专为不稳定的搜索空间而生。
算法实现:采样策略为Oracle,学习策略为S-元启发法和迭代局部搜索(ILS),简化处理使用OCaml
搜索启发法(S-metaheuristics) 。在搜索空间中移动搜索,以迭代地改进候选解决方案。存在多种启发式方法,如爬山、随机游走、模拟退火等
迭代局部搜索(ILS) 。ILS由其他搜索启发法参数化,称为侧边搜索。一旦侧边搜索找到局部最优解,ILS对其添加扰动并重新启动。
搜索:ILS从随机终点启动,迭代应用以下两个步骤
- 扰乱:随机选择AST的一个节点并用随机终点替换它迭代
- 随机突变:基于侧边搜索(爬山)迭代地改进输入表达式,突变包括用叶子或深度为1的AST替换随机节点
对Xyntia的评估
评估结果:
- 类似Syntia,Xynita运行十分稳定。
- 由图中可以看出,Xyntia是简单正确的,更需要强调的是,Xyntia在B2上仍有较好的成功率(80%以上),并且受超时时间影响小,说明Xyntia是健壮且快速的。
- Xyntia对算子集更加敏感。其经证实的等效率从 90% (Expr) 下降至 71% (Full),而 Syntia 仅从 38.7% (Expr) 下降至 33.7% (Full)。
其他S-元启发法:除了爬山的S-元启发法(随机游走、模拟退火、Metropolis Hasting)参数化的Xyntia均优于Syntia,证明了问题不适合部分探索和仿真指导的搜索。
论ILS相对MCTS的有效性:ILS很好地受到目标函数的指导,并遵循积极的演化趋势
Xyntia对比其他反混淆器
对于相同数据集的反混淆,Xyntia在高混淆程度的反混淆性能优于灰盒反混淆器QSynth,Xyntia对于各数据集的反混淆性能和效率都优于白盒反混淆器GCC和Z3简化器,Xyntia的程序合成效率优于常见的程序合成器CVC4和STOKE。
Xyntia反混淆
Xyntia对于常规混淆方法有效,受混合布尔算数编码的影响较小,不受不透明谓语、基于路径的混淆、隐蔽通道的影响。
Xyntia对基于虚拟化的混淆如用Tigress进行混淆和用VMprotect同样有效。
防御反混淆
-
防御原理
黑盒反混淆主要步骤:I/O采样和从样本中学习
防御黑盒反混淆思路:使采样阶段无法正确执行或使分析的表达式较为复杂。
-
增强语法复杂程度
实验:创建了3个不同复杂度的数据集,并用Xyntia进行黑盒反混淆。
结论:通过增加语法复杂程度能够延长反混淆时间,从而降低反混淆器性能。
-
增强语义复杂程度
实验:5个相同数据集分别进行1~5次if-then-else语义构建,对构建后的数据集用Xyntia进行黑盒反混淆。
结论:通过增强语义复杂程度增加表达式匹配难度,从而导致反混淆器成功率下降。
相关工作
-
黑盒反混淆
Syntia:搜寻表达式的随机性过大。
-
白盒反混淆
In Botnet Detection:通过将加密算法和密钥直接绑定到特定硬件设备或软件环境的技术,以增强安全性并抵抗逆向分析和密钥提取的技术,但对语法复杂度过于敏感。
-
灰盒反混淆
QSynth:I/O关系缓存(黑盒)和沿目标表达式的增量推理(白盒),但对语法复杂度的敏感程度也偏大。
-
程序合成
枚举(CVC4):从最简单的程序开始枚举所有程序,删除与规范不一致的代码片段,并返回第一个符合规范的代码。
约束(oracle):约束求解方法将目标程序的框架编码为一阶可满足性问题,并使用现成的SMT求解器来推断满足规范的实现。
随机(Stochastic superoptimization):依照一定规律随机遍历搜索空间,返回找到的第一个符合的表达式。
总结与讨论
创新。在Syntia的基础上创新性地使用迭代局部搜索,使得搜索过程更加可靠。在黑盒混淆的基础上想出了针对黑盒混淆的防御方法,为保护源代码安全做出了贡献。
当然,本文同时也存在一些不可忽视的局限性。
- 首先,语义较为复杂的表达式Xyntia无法进行推断,对于复杂程序、大型程序的反混淆效果不佳。
- 其次,对于输入和输出不连续且输入输出较少的点函数无法处理。
- 最后,本文进行评估的混淆器是免费的Tigress而不是当时最先进的商业混淆器Transdecoder,混淆程度不够大,评估不够严谨。