病毒特征码定位原理和首次使用MyCCL

来源:互联网 发布:2016苹果mac 编辑:程序博客网 时间:2024/04/24 13:23

一 什么是病毒特征码


特征码就是从病毒体内不同位置提取的一系列字节,杀毒软件就是通过这些字节及位置信息来检验某个文件是否病毒。每个杀毒软件公司都有自己的特征码提取方法和提取工具,这也是特别需要技术的地方,弄不好就造成误判,将好文件当成病毒给杀了。杀毒软件公司在提取特征码后,一般都需要经过较严格的测试和比对,当然也有时间紧迫,来不及充分测试就匆匆升级病毒库(也就是特征码库)的情况,前不久的Norton误删windows系统文件就是这样造成的。

特征码比对是当前主流杀毒技术的尴尬,但它确实是针对已知病毒最有效,并经过证明稳定可行的方法。缺点是对未知病毒没有防范能力,杀毒总是跟在病毒后面跑。所以,各杀毒公司也有一些自己的查杀未知病毒的技术。目前,也有一些基于行为特征的主动防御的商业软件(被称为HIPS)推出,比如System Safety Monitor等。


二 MyCCL简介

常用的定位木马病毒特征码的工具有三款,CCL,MultiCCL,MYCCL。CCL程序出现后,使得特征码修改已经成为了对付杀毒软件的常用手法,但是杀毒软件开始使用多重复合特征码来对付特征码修改就是说只有你同时改掉程序所有的守护特征码此程序才不被杀。CCL这样的定位工具无法直接定位出特征码,要定位复合特征码必须手工划分,而MYCCL是CCL的改进版,可以进行多重特征码的定位,针对金山等杀软的反向定位等功能,并实现自动化代码定位和显示。

MyCCL定位原理

  假设一段木马程序代码是这样(0代表NULL,X代表程序代码,a、b、c等代表特征码):
  001h:XXXXXaXXXbXXXXXXXXXX
  002h:XXXXXXXXcXXXXXxXXXXX
  003h:XXXXXXXXXaXXXXXXXXXX
  004h:XXXXXXXXXbXXXXXXXXXX
  005h:XXXXXXXXXXXXcXXXXXXX
  当文件同时包含a.b.c三种特征码的时候,杀软就报毒。这就是所谓的复合特征码。当然杀软在定义复合特征码的时候可能有好几种组合,好几套特征码。当是复合特征码的时候,在用CCL来定位结果是很困难的。而MyCCL在CCL的基础上又进步了。这里手动用MyCCL来生成5个文件。
  ========File1=============
  001h:XXXXXaXXXbXXXXXXXXXX
  002h:00000000000000000000
  003h:00000000000000000000
  004h:00000000000000000000
  005h:00000000000000000000
  ========File2=============
  001h:XXXXXaXXXbXXXXXXXXXX
  002h:XXXXXXXXcXXXXXxXXXXX
  003h:00000000000000000000
  004h:00000000000000000000
  005h:00000000000000000000
  ========File3=============
  001h:XXXXXaXXXbXXXXXXXXXX
  002h:XXXXXXXXcXXXXXxXXXXX
  003h:XXXXXXXXXaXXXXXXXXXX
  004h:00000000000000000000
  005h:00000000000000000000
  ========File4=============
  001h:XXXXXaXXXbXXXXXXXXXX
  002h:XXXXXXXXcXXXXXxXXXXX
  003h:XXXXXXXXXaXXXXXXXXXX
  004h:XXXXXXXXXbXXXXXXXXXX
  005h:00000000000000000000
  ========File5=============
  001h:XXXXXaXXXbXXXXXXXXXX
  002h:XXXXXXXXcXXXXXxXXXXX
  003h:XXXXXXXXXaXXXXXXXXXX
  004h:XXXXXXXXXbXXXXXXXXXX
  005h:XXXXXXXXXXXXcXXXXXXX
  =========================
  从File2开始就有了abc特征码的组合,File2到File5就被杀了。被杀以后再用MyCCL,进行二次定位,这样我们就知道了特征码c的位置了。然后再把002h那行置0,再生成一次。
  第二次生成5个文件:
  ========File1=============
  001h:XXXXXaXXXbXXXXXXXXXX
  002h:00000000000000000000
  003h:00000000000000000000
  004h:00000000000000000000
  005h:00000000000000000000
  ========File2=============
  001h:XXXXXaXXXbXXXXXXXXXX
  002h:00000000000000000000
  003h:00000000000000000000
  004h:00000000000000000000
  005h:00000000000000000000
  ========File3=============
  001h:XXXXXaXXXbXXXXXXXXXX
  002h:00000000000000000000
  003h:XXXXXXXXXaXXXXXXXXXX
  004h:00000000000000000000
  005h:00000000000000000000
  ========File4=============
  001h:XXXXXaXXXbXXXXXXXXXX
  002h:00000000000000000000
  003h:XXXXXXXXXaXXXXXXXXXX
  004h:XXXXXXXXXbXXXXXXXXXX
  005h:00000000000000000000
  ========File5=============
  001h:XXXXXaXXXbXXXXXXXXXX
  002h:00000000000000000000
  003h:XXXXXXXXXaXXXXXXXXXX
  004h:XXXXXXXXXbXXXXXXXXXX
  005h:XXXXXXXXXXXXcXXXXXXX
  =========================
  因为002h被我们置0了,这里只有File5有abc特征码了,所以File5被杀,这时另一处c也暴露出来了,这样我们就把所有c特征码都定位出来了。MYCCL解决了CCL定位复合特征码的困难。


