
的可能.陈喆等人
[5]
提出了基于随机森林的路径分支混淆方法,将逆向分析路径的难度等价于抽取随机森林规则
的难度,防止分支信息泄露.但该算法引入大量冗余计算,影响程序运行效率.Popov等人
[6]
提出了一种基于Linux
信号机制的二进制代码混淆技术,使用各种异常信号代码替换程序中的跳转指令,对抗静态逆向分析工具.但该技
术无法对二进制代码的路径分支进行混淆,因此不能解决软件执行过程中的信息泄露问题.
循环结构包含大量算法逻辑相关的有效信息,对循环结构进行混淆,可有效提高代码保护能力.本文在相关研
究的基础上提出了控制流深度模糊思想,即:利用回调函数,将显式的循环执行转为隐式的函数调用,隐藏循环相
关的路径分支信息.传统循环通过过程内基本块跳转实现循环功能;而对于回调型循环,循环相关代码处于不同函
数内,通过过程间函数调用关系实现循环功能.本文将这种控制转移方式称为控制流的深度.深度模糊就在于利用
过程间函数调用,灵活替换传统循环,隐藏原始控制流,对抗逆向分析.围绕这一概念,本文进一步提出了函数嵌套
融合算法,使循环调用由相邻过程间转移至随机过程间,强化模型的深度特征.
本文的主要贡献在于:
(1)从控制流和数据流的角度出发,论证回调型循环与传统循环逻辑等价,并给出了等价变换方式;
(2)设计函数调用融合算法,通过随机添加冗余函数调用,构造复杂的控制流过程,提高生成程序复杂度;
(3)混淆系统实现:针对两类循环结构进行局部优化,确保模型应用前后功能一致,并通过实验验证了系统的
可行性与抗逆向分析的效果.
1 相关工作
控制流混淆的思路主要有两种:(1)破坏原始程序控制流结构;(2)采用加密等手段保护跳转信息.前者以控制
流扁平化算法为代表,对分支结构进行等价变换.在一定程度上隐藏路径信息,但不能做到完全消除,因此具有可
逆性.后者以条件混淆算法、分类器混淆算法等
[7,8]
为代表,通过不可逆算法,实现跳转相关信息的彻底消除.但此
类算法应用面相对狭窄,如条件混淆算法仅对相等条件进行处理,且要求程序和用户存在交互过程,因此难以做到
广泛应用.
总体而言,当前代码混淆主要围绕过程内控制流展开,代码等价执行过程由程序本身实现.因此,本文考虑在
传统混淆算法的基础上实施改变,使混淆过程由过程内扩展至过程间,控制流转移变为程序与系统协同进行.通过
异常处理函数实施控制流混淆是这一思想的一种实现方式,Popov等人
[6]
,Lin等人
[9]
和贾春福等人
[10]
在异常处理
的基础上,分别提出了自己的分支混淆方法.通过异常触发,将控制权转移到预置的异常处理函数,由系统负责跳
转执行,隐藏了条件跳转指令,实现对控制流的混淆.
然而,异常处理机制的复杂性导致控制流转移过程不完全可控,且容易引起程序安全问题.而函数回调过程相
对简单,执行流可预测.因此,本文提出了控制流深度模糊思想,通过系统回调函数,将循环结构分离至不同控制流
执行过程,同时将控制流转移过程交付系统执行,实现对程序路径信息的隐藏,对抗逆向分析.
2 回调型循环结构
回调型循环通过回调函数“响应-执行”机制,将基本块循环跳转变换为函数间的反复调用.以EnumFonts函数
为例,该函数接受其他函数指针作为参数,执行Windows字体库遍历操作.对其中每个字体均调用回调函数处理,
字体库遍历过程即等价替代循环过程.
如图1所示,多数系统回调函数均具有如下机制:当返回值非0时,回调过程继续;当返回值为0时,回调过程
结束,程序继续运行.该机制也是实现循环控制的重要基础.
显然,传统循环转变为回调循环,代码被剥离至不同函数体内,将面临以下问题.
(1)控制转移过程是否等价,对复杂循环结构是否具有适用性;
(2)如何维持变量作用域和数据依赖关系,保证功能一致性.
要解决上述问题,首先应选取适当的回调函数,本文选取的回调函数均具有以下特点.
(1)即时响应性:执行调用者函数后,立即触发响应事件,调用回调函数;
1834 软件学报2022年第33卷第5期
评论