题记:好久没发博文了,这是我08年5月写的一篇文章,就发表在博客上吧……
作者:A1Pass http://a1pass.blog.163.com/ (转载请注明版权)
作为一个免杀技术的爱好者,自己在免杀的学习过程当中发现了一些奇怪的现象,而当我深入研究之后却发现了另外一片天地。
例如隐含特征码究竟存在与否?以及为什么有时每次特征码定位的结果都不尽相同?是什么原因导致这些情况的发生?或是现在网上流传的解释真的就正确吗?
如果想深入研究这些,我们必定要选择一个方向来揭开谜题,例如是应该从杀毒软件着手研究呢、还是应该从特征码定位器的原理着手研究?或是两者皆顾?
下面我们就由这个问题开始,在探讨业内错误的免杀思想时,同时总结出我们应该从哪里入手比较合理。今天我就带领读者们从正反两个方面探求免杀当中遇到的一些奇怪事。
一、正方:以杀毒软件为基础展开研究
正方的论点是以杀毒软件为基础来研究这个问题更为合适。
说起杀毒软件的基础,有些朋友可能觉得不屑于股,但正是这看似简单的杀毒软件原理中,却蕴含着解开谜团的钥匙。我们知道,一个杀毒软件的复杂程度要远远超过病毒与木马,理所当然其原理也比较复杂。一般情况下,一个杀毒软件是由扫描器、病毒库与虚拟机组成,扫描器是杀毒软件的核心,用于发现病毒,然而杀毒软件并不是只存在这一个扫描器!大多数软件都是若干个扫描器(或扫描算法)的结合体,虽然杀毒软件的基本思想就是特征码匹配,但是很不幸,其实现在大多数的杀毒软件都已经拥有了自己独特的扫描器。特征码扫描技术只是第一代扫描技术的主流,现在早就已经迎来了第二代扫描技术的普及。
我们就拿最典型的卡巴斯基来说,在它身上实际上已经很少见到特征码匹配的影子,现在卡巴斯基应用的主流扫描技术是一种称之为“密码校验和”的独特扫描算法,它不同于我们平时理解的校验和技术,他的思想是通过一定的文件特征,从而决定计算某一偏移量区域的校验和,从而得出两个值,这两个值就可以说是最终的所谓的特征码了。而且通过实验,不难发现这种校验和算法对大小写互换,行与行之间互换表现的并不敏感,这直接导致了我们免杀工作面临着更大的挑战。
这种技术早在6.0版就已经被卡巴启用,所以导致了一些免杀当中奇怪现象的发生,一些业内的朋友大多以隐含特征码等词汇来勉强解释这种奇怪现象。下面就是我的推论,小弟这是一家之言,如有错误的地方还望大家多多指正。
首先,特殊的扫描方法必然伴随着特殊的特征码,卡巴斯基的密码校验和定位出来的“特征码”体积通常都比较大,由于它具有一定的抗干扰性质,所以会导致一些简单的修改不会奏效,并且会导致每次特征码定位的差别很大等等现象的发生。为了对其校验和的值进行有效的干扰,所以往往多修改几处看似毫不相关的地方却得到了免杀的效果,从而得出“隐含特征码”的结论。
其实如果我们逆向思考一下,就会发现“隐含特征码”是一种不大可能实现的技术,这个特征码如果是隐含的,那么杀毒软件在检测到它存在时,是报毒还是不报毒?如果报毒,那它就不能称之为“隐含特征码”了。如果不报毒,那么必然就需要有一个机制来触发它,要是这样的话,那还有另一种解释——干扰码。如果发现原有本应有特征码存在的地方如果全被00覆盖来反定位,那么杀毒软件此时就会激活干扰码(一种假的特征码),从而导致我们在免杀的最后几步失败。
所以说“隐含特征码”应该是一种错误的观念,真正导致这种现象发生的是我们所知道的或不知道的扫描算法导致的,例如卡巴斯基的密码校验和扫描算法。
因此,正方感觉如果想要研究免杀技术,就应该先搞明白杀毒软件的原理。正如上文所述,仅仅一个扫描算法的问题却揭示了一些我们以前的错误观念,因此正方相信通过杀毒软件原理来研究免杀当中的一些问题才是明智之选。
二、反方:特征码定位器的一点思考
杀毒软件是免杀的对手或是敌人,而且这个敌人比较强大。因此反方认为,杀毒软件不是随便一个免杀爱好者就有能力去研究的。所以我们应该学会从自己手中的“枪”——特征码定位器 上来研究事情的本质。
这里我就先拿大家比较常用的MyCcl为例讲解。首先让我们看看下面的两个问题:
1、为什么特征码的定位结果会不尽相同?除了与杀毒软件有关,还有没有其他原因?
2、为什么同样的东西,特征吗定位时的精度却有高有低?而且相差比较大?
现在我们先看一张如图1所示的MyCcl的工作原理示意图。
现在我们假设一个由图2所示的比较极端的例子:
1111111111111111
1111111AA1111111
1111111111111111
这个例子的特征码正好位于文件的正中央,当我们的分块个数设为2时,就会出现出现如下流程:
第一批,如图3、4:
1111111111111111 1111111111111111
1111111A00000000 1111111AA1111111
0000000000000000 1111111111111111
第一次生成的文件掩盖了特征码,特征码在24-48字节之间。
第二批,如图5、6:
1111111111111111 1111111111111111
1111111A00000000 1111111A00000000
0000000000000000 0000000000000000
第一次生成的文件与第二次生成的都掩盖了特征码,特征码在24-48字节之间。
由上面的流程可知,文件被填充到一半时正好破坏掉了特征码,而当我们用这个结果来进行二次“复合定位特征码”时,将永远找不到带毒文件,因为这处特征码在定位时已经被一分为二了,所以说此时用MYCCL定位的最高精度就是这一半文件的大小了……
经过我的实验,发现这种状况将分块个数分别设为3,并且复合定位仍然分为2时,它的精度就会提高到整个文件大小的1/3,在分块个数设为6时,特的精度会变为整个文件的1/6。
通过这个例子,相信各位读者已经看到了分块个数对于特征码定位结果的影响了,我们同时发现,初次生成的样本文件个数越多,定位出来的结果自然就越精确,但是随着分块个数的逐渐增多,它对特征码精度的影响也在逐渐减小。
因此我们不难发现,分块个数的设定,在一定程度上正在影响着我们的免杀成功率,但也许有读者会问“这仅仅是一个比较特殊的例子而已,他能有多大的说服力?”
首先这个想法是很客观的,但是如果我们将类似密码校验和的扫描技术考虑进去的话,就不难发现这种情况的发生几率还是非常大的,鉴于密码校验和产生的大体积特征码,所以我认为这个特殊的例子还是很有说服力的。
而除此之外,我们也应该好好考虑一下填充数据的选择,大多数朋友都采用默认的“00”,我们刨去由此引发的干扰码不提,就几率来讲,一个文件出现空白区域的大小一般最少占整个文件体积的10%左右。所以说,“00”字节在文件中出现的几率至少为10%,而16进制中其他15个字符出现的概率最多仅为6.6%。因此特征码中出现“00”的几率必然也会受其影响,所以如果碰到这种情况,而我们还用“00”方式来填充这种本身就为“00”的特征码时,必然就会面临失败……
从上面我们不难看出来,我们通过对特征码定位器MYCCL的研究,得出了定位结果为何不尽相同以及特征码定位精度问题。因此反方认为,通过对特征码定位器展开研究才是便于操作且明智的方法。
到这里,这场不算激烈的辩论就正式结束了,而对于最后的结果我想并不重要,重要的是各位读者是否通过这场辩论学到了些什么?如果答案是肯定的,那么我的目的就达到了。
对于本文的论点来说,笔者认为正反两方所述的观点都是正确的,很显然我们不可能单单从一个方面去很全面的研究什么,之所以我a1pass就“画蛇添足”设了这么个论点,目的就在于改变一下技术文章行文方式,也许大家看得更有趣一些,也可说这是一种尝试。
本文通过简简单单几个想法引发出了不简单的问题,而通过这种由简单到复杂的过程,也使得我们走出了以前所不知的误区。本文引发出的一些结论虽然比较大胆,但都是经过笔者仔细实验得出的,由于笔者水平有限,难免出现值得商榷之处,还请各位不惜指教,我的博客是a1pass.blog.163.com。
|