三 首次使用MyCCL

首先打开一个文件;目前没有病毒样本;随便打开个QQ附带的DLL看看;


点击生成,出现下面提示;害怕清空了有用的文件;把该dll拷贝到另一个目录,再操作;


看了一下,原来是在打开文件的目录下,新建一个OUTPUT目录,切块后的文件放在OUTPUT中;不会对原来的文件造成影响;



随便输个分10块,点击生成以后,结果如下;


未分块的文件是107K;分了10块以后,看一下,每一块还是107K;首次使用还真是茫然;


修改单位长度为1093,分块数量自动变为100;


输入5093的单位长度,分块数量自动变为21;


点击 生成 以后,会弹出如下提示;



分成21块的情况;



点击二次处理按钮,给出的特征码定位结果如下;



为什么分为10块或更多,每块的大小都同原始大小呢;用Winhex打开看下,对很多地方是用0填充的;

其工作原理,目前尚未完全搞懂;下次再搞;



四 特征码逐块填充定位原理

http://book.51cto.com/art/201309/411648.htm
《黑客免杀攻防》第3章免杀与特征码,

我们将从简单的脚本木马免杀开始介绍,引导大家逐步认识特征码、特征码免杀,进而了解如何修改特征码。本节为大家介绍特征码逐块填充定位原理。

3.2.1 特征码逐块填充定位原理

逐块填充定位的方法在国内首先出现在CCL上,CCL是国内首款演示研究性的特征码定位工具,也是一款原理简单的单一特征码定位器。

鉴于我们现在还没讲到特征码定位器的使用技巧,所以这里只讲原理,不涉及操作,具体操作会在后面介绍。待了解了特征码定位器的使用技巧后,如果再回头来反复咀嚼这一节所讲的内容,相信对免杀的理解也会更进一步。

为了更加直观地介绍各个特征码定位器的原理,我制作了一个极其简单的例子程序,如图3-5所示。当然这个程序是不能运行的,只是为了演示所用。这个程序中的“1111……”代表的是有数据的地方,其中的“AA”就是我们假定的特征码。

当我们用CCL定位特征码时,它会从区段头部开始填充“00”数据,因为“00”往往都表示“此处为空”,所以如果将某一段数据替换为“00”,也就相当于删除了这段数据。为了让演示效果更加明显,这里将整个文件作为一个区段来定位。现在来看看CCL生成的第一个无后缀文件OUT_00000000_00000010,如图3-6所示。不难发现,第一行已经被无意义的“00”给填充了,我们假设的特征码“AA”现在已经不存在了,很显然这个文件是不会被反病毒软件查杀的。

下面再看看生成的第二个文件OUT_00000010_00000010,如图3-7所示。

我们发现由于填充的部位变成了第2行,所以特征码“AA”这时又暴露出来,因此这个文件肯定会被反病毒软件查杀。再来看第三个文件OUT_00000020_00000010,如图3-8所示。

很显然,这次是文件的第3行被“00”填充了,这个文件依然包含特征码。到了现在,我们可以猜得出来,第四个文件肯定是第4行被填充了,而且由于没有覆盖住特征码“AA”,因此它同样会被杀,如图3-9所示。

在这次操作中CCL总共生成了4个文件,其中3个被杀,经过简单的推理可以确定,是第一个文件覆盖掉了特征码,又因为第一个文件中的第一行数据被“00”填充了,进而可以很自然地推断出—特征码就在第一行。

但是这个特征码的范围是不是有些大呢?其实在真正操作的时候,如果我们想得到比较小的特征码范围,可以将CCL一次填充“00”的字节数减少,例如由默认的16字节减少到4字节。为了便于大家的理解,我做了一张比较形象的CCL特征码定位示意图,如图3-10所示。通过这张图可以更加透彻地理解CCL特征码定位原理了。

五 MyCCL特征码定位原理学习

http://blog.csdn.net/dyllove98/article/details/9631211


这里对MyCCL的分块原理做一下探究

