首页 > 范文大全 > 正文

一种基于模糊聚类的软件保护虚拟机攻击方案

开篇:润墨网以专业的文秘视角,为您筛选了一篇一种基于模糊聚类的软件保护虚拟机攻击方案范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘 要软件保护虚拟机采用了虚拟化的技术来对程序进行膨胀处理,如果采用传统的在OllyDbg中单步执行来对程序进行逆向的话,费时费力。本文提出一种基于软件模糊聚类思想的软件保护攻击方案。首先编写OllyScript脚本,记录被保护程序关键段的执行指令状态,分析指令并提取句柄,提取句柄的代码特征,引入模糊聚类算法,用FCM算法对提取到的句柄按照特征值进行归类,从而方便对程序进行进一步分析。实验结果表明该方案可以很大程度上对算法进行有效归类,对进一步分析软件保护虚拟机有很大的帮助。

【关键词】软件保护虚拟机 模糊聚类算法 代码特征

1 概述

软件保护虚拟机作为当前保护强度高,稳定性强的保护技术,已经广泛应用于对软件核心算法的保护,并且获得了良好的保护效果。其实现原理是将待保护的x86指令转化为虚拟机可解释的字节码,使用虚拟机自带的解释器对该字节码解释执行。在安全性上,虚拟机解释器中大量的混淆以及虚拟机解释器自身的复杂性大大增加了逆向分析的难度,但是这并不表示虚拟机无法攻破。

总的来说,针对软件保护虚拟机的攻击思路主要有两种。第一种是完全人工还原,也就是采用传统的静态看流程,动态看数据的逆向思路,将程序放入IDA和OllyDbg中执行,单步执行,一条条指令反复分析,最终破解程序。这种思路费时费力,尤其是对于软件保护虚拟机这种保护强度很高的保护方案来说,并不具有实际上的可操作性。第二种思路是Rolf Rolles和Collbergs提出的,该思路主要是逆向虚拟机结构,化简被混淆指令,将虚拟指令转换为对应的x86指令的方法来保护被还原的代码。这种思路无法得到被保护代码的精简代码。

针对以上问题,本文提出一种基于模糊聚类思想的软件保护攻击方案,该方案首先将利用OllyScript记录程序的执行流程,将所执行的指令和相应的寄存器状态保存下来,进而采用递归方案提取所包含的句柄,然后提取句柄的代码特征,采用FCM算法将提取到的句柄按照关联度进行分类,从而完成对软件保护虚拟机的攻击。

2 软件保护虚拟机攻击方案

2.1 可行性分析

本文介绍方案的基本原理是,软件保护虚拟机实际上是一种代码膨胀方案,在执行的过程中,执行的依然是x86指令。因为经过软件保护虚拟机保护后的代码执行效率很低,因此只能用来保护那些并不经常执行的小段关键代码。另外被保护后的代码依然是在本地运行,这就为逆向软件保护虚拟机提供了可能。在此基础之上,本文提出了基于模糊聚类的软件保护虚拟机攻击方案。

2.2 总体思路

对软件保护虚拟机攻击总体思路为:

(1)记录程序执行产生的数据流,存储为本地文件。

(2)读取本地文件,提取句柄(Handler)。

(3)利用模糊聚类算法FCM算法对提取到的Handler进行分类,将相互关联度高的Handler归入一类,方便以后手动分析Handler语义。

2.3 详细步骤

(1)将保护后的软件放进OllyDbg中执行,从标识位开始记录执行每一步所执行的指令,操作数和该组指令执行完之后,寄存器的数据值。把这些数据按照的格式存放在本地文本文件中。

(2)分析步骤(1)产生的数据文件,进行简化处理,利用递归去除其中的无效Handler。其具体方案为:(a)从第一条指令开始,递归分析从前到后每一条指令,如果在此过程中,指令块在执行前后,对通用寄存器和标志位寄存器的值没有任何影响的话那么即可将第一条指令和第N条指令之间的区块认定为无效Handler,或者是填充的垃圾指令,将这些指令用Nop指令填充替换,以去除空Handler和无效Handler,避免下一步分析中它们对逆向人员的干扰。(c)如此循环往复,直至去除掉所有的无效指令为止。虽然这是一个很有效的办法,但是执行效率很低,对空间内存需求量巨大。

(3)多次运行程序,尽可能的截取更多的Handler,对样本库中所存储的样本进行编号。多次运行程序截取Handler的方式虽然要耗费很多时间,但是可以使得后面的程序准确度更高。样本库中存储的样本通常包含以下信息:(1)Handler编号,此编号用来对每个Handler进行唯一性标示;(2)Handler程序片段。这个就是上文所截取到的操作码,操作数等信息。

(4)提取样本库中各个Handler的特征值。对Handler的特征值得提取方案多种多样,但是最常用的是基于指令频度的特征。基于指令频度是指计算每个指令及其组合出现的次数,这个在一定程度上可以作为一段程序和其余程序片段的区别量。本方案采取N-Perm算法提取程序的该特征值。

(5)对Handler按照特征值相关性进行聚类。根据FCM算法,将上一步产生的特征值进行聚类分析,使得FCM算法中J的值达到最低,此时输出。

(6)得到Handler按照相关度进行聚类的簇之后,将其分类进行管理。至此,对软件保护虚拟机的处理完成。此后可以大大减轻逆向算法的难度。

3 结束语

因为模糊聚类的FCM算法精度并不能达到100%,且代码特征值多种多样,不同的特征值对处理结果影响较大,故而这种思路并不能完全准确的识别所有的句柄,有些地方还是需要逆向人员人工干预,才能达到一个比较理想的识别精度。虽然并不能实现全自动破解,但是在一定程度上,可以作为手动分析之前的预处理,减轻逆向人员的工作量,经过处理后的反汇编代码流可读性大大加强。

参考文献

[1]C++反汇编与逆向分析技术解密[M].北京:机械工业出版社,2012:51-56

[2]段刚.加密与解密(第三版)[M].北京:电子工业出版社,2009:200-213.

[3]RollesR.Unpacking Virtualization Obfuscators.[C] Proc.of Woot'09.Montreal,Canada:[s.n].2009.

作者单位

武汉工程大学计算机科学与工程学院 湖北省武汉市 430000