标题:
【shineast】这两天对主动防御的思考
[打印本页]
作者:
点饭的百度空间
时间:
2008-12-8 14:02
标题:
【shineast】这两天对主动防御的思考
2008年11月26日 星期三 下午 05:12
这两天发现自己的主动防御软件有一个问题,虽然能针对性的防住一些病毒木马,但是同时提示和报警也非常多,而且很多报警有问题,明显是正常程序行为,反而却在报警。为此我很苦恼!
反思了两天,一方面是反思主动防御,另一方面是反思自己的软件......
算是有点小体会,随便写写吧,欢迎拍砖!......
主动防御的目的是更好的识别已知的和未知的病毒木马。而病毒木马实际上是通过一些攻击技术或技巧达到了自身的目的,其中这些攻击技术和技巧又体现为一系列的行为,或者说是一些列的API函数调用和代码片段。事实上正常程序往往也会调用这个API(甚至传入的参数完全相同)或执行相同的代码片段,那么在这种情况下如何区别一个程序是恶意的还是正常的呢?
首先必须认同的是,病毒木马必定和正常程序是有区别的,否则它们就是是同一个程序,要么是正常的,要么就是恶意的。更进一步说,病毒木马不仅和正常程序在代码特征上是有区别的,而且在行为表现上也一定是有区别的。
那么我想,主动防御识别病毒木马的根本就在于找出它们和正常程序的区别在哪里,或者说这个病毒木马和一个在行为表现上与之极其相似的正常程序之间的关键区别是什么。一旦找出这个关键区别,那么实际上这就是一种类似于文件特征码的特征,以此来识别病毒木马是理所当然的。我目前思考出的能体现特征的有三方面:一是行为的上文;二是行为的中文;三是行为的下文。也就是一个行为的上中下文。
进一步来说,如果把上面提到的关键区别或特征描述为规则的话,形成一个恶意行为规则知识库,这样就相当于一个识别病毒木马引擎。那么以后有新技术的病毒木马出现的时候,把他们的特征加入我们的规则库中即可。而不用重新修改程序,就可以识别出新技术下的病毒木马。而这一条规则对应的可是一批病毒木马啊!因此规则库不会很大。
于是这里很自然的就出现了两个问题:
1.如何提取关键区别和特征;
2.如何把这些特征描述为规则。
第一个问题不是很难,举个例子吧!
【例一】
例如NtCreateThread函数,病毒木马和正常程序都可能调用,那么如何区分他们呢,我是这样做的:
//-------------------------------------------------------------------
//规则判断
//-------------------------------------------------------------------
//得到被动进程对象
st=ObReferenceObjectByHandle(ProcessHandle,
(ACCESS_MASK)PROCESS_ALL_ACCESS,
NULL,
KernelMode,
&remoteProcess,//被动进程对象
NULL);
//如果上面函数失败,先放行
if (!NT_SUCCESS(st))
goto go;
//如果被动进程就是当前进程,则放行
if (IoGetCurrentProcess()==remoteProcess)
goto go;
//如果被动进程当前没有线程,则放行
if (IsProcessNoThread((PEPROCESS)remoteProcess))
goto go;
ObDereferenceObject((PVOID)remoteProcess);
实际上给一个进程创建线程的行为是否恶意,要看被动进程(remoteProcess)是否是当前进程,如果是,那么就不是恶意的;如果否,那么要继续看被动进程有没有线程,如果已经有至少一个线程了,那么就说明该行为是恶意的,例如一个病毒木马给explorer.exe进程创建线程。
【例二】
例如NtDuplicateObject函数,病毒木马和正常程序都可能调用,那么如何区分他们呢,我是这样做的:
//-------------------------------------------------------------------
//规则判断
//-------------------------------------------------------------------
//判断源进程是否就是当前进程,如果是,则放行
if(sourceProcessPID==currentProcessPID)
goto go;
//判断目的进程是否就是当前进程,或者目的进程是当前进程的子孙进程
//如果不是,则放行
if(!(currentProcessPID==targetProcessPID
|| IsChildProcess(currentProcessPID,targetProcessPID) ))
goto go;
也就是说,判断一个复制句柄的行为是否恶意,要判断源进程是否就是当前进程,如果是,则放行;如果否,判断目的进程是否就是当前进程,或者目的进程是当前进程的子孙进程,如果不是,则放行;否则就是恶意行为。当然了一些系统进程为了维护系统可能会表现为所谓的恶意行为,但是他们的目的是好的,因此将系统进程加入白名单就好了。
////////////////////////////////////////////////////////////////////
关于第二个问题:如何把这些特征描述为规则。
我想了好久,没有想出一个好办法,请大家指点我,谢谢!
这个问题解决好了,可以把规则和程序分离,独立出来,这样以后就不用修改程序,而修改规则即可!有点类似防火墙的规则库,但是比防火墙的规则库要复杂的多!
【Sysnap】
我的想法是.....不要判断是不是病毒...这只是一个名字而已...而是判断将要运行的程序对操作系统有没有危害....危害是大还是小...从而给出提示.....
这东西 先分清楚监控的等级
设计上可以考虑...
1分层....
2抽象....
3底线....保证系统还能开机..还你运行你的程序..哈哈...
【shineast】
3底线....保证系统还能开机..还你运行你的程序..哈哈...
——恩,这个不错!最底线的自我保护!
【
Legend
】
微点描述的程序行为是指程序一系列动作组成的有意义的行为,而不是指单一的动作。微点主动防御软件监控程序运行过程中的一系列动作(包括病毒的动作),综合应用病毒识别规则进行判断。也就是说程序运行必然要完成有意义的行为,微点主动防御软件依据病毒识别规则对程序的行为进行判断,从而准确判定是正常程序还是病毒。
1.微点主动防御软件是根据程序行为分析判断病毒。
病毒在计算机运行之后将根据自身的目的呈现出一系列的动作,包括写注册表项,生成文件,远程线程注入等等,微点根据这一系列的动作所组成的行为进行智能的逻辑判断(这种逻辑判断方式是模拟反病毒工程师分析和判断病毒的逻辑),准确的判断该程序是不是病毒。
2.关于snhao提到的将动作打乱,我们可以理解以下2点
1.动作顺序不同,病毒刻意的打乱动作顺序。企图躲避主动防御软件,这种方法对于微点主动防御是无效的,(当然对于其他单靠单一动作判断的主动防御产品来说可能有效)因为微点主动防御是根据病毒一系列动作来逻辑判断该程序是不是病毒,不管你先执行那个动作,对于微点主动防御来说都是一样的!这个例子在早期已经有很多黑客尝试过,始终没有成功,也验证了微点主动防御软件通过程序行为逻辑判断的智能性和有效性。
2.程序分出子程序,每个子程序实现一到两动作,组合一起形成破坏。这种方法对微点主动防御软件同样无效,微点的行为判断是模拟反病毒工程师的逻辑思维,我们一直强调的是逻辑性,也就是说微点的行为判断不是单一的是或者否,0或者1,而是整个复杂的逻辑判断过程,通过不同程序的生成关系以及依托关系之间各自的行为进行逻辑判断,准确的判断该程序是不是病毒。这个我们可以在微点的很多报警图中看到,微点报一个程序是木马或者病毒,后面都会跟着一大批生成文件或者族群文件,很清楚的反应出,微点对各个病毒子程序之间的父子关系和兄弟关系的判断。
我们可以举一个简单的例子:
一个小偷团伙,他们分工明确,有人做偷的动作,有人做将偷到的东西发出去的动作,但是不管这个动作分得多散,他们始终来自一个团伙(父子关系),他们之间也必须交流(兄弟关系),小偷A要把偷的东西发出去,总得把偷到的东西交到小偷B的手里,这就是我们说的程序同步。根据这一系列的逻辑分析判断,我们准确的判断他们,将他们消灭。
作者:
szhangyu
时间:
2008-12-8 15:19
顶,微点,真正的技术型选手
作者:
matthew0809
时间:
2008-12-9 15:28
支持,
学习中,希望能有所得。
欢迎光临 微点交流论坛 (http://bbs.micropoint.com.cn/)
bbs.micropoint.com.cn