对指定文件生成10个切块

对指定的木马进行切块后,文件列表是这样的。

注意这里是从E0作为切块的偏移量。也就是说从E0的位置开始逐个切块,E0之前的内容是保留的。这样做的目的是保留一些PE必须的头文件信息。

我们来通过亲身的探究来解析一下MyCCL的切块区间定位法到底什么意思,之后再从理论角度入手解释这个原理。

我们打开第一个文件

0000_000000E0_000110B6,用winhex查看。

我们发现E0之前的内容是完整保存的。也就是我们指定的起始位置之前的内容不参与切块,因为病毒特征码也不可能在这块区域内。

从文件名我们知道,第一个文件的切块范围为000000E0_000110B6。那我们定位到000110B6看看那里的情况。

因为000000E0 + 000110B6 = 00011198,第一个文件(第一个切块的范围是): 000000E0_00011198。然后后面的数据全部被填充为00。(文件名的第三段代表偏移量)

在继续打开顺序的第二个文件:0001_00011196_000110B6。首先从文件名中可以知道,这个文件的开始正好就是第一个文件的结束。然后我们用winhex打开。定位到00011196这个位置看看。

这次从00011196这个位置开始,一直到0002224C的位置, 原始数据都一直被保留,到0002224C之后的数据又被填充为00了。而0002224C的位置正好就是第三个文件的开始位置。

看到这里我们应该明白了,MyCCL所做的事情就是在不断的恢复出原始数据的过程,只不过这个这个动作是分成好几步(块)慢慢来进行的。

如果特征码不在之前的某几块的范围内的话,那杀软在查杀的时候也不会杀除这些文件,因此前几块那些不包含特征码的块文件就会在查杀的时候被保留下来。

我感觉要更清晰的理解原理的话最好是用手工一个文件一个文件顺序的方法进行查毒,直到某一个块文件查处有病毒。则说明这个块文件多露出的那一块原始数据包含了病毒特征码。

那我们的第一个分块的目的就达到了,我们找到了特征码的大致范围,就在刚才多露出的这个块原始数据块中,则这个被查处有病毒的块对应的起始地址和终止地址就我们第一切块的结果。

我们定位特征码的位置,既不能说是看被查出有毒的,也不能说是没被查出有毒的。准确说是第一个被查出有毒的。第一此被查出有毒的那个区段就是特征码的一个范围。

这里假设我们在查杀第二文件的时候查出有病毒,那后面的文件也不用查了,肯定也有病毒,因为它们同样包含了第二个区段。一般我们用手工的查杀方法,查出第二个文件有毒然后清除这个文件。

0001_00011196_000110B6这个文件被删除了

然后,我们点击”二次处理”时MyCCL就能发现第二个文件不见了,就能定位出一个特征区间。看清楚,是MyCCL发现了第二个文件不见了。它就知道了这个特征码是在第二个区段内。

现在明白了为什么有的人杀到一个病毒就停止查杀了吧?因为按顺序摆放,找到某处特征码时,后面的暂时没必要管。为什么说是暂时呢?接下来继续解释。

因为现在的杀毒软件一般是复合定位,也就是说多特征码定位,而且发现任何一处特征码就能确定出病毒来,所以MyCCL在确定出一处特征码(这里是第二个文件块)时,会提醒用户要不要继续分析。此时当然选"是"了,这个时候又会生成十个切片。

这次又生成的10(你自己设定的切块数量)个切片就有意思了。

可以看到依然是和第一次的10个块文件一样的分区范围,但是,内容给也是一样的吗 ?我们继续用winhex查看内容,之后再慢慢解释原理。

我们打开第一个文件0000_000000E0_000110B6,然后直接定位到00011198

第一个文件依然是一样的。我们继续打开第二个文件:0001_00011196_000110B6

用winhex打开0001_00011196_000110B6。

好,这次发现不同了,在第一次的生成切块过程中,我们知道,MyCCL是逐步露出原始数据的,那道理第二个文件中应该从00011196位置开始把原始数据露出来了呀?难道是MyCCL程序出错了吗?

当然不是的。

因为这是二次分块定位,第二个文件块我们已经确认是有病毒的了,不需要再用杀软来确认了,所以MyCCL直接填充00,而是从第三个文件开始逐步露出原始数据。不急,我们先实验一下验证一下这个观点。

打开第三个文件:0002_0002224C_000110B6,定位到0002224C的位置。

可以看到,确实和我们说的一样,从第三个文件开始逐步露出原始数据。我们再定位到文件块3的结束位置:00033302,也是第四个文件的开始位置。

由此可以得知,后面的处理过程和之前的第一次分块是一样的原理了。差别就在二次分块时默认将第一次中找到的那块直接填充00了,就不再露出来了。

