目前软件反分析技术的主要手段是混淆,根据是保护的阶段不同可以将软件保护分为,在编译器编译之前的基于源代码的混淆和编译之后的基于二进制机器码的混淆。前者的特点和优势是自由度高、针对性强,比如白盒加密就是一种对特定算法(加密算法)的混淆技术,但其缺点也非常明显:一是适用范围有限,因为必须取得程序源码,二是其对于机器码的混淆能力有限。基于二进制机器码的保护技术可以对大部分二进制程序进行保护,适用范围广、灵活性高,但实现难度高,主要难点在于如何确保二进制代码反汇编的正确性、如何对可执行文件进行重构、平衡保护强度和开销等。
根据保护时是否需要运行程序,软件分析技术主要包括静态分析和动态分析,所谓的静态分析是在不运行代码的情况下,对代码的静态特征和功能模块进行分析的方法。静态分析代码的优势在于它能描绘程序的轮廓,包括控制流和数据结构。
静态分析对应的保护方法就是静态混淆。静态混淆技术主要可以分为混淆控制流和混淆数据结构两大类。静态混淆在JAVA、.NET等虚拟机语言上起到很好的效果,由于这类代码并不是被编译成二进制机器码,而是以中间代码的形式在运行时环境中被解释执行,而这种中间码非常容易被逆向,所以不得不进行混淆。类似的还有对Javascript等脚本语言的混淆保护,这类保护方案都是在源码的基础上进行的。
对二进制文件的典型的静态控制流混淆方法包括花指令、控制流平面化等。典型的数据结构混淆方法包括合并和拆分类和结构体,隐藏虚表等。
另外有些被加密打包的程序,即所谓的加壳程序,其实在严格意义上讲并不属于静态混淆,但其也能一定程度上抵抗静态分析。
动态分析是通过在可控环境中运行代码,全程监控代码的所有操作,观察其状态和执行流程的变化,获得执行过程中的各种数据的分析方法。常用的动态分析方法有:调试、剖分、跟踪、模拟器等。动态分析框架相比于动态分析的优势就是可以跟踪并观察每一步的状态,从而获取更多的信息。但动态分析也有自身的不足,比如严重依赖程序的输入,必须构造良好的测试环境才能保证需要分析的代码正确执行。另外,许多经过保护的程序可以侦测到自己被调试或者在虚拟机运行,从而启动防御机制。
动态混淆技术在实现上主要包括自修改代码技术和虚拟机保护技术。
自修改代码技术是程序运行期间修改或产生代码的一种机制,其主要利用了冯罗伊曼体系结构的存储程序的特点,即指令和数据存储在同一个内存空间中,因此指令可以被视作数据被其他指令读取和修改。程序在运行时向代码段中写数据,并且写入的数据被作为指令执行,达到自我修改的效果。自修改保护机制可以有效抵御静态逆向分析而且由于代码仅在需要时才以明文的形式出现,可以在一定程度上阻碍逆向工具获取程序所有的明文代码,从而抵抗动态分析。
虚拟机保护其实也属于自修改代码的一种,但是由于其保护强度高,逐渐成为研究的热点,从而自成体系。虚拟机保护与传统自修改代码技术的最主要区别是虚拟机增加了一层自定义的指令集,而且其难以逆向,破解者想要获得程序源码,首先必须弄懂虚拟机的指令集,这极大增加了逆向的开销。虚拟机保护技术通过增加复杂度和在时间和空间上开销,获取了更高的保护强度。
小结
泛泛地说说混淆技术其实没什么神秘的,原理都很简单。个人认为软件保护技术本身主要是工程问题,而且充满着权衡。效率与开销、时间与空间,都是不可兼得的,所以需要根据具体情况选择适合的保护方法。
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
加入交流群
请使用微信扫一扫!