今天又胡思乱想了,后头看看这几年的技术发展,Anti 反Anti各种较量突然觉得很累,难道非要把侦测病毒,或者说恶意程序的任务放在系统之外单独运行么,作为一个系统,应该有既有执行的能力,又应该有“感觉”自身的能力。。。。。
然后发了好长时间的呆,突然我想到了EIP(这里的eip是非绝对eip,不考虑基址的影响,是相对性的)。 eip记录了程序运行的整个过程,它是最不能说谎的,一段代码的区别于另一段代码最简洁最不可改变的就是eip了,无论一个程序如何加壳,最终还是要跳到真正的入口, 就像下面这样:
无壳:a ->b ->c ->d ->e
有壳:f->g->k->l->a->b->c->d->e
最大公共字符串是:a ->b ->c ->d ->e,eip揭示了该程序的执行顺序这个本质特征,如果要使程序与原来完全不相像,只能执行一句一jmp了。
这样,我们把一个程序运行过程中的所有eip形成一个序列(我知道数据量比较大,这只是一个初始的想法,可以做一些优化,比如把eip hash),用户的机器只负责计算出这个值,然后把这个值传送到服务器上,服务器用该序列与病毒库里的eip序列做相似度分析(这里采用动态规划算法,求最大公共字符串,如果把服务器上的病毒库做病毒频率排序,效率可以做到很高),在客户端可以让用户对有害程序进行举报,服务器上生成举报排名后,反病毒专家再分析,经确认后正式加入病毒库。
至于如何记录eip 值,这就是文章开头说的,最好能够整合到cpu上,cpu独立开辟一个堆栈段,记录已经走过的eip序列,这样就不用使用虚拟机,识毒杀毒的效率就会大大的提高。
下面说说服务器上的算法以及数据结构:
假设有序列A:a ->b ->c ->d ->e
实际上我们不需要如此高清的序列,用hash一一对应形成一个原来数据量1/3的又反映原来线性特征的新序列是可以的。新序列与服务器上的特征码对比可以用二叉查找树,我们不断地维护这个二叉树就可以了。像机器狗灰鸽子这种常见的病毒,会排在这棵树的根部,没几下就对比完了,如果扫描了n层节点还没有找出一例相似度很高的,可以暂认为无毒。
写的很乱,排版也不好,只为说个理,希望一起探讨。
--------------------------------------------------------------------------------------------------------
上面是昨天想的,今天一上论坛,看见 【讨论】杀毒软件的发展方向,服务器智能分析的云安全 一文,说道了服务器的限制,我又想了想可以采用p2p的方式,所有的特征码都放在服务器上,而一些比较常见的特征码(机器狗、灰鸽子、磁碟机)放在客户机上,进行p2p传播,p2p计算。这就如同平日里我们判断一个人的好坏,总要打听一下其他人一样,如果打听了10台机器,有九台机器说是病毒,那就基本错不了了。
EIP序列相似度分析算法主要解决的是数据量的问题。。。。。这样可以直接和各大病毒实验室链接,组成一个群组。。。。。。。
add:
随便想了一种压缩抽象数据的方法,将EIP序列生成一条有粗细的线,执行过去的地方线宽度加一,最后的结果如下:
1 mov eax,1
1 xor esi,esi
1111 @@: inc esi
1111 cmp esi,4
1 jle @B
1 cmp esi,5
1 je @F
0 lea eax,[esi]
1 @@: lea ebx,[esi]
然后将线用公式 hash=hash+a[i]*i (1<=i<=len_LINE)
光这种简单hash就能兼容N^N种病毒特征
--------------------------------------------------------------------------------------
问题总结:
1.程序多分支多序列。。解决
2.EIP串值压缩。。。。半成
3.EIP高速匹配。。。。解决
4.服务端特征值排序。。解决
5.多线程,多进程。。。最大问题。。。困扰
一WaitForMultipleObjects就死翘翘了,一种解决方法是虚拟机,把所有的线程都分割开。。。。。头大了,不写了
6.os代码冗余。。。。。解决
不跟进去了,直接在序列上生成个MARK,能会意即可
- 标 题:一种新的杀毒思路
- 作 者:marshalx
- 时 间:2008-09-06 10:18
- 链 接:http://bbs.pediy.com/showthread.php?t=72157