结果就是二次定位后也同样会生成10个块文件。

我们依然可以从头顺序开始逐个用杀软进行查杀(不过我感觉可以直接从刚才找到的第一个带特征码的文件块后面开始继续试探查杀)。直到再次发现那个首次发现病毒的文件块,则我们要找的第二个病毒特征码就在那个文件块中。

以此类推,还可以继续点击”二次处理”寻找第三个,第四个特征码,只要文件块还没遍历完。但是要注意的是,每次点击”二次处理”生成文件,才能用杀软继续顺序查一次,即每次只能找到一个特征码位置,然后要再次点击”二次处理”。 如果在二次分块的查杀验证中直到最后一个文件块都没有再出现病毒警报的话,则说明这个病毒程序就只有一个病的特征码。即之前找到的那个,整个过程需要杀软的配合。

至此,我们就算完成了第一轮的切片范围搜索,但是这个时候定位的范围太大了,我们需要继续进行精确定位,缩小范围。

点击特征区间,会出现我们之前找到的特征码范围。

可以看出: 00011196_000110B6就是文件名本身,意思是这个范围就是整个分块本身,非常大,接下来我们要重复上面的过程继续一次定位及二次定位。

右键点击重新复合定位。

接下来的步骤就有点像是算法中的递归,这次的范围缩小了,我们以:

0001_00011196_000110B6

这个范围作为原始文件的大小,注意看开始位置和结束位置。

这次的搜索范围被集中到:00011196_000110B6。或者也可以理解为0001_00011196_000110B6这个文件现在相当于原始文件了,我们从这个范围中继续搜索特征码。

我们继续通过实践验证我们的观点。重新修改分块数目为10,点击生成。

注意到,这次生成的文件列表中。第一个文件就是0000_00011196_00001B45,即直接从00011196这个位置开始了。

打开第一个文件:0000_00011196_00001B45。

我们先观察一下E0的位置

可以看到,还是之前说的原理,起始地址之前的数据是被保留的。只是从我们指定的起始位置开始分块。

现在我们直接定位到00012CDB位置,也就是第二个文件的开始位置。

可以看到,这次分块的行为模式和之前的原理上是一样的。

现在,为了加深映像,让我们再打开倒数第二个文件:0008_0001EBBE_00001B45。

并定位到00020703的位置,也即最后一个文件结束的位置。

再打开最后一个文件:0009_00020703_00001B4A,定位到2224C,也即一开始指定的结束位置。

可以看到在结束位置2224C之后的内容也依然存在。也就说MyCCL对于我们指定的范围外的数据不做任何处理,只会对我们指定的范围内的数据进行切块。

我研究到这里的时候,就有一个疑问了,那这样要是木马病毒有复合特征怎么办呢?即在第一次的切块搜索中搜索出了2处以上的特征码位置,我们选择其中一处缩小范围,进行进一步的搜索,然后MyCCL只在我们指定的范围内进行切块,那这个范围外的那一处特征码就将一直存在了,那我们第二轮切块中每一个文件不就都会查出有病毒了吗?

带着这个疑问,我们重新做一次实验,在第一轮切块搜索的的时候模拟出有两处特征码,即手工删掉2个文件(和杀软杀掉本质上是一样的)

重新打开MyCCL,生成10个切块,并删掉第二个文件0001_00011196_000110B6

点击”二次处理”,重新生成10个文件,在提示是否要继续搜索特征码的对话框中点确认,这次删除第九个文件:0008_00088690_000110B6

删除后,再次点击二次处理,让MyCCL发现又有一个文件不在了,即又找到了一个特征码位置。

结束后,右边显示共找到了两处特征码位置。

选择第一处位置:00011196_000110B6,右键,继续复合特征码查找。

注意这个时候的起始位置和结束位置就是第二文件的范围,点击生成。

我们来打开第一个文件:0000_00011196_00001B45。其他的位置我们都了解了,现在关键是第九个文件的位置0008_00088690_000110B6是我们要重点关注的。
先定位到00088690的位置。

可以看到,和我们的理论猜想一样,这块内容被填充了00,和”二次处理时”要把之前找到的特征码位置填充00的思想是一样的,为了不影响本次的范围内切块搜索。要反范围外的特征码位置填充00,其他位置就保持不变。

搞清楚了以上几点后,我们就可以以此类推,不断递归的缩小范围,直到能把特征码的范围缩小到20字节一下,基本就差不多了。

国内外的杀软一般是根据一些字符组合来判断是否是病毒,在20字节一下基本能帮组我们对特征码进行定位判断。

顺便介绍个在线测试病毒的网站http://www.virscan.org/。国内外流行的杀毒引擎都在里面了。杀软的话推荐用COMODO,很好用,性能也很好,我一直在用这款。

0 0
原创粉丝点击