欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

恶意代码的特征的定义和提取

恶意代码的特征的定义和提取

一.恶意代码特征的定义 
多年来,各大杀毒软件公司和网络安全公司都一直致力于恶意代码的检测。随着杀毒与反杀毒的不断的博弈,杀毒技术取得了长足的进步。但是不管技术如何发展,都要依靠恶意代码的特征进行检测。
虽然这项技术已经应用多年,但到目前为止,恶意代码的特征依然没有一个明确的定义,这与计算机技术的高速的发展是直接相关的。结合网上的不明确的定义以及我的理解,我将恶意代码的特征定义如下:恶意代码的特征就是它所特有的、非恶意代码所没有的特征。
看到上面给出的定义,应该有不少人会发笑:这简直就是一句废话。事实的情况就的这样:恶意代码的特征有时候是很难确定的,因为从本质上来讲,恶意代码与非恶意代码一样,都是一段代码,有很多的共同之处,所以要区别本身就是很难的;而且随着病毒变种的发展,恶意代码的特征变得不是那么明确,特征变成了一系列恶意代码的特征,抑或多种恶意代码同时拥有一种特征。
给出了上面的定义,并不能很好的解决问题,我们需要将问题继续细化。纵观恶意代码检测方法,不管是早期的特征码匹配法,还是后来发展起来的虚拟机技术、基于语义的恶意代码检测算法,使用的恶意代码的特征无外乎两种:恶意代码的特征码以及恶意代码的行为特征。
恶意代码的特征码就是从恶意代码体内不同位置提取的一系列字节,杀毒软件就是通过这些字节及位置信息来检验某个文件是否为恶意代码。
恶意行为我们定义为是多个不重复的内置恶意动作和一组有先后顺序的扩展恶意动作,这就是恶意些行为的描述。
有了以上两个定义,我们一下了变得豁然开朗,抽象的概念变得具体化。这两种特征理解起来也非常的浅显。
反病毒这个行业和人类社会定罪什么其实是非常接近的。首先看一下人的指纹技术,指纹技术第一步初犯的时候截取指纹,就像我们发现了一个病毒,截获它的样子,然后再犯的时候就可以从指纹库提取指纹,然后对照一下,确定到底是不是病毒,所以说指纹技术应该是特征码技术的鼻祖了。
而恶意行为检测类似于当今的法律。第一步首先把程序看成一个人,接着就可以制订适用于这些人的法律,必须是适用于这些人的而不是我们人类社会的法律,第三监视这些人的动作,第四把这些动作整理归纳、搜集,最后再根据法律,就是刚才适用于这些人的法律来判定这个人到底是好是坏过程,思维的逻辑也非常的简单。
有了以上两种定义,我们要做的应该是怎么把以上的想法变成实际可行的动作?
二.恶意代码特征的提取
有了以上的理论指导,我们就应该将它付诸于实践。必须指出的是,特征的提取方法并不是一成不变的,而是随着技术的发展和现实安全情况循序发展的。
恶意代码特征码的提取
恶意代码的特征码识别技术是一项非常传统的检测技术。在病毒查杀刚刚起步时,应用的就是这种技术,只不过是比较特殊的一种用法:整个文件进行比对。由于当时的病毒的种类和数量都很少,所以杀毒软件将整个文件与样本进行比对,若相同则认为是恶意代码。那么你肯定会说:这种方法实在太弱智了,只要对文件做一点点修改,杀毒软件就无法查杀。但是这种低级的方法并不是没有用,比如当一种病毒大流行时,杀毒软件公司没有能力在短时间内找到很好的解决办法,那么这种最原始的办法可能就变成了最有效的办法。
但是随着恶意代码技术的不断发展,恶意代码有了自我变异的能力,种类和数量也成指数增长。这种原始的方法不管是从速度上还是准确性上都不再满足要求,于是就有了现在的恶意代码的特征码检测法。
首先我们必须论证一下特征码检测的合理性。从哲学的角度说,对于每一个个体都有自己的个性,而每一类事物也应该有共性。特征码检测就是基于这样一个思想。每一种恶意代码都应该有一个或多个部分是与其它不同的,如果我们能把它们找出来,那么它们就可以作为这种恶意代码的特征;一个特征码或多或少的可能造成误报,那么我们可以从中提取出3段或更多特征码,这样不仅可以减少误报,也可以大大提高检测的准确性。
基于上述分析,我们可以总结出:特征码是只有该(类)恶意代码才可能会有的串一串二进制字符串,这字符串通常是文件里对应代码或汇编指令的地址,一般提取2个以上的代码段,有时会直接采用入口点的代码段来制作特征码。
我们当然需要一个结构来描述和存储我们所提取出来的特征码,例如:
{BS_PHY_FILE,0,32,0x58,0x35,0x4F,0x21,0x50,0x25,0x40,0x41,0x50,0x5B,0x34,0x5C,0x50,0x5A,0x58,0x35,0x34,0x28,0x50,0x5E,0x29,0x37,0x43,0x43,0x29,0x37,0x7D,0x24,0x45,0x49,0x43,0x41,}
它表明这是一个简单文件特征,特征起始地址0,特征长度32,后面32个字节是具体特征值。
有了定义,有了描述结构,我们需要一个特征码提取法:
1.获取一个病毒程序的长度,根据长度可以将文件分为几份,份数根据样本长度而定,可以是3~5份,也可以更多。
2.每份中选取通常为16或32个字节长的特征串。这里一般要用到查重算法,从大量的恶意代码样本中提取相同的部分,这部分自然应该是特征串。
3.如果选出来的信息是通用信息,即很多文件该位置都是一样的信息,那么舍弃,调整偏移量后重新选取。
4.如果选取出来的信息是全零的字节。那么也要调整偏移后重新选取。当然调整的偏移量多少可以人为事先规定,也可以自动随机调节。
5.最后,将选取出来的几段特征码及它们的偏移量存入病毒库,标示出病毒的名称即可。
上述就是一个特征码提取的基本方法。刚开始的特征码提取工作都是由恶意代码分析人员人工提取的,但是随着恶意代码的急剧增长,手工已远远不能满足要求,于是有了自动化的特征码提取器,这就需要对上述的基本方法做一些改进。
 

图1. Kv300中的特征码

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功