1.CCL定位原理
假设一段木马程序代码是这样(0代表NULL,X代表程序代码,a、b、c等代表特征
码):
001h:XXXXXXXXXXXXXXXXXXXX
002h:XXXXXXXXXXXXXXaXXXXX
003h:XXXXXXXXXXXXXXXXXXXX
004h:XXXXXXXXXXXXXXXXXXXX
005h:XXXXXXXXXXXXXXXXXXXX
当用CCL进行手动定位的时候,它生成了5个文件
==========File1===========
001h:00000000000000000000
002h:XXXXXXXXXXXXXXaXXXXX
003h:XXXXXXXXXXXXXXXXXXXX
004h:XXXXXXXXXXXXXXXXXXXX
005h:XXXXXXXXXXXXXXXXXXXX
==========File2===========
001h:XXXXXXXXXXXXXXXXXXXX
002h:00000000000000000000
003h:XXXXXXXXXXXXXXXXXXXX
004h:XXXXXXXXXXXXXXXXXXXX
005h:XXXXXXXXXXXXXXXXXXXX
==========File3===========
001h:XXXXXXXXXXXXXXXXXXXX
002h:XXXXXXXXXXXXXXaXXXXX
003h:00000000000000000000
004h:XXXXXXXXXXXXXXXXXXXX
005h:XXXXXXXXXXXXXXXXXXXX
==========File4===========
001h:XXXXXXXXXXXXXXXXXXXX
002h:XXXXXXXXXXXXXXaXXXXX
003h:XXXXXXXXXXXXXXXXXXXX
004h:00000000000000000000
005h:XXXXXXXXXXXXXXXXXXXX
==========File5===========
001h:XXXXXXXXXXXXXXXXXXXX
002h:XXXXXXXXXXXXXXaXXXXX
003h:XXXXXXXXXXXXXXXXXXXX
004h:XXXXXXXXXXXXXXXXXXXX
005h:00000000000000000000
=========================
当你用杀软来扫这5个文件时只有File2没有报毒,很明显因为File2的特征码a被
填0了,这样也就暴露
了特征码a的位置了。CCL定位原理就是这样,然后反复的循环定位,缩小范围。
最后就可以定位出我
们想要的特征码了。当然这是针对单一特征码。
----------------------------------------------------------------------
------------------------
2.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特征码都定位出来了。解决了CCL
定位复合特征码的困难。然而我们回过头来想想,如果你想修改a或b特征码呢?
又如何定位出a或b的特征码呢?这就是MyCCL的一个缺陷。不是定位不出来,而是
很费劲。没有特征码保护机制。
----------------------------------------------------------------------
------------------------
3.multiccl定位原理
1.假设一种比较极端的情况:
某杀毒软件针对某样本
抽取了如下 a b c d e 的五个特征码片段
而其中的任何一个单独的片段都不构成完整的特征码
更极端的情况是可能有两套这样的组合。
却以其中任何两处来识别。(见 图1)
这样,如果用原来的CCL就很难定位了,就算能定位,操作也
变得很复杂。
(图1)
..............................aaaaaaaaa........................
...............................................................
.............bbbbbbb.........ccc...............................
...............................................................
...................ddddddddd...............eeeee...............
2.针对这种情况
有个思路是从一端开始盖零(考虑到PE文件文件头的重要性
multiCCL选择了从尾端开始往前盖)。
直到如图2所示时,杀毒软件才不能识别
(b片段被破坏了一个字节)
这样b尾端就出来了。
(图2)
..............................aaaaaaaaa.........................
................................................................
.............bbbbbb000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
------------------------------------------------------------------
下面是定b片段的头端了
看看图3 图4 图5 ,注意看b片段中间那个字节的零的移动
(后来发现有时用一个字节的零不行,可改用N个零)
(图3)
..............................aaaaaaaaa.........................
................................................................
.............bbbb0bbb0000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
----------------------------------
(图4)
..............................aaaaaaaaa.........................
................................................................
.............0bbbbbb00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
----------------------------------------------------------------------
(图5)
..............................aaaaaaaaa.........................
................................................................
............0bbbbbbb00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
--------------上图的a 和 b 两个片段都暴露了--------------------------
图5 中,暴露出完整的a b 两个片段,这下又被杀毒软件认出来了
这样就定位出b段了。
接下来把b希用0盖掉作为新的样本,用杀毒软件检测一下是否被杀,还杀就
重复前面的步骤定 c 段,如图6
(图6)
..............................aaaaaaaaa........................
...............................................................
.............0000000.........ccc...............................
...............................................................
...................ddddddddd...............eeeee...............
-----------------------------------------------------------------------
如果定好c段盖掉后还是被杀就再定 d 段
如图7
(图7)
..............................aaaaaaaaa........................
...............................................................
.............0000000.........000...............................
...............................................................
...................ddddddddd...............eeeee...............
-----------------------------------------------------------------------
这样重复,直到片段d e ……都被找出盖掉后,杀毒软件再也不认了
(后来又发现有些杀毒软件针对零覆盖有干扰,改用随机串)
-----------------------------------
一个字节一个字节来显然太费时间,效率很低的,一次性
生成上千个文件也是不现实的。
所以考虑先用二分法粗定。到范围小时再逐字节替换。
-----------------------------------
从尾端开始数,以1.2.4.6.8……的大小往前盖
即取2的指数阶 , 2^n <文件尺寸就行了。
一次生成20个左右的样本文件,用杀毒软件检测
以例图说明吧(见 图8图9)
下面这个盖了128 bytes 的还被识别
(图8)
..............................aaaaaaaaa........................
...............................................................
.............bbbbbbb.........ccc...............................
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
-----------上面这个盖了128 bytes的还被识别-------------
--------------下面这个盖了256 bytes 的不被识别了--------------------
(图9)
..............................aaaaaaaaa........................
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
--------------------------------------------------------------------
那就说明距文件末尾256--128之间有个特征码片段,
下一步就以图8为样本,
定位的范围是 图10 中经XXXX标记的区域
(图10)
..............................aaaaaaaaa........................
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
---------------------------------
如此反复,当范围缩小到32字节或更小,二分法就显得效率低下了,
改用逐字节替换法,一次生成最多32个文件。
-----------
另外,
图8 图9 图10 之外,还有一种情况,
就是某次用二分法生成的所有文件
杀毒软件都不识别,那就说明特征码集中在最大盖0范围之前
即图9中 未盖0的区域,这时只要以图9为样本,
定位图11中以YYYY标记的区域
(图11)
YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000
-----------------------------------
后来实际测试及应用中发现这种算法效率不高。
文件定位时改用等分法,内存定位时用一半一半法,这样效率最高。
------------
尾端定出后,再用 图3图4图5 所示的方法把0还字节前移,一次生成32个
文件用杀毒软件检测,如果32个全不被杀时,就取这32个字节作为定位结果
对于这种大尺寸的片段,没必要完全定位出片段的头端。
(因为一个片段中只要修改一个字节就够了)
本文章转载自:http://hi.baidu.com/ddd1206/blog/item/027381d4cf76ed09a18bb717.html