首页
社区
课程
招聘
[原创]一种新的杀毒思路
发表于: 2008-9-6 10:18 21193

[原创]一种新的杀毒思路

2008-9-6 10:18
21193

今天又胡思乱想了,后头看看这几年的技术发展,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,能会意即可

QQ 441904119 欢迎交流


[招生]系统0day安全班,企业级设备固件漏洞挖掘,Linux平台漏洞挖掘!

收藏
免费 7
支持
分享
最新回复 (53)
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
思路可以

不过在当前甚至未来数10年的有限存储、带宽和计算能力情况下不可行
楼主可以尝试用调试API SINGLE-STEP一下记事本,你就知道数据量。倘若每个用户随便点个程序都要记录,且都要产生对若干服务器的请求(按楼主的意思,其实是并发对N个服务器请求),说白了,最终的通讯情况是  
    M(桌面系统数量)  <->  N中的X个(N为服务器总数量、X为其中的子集,比如楼主说的10)

考虑到实际应用时M非常非常大,而且以上通讯将会非常频繁(用户没每个操作都可能触发),另外服务器上做的其实是最消耗计算能力的对比、检索操作,再多高性能服务器恐怕都难以满足。
就算是引入P2P机制,P2P所带来的附加网络通讯流量恐怕极高,效果就像现在在低带宽线路开BT一样。
而且还要考虑到实际应用,安全管理是个问题。考虑到复杂网络情况,P2P是根本不适用的,比如企业的多个内网与互联网是隔离的、多个内网一般有访问控制。就算是不用P2P,这种模式是需要企业内部办公系统能直接访问外部网络的(否则谁来承担额外的服务器开销?),这本身就是不现实的情况
2008-9-6 12:37
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
还有个问题,实际应用的情况下,绝对不仅仅是CPU支持就能了事,操作系统的也必须支持,而且为了实际效率,那个EIP序列要忽略OS的代码(子集SINGLE-STEP一下记事本,看下OS代码的比例就知道必要性了),那么就带来两个问题
1)对于泛意义的病毒来说,并不是所有的病毒都是感染可执行文件的,还有宏病毒、脚本蠕虫、还有内嵌在网页中的恶意代码。此模式对这种病毒应该是没有对抗能力的(你要记录人家的解析器的EIP??)
2)对于已经执行的病毒,这种模式是没有任何的对抗能力的。
3)需要操作系统厂商合作。桌面系统,依据微软的一贯作风,恐怕微软会直接打包这种安全功能,不会分享给普通的反病毒厂商用的。实际上会极大挤兑第三方安全厂商的生存空间。不会有人愿意自杀的或者被杀的。

实际上,针对1)、2)夺得原因,考虑这种模式消耗太多资源,已经成为不适用的理由
2008-9-6 12:51
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
123kkdd
2008-9-6 13:06
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
2008-9-6 13:08
0
雪    币: 340
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我说的只是一个思路,实际操作中并不是要每次执行都要访问网络,现在的杀软更是做不到这一点,网络验证是以用户为中心的,根据用户需求而定。
   量的问题,这个就要靠算法来解决了,“我们并不需要如此高清的序列”,这就如同bmp->jpg的压缩,数据量迅速减少,我算法学的不好,牛人来帮想想数据压缩。
   至于服务器计算 动态规划的算法 O(n^2),这个是准确度极高的,模糊一下可以达到O(nlog(n)),其实要说效率,这就不能不谈这种杀毒方法所面向的对象,不是机关单位(机关单位需要专家级别,提前预警等等苛刻的要求,而此杀毒方法有明显滞后性),而是保密性不高的普通用户,依我看目前瑞星卡巴斯基也不过是做到了普通用户级别,稍微有一点厉害的病毒,马上就喀嚓了。
既然面对的是普通用户,服务器上大众喜闻乐见的木马病毒当然排在前面,效率是O(n),采用更好的数据结构可以做到O(log(n)),这样完成一次扫描服务器总的消耗就是 O(nlog(n)*log(m)) ( n是eip序列的长度,m是病毒库里病毒的数量,m不是每次都要扫完,“扫描二叉树根部”)
    现在是初级阶段,如果真的服务器不能够承受压力,可以将一部分的常见的码表放在客户端上
总是说的是一种思路:
    EIP序列抽象程序执行结构
    高效算法减少网络流量,减轻服务器压力
    p2p用户互帮互助
最起码比虚拟cpu效率要高
------------------------------------------------------------------------------------------------
    凭良心说,真的不想微软一股独大,但是从一个系统角度上去考虑,没人比ms更了解自己的作品了,在他的系统之外再单独分配一些权限,往往会导致问题。
    再说一下模拟器。不管什么模拟器,一段程序的本质特征可以表述为一系列的cpu+stack的状态,最终导致的还是寄存器的改变。
    已经执行的病毒就更能察觉到了,即使他是一个线程
2008-9-6 13:12
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
1)反病毒的虚拟机是在特征扫描的结果符合一定条件的情况下才启用的,并不是像某些SB厂商炒作的那样一直在用,你这种思路跟虚拟机不是同一层次的。你想要对于每个被点击的程序执行
2)我就想你会说在客户端加CACHE,不过如果不动态与服务器群取得联系,这种模式的优势在什么地方?跟文件执行前的特征扫描对比有什么优势?速度上要甚至要慢一些的(如果你了解当前通用的特征扫描的优化手段,我想不用我说原因)

算喽~不扯了。
反正我的看法:无论是重新定制反病毒软件体系还是在现有体系上添加此模式,投入/产出不成比例
饿了,吃饭区
2008-9-6 13:26
0
雪    币: 340
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
(1)卡巴斯基平日里一直就开着虚拟机,我试过,不管你怎么变化你的程序,他只要结果,从这个角度看,看卡巴斯基不错,但虚拟机确实慢。
    (2)特征码扫描永远揭示不了程序的结构,稍微加一个壳立马报废。
    (3)软件模拟,挂钩子效率会低,但如果整合到cpu上,多出EP堆栈 和两个指针,效率高不说,没人hook得了
2008-9-6 13:34
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
9
做CPU级虚拟机...~
2008-9-6 13:49
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
商业上的运用不需要什么“揭示程序的结构”,要的是能解决实际问题、资源投入小于产出、要能适用于各种复杂环境。

CPU对于虚拟机的支持远没传说的那么强大,受限于CPU的设计初衷也不可能提供强大而复杂的支持。实际上,想实用现在INTEL CPU提供的恶心的虚拟化接口做出通用且稳定虚拟化支持,其难度不亚于开发与一个完整的操作系统内核,只有操作系统厂商或者专业的虚拟化公司才有这种实力。
如果不是对CPU虚拟化支持的实现复杂度有了解,还是不要随便寄托于“CPU怎么怎么样”
2008-9-6 15:05
0
雪    币: 242
活跃值: (14)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
懒得再扯了。
2008-9-6 15:07
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
12
可惜现在一句一句jmp已经是萝卜白菜的活了
2008-9-6 15:26
0
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
13
我说两点:
1.除去系统函数还是有太多的eip序列,没有空间可以存放那么多(总要先储存再hash吧)
2.如果可以储存则涉及到安全问题,加密也没用,用户改一个字节就报废(不要说不可写)
3.对于一个程序eip序列几乎是不可测的,因为它可以有太多的if、cmp、jmp,程序执行受到太多的外在环境、参数影响。还有考虑到多CPU、多进程、特别是多线程的问题(甚至中断,如果cpu要弄清楚也太强了吧)
4.免杀更容易了(我写个工具,让天下所有virus隔两条指令jmp)
2008-9-6 16:07
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
14
说到底,还是特征码

一般的特征码是1对1

你的特征码呢? N 对 1

同一个病毒,你可能要提N个特征码才能很好识别.

不知道楼主分析过病毒没有.我分析病毒也没有什么经验,也就刚毕业那段试用期分析过.当时的样本基本分2个流程的,一是loader部分,另外一个就是runtime.在U盘病毒流行的时代,还包括在硬盘根目录下那种.

即一个病毒,你可以提取3套不同的EIP序列. 共有的部分是有的,即一开始当前目录的字符串比较.但是我很怀疑仅靠这么少的信息量就有用了

当然克服这个问题的事,在1个月之前已经在做了,不是采用EIP,而是其他一些东西,使得记录的时间复杂度和空间复杂度可行

另外我最早得知这种匹配算法,是一个曾经在某反病毒公司工作过的同事那里听说的.搞不好那个公司已经在用了,只是觉得还不是用来炒作的时机.
2008-9-6 18:06
0
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
15
还有,楼主的思路似乎要中毒之后才知道中毒……
还有“最大公共字符串是:a ->b ->c ->d ->e”未必是最大,可能很小如感染形的worm……
2008-9-6 18:13
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
16
**************************
2008-9-6 18:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我晕我晕我晕晕..............
2008-9-6 18:38
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
没必要太论的东西还是少费点口舌较妥
2008-9-6 18:42
0
雪    币: 340
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
错了错了,可能是我说的不明白。
我说的特征码并非传统的完全的匹配,像KMP这种几百年前的算法早就掉的没牙了;
我的意思是:首先取相对EIP,然后进行相似度比较,注意是比较!!而不是完全相等,也就是说如果你在某个地方jmp了一下,最后的相似度还是99%.
如果在前面加了壳也不怕,因为算法是 取最大公共字符串后,再与特征串看相似度,下面有个例子:
原来程序:a b c d e f
jmp程序:a b c [jmp]d e f
颠倒程序:a b c e d  f
加壳程序:1 2 3 4 5 6 a b c d e f
不管如何的变,取最长公共字符串后,和原EIP序列仍旧是有90%的相似度,EIP序列对比只不过简化了两块内存的对比,我们告诉用户的也仅仅是相似度,而非完全的说其为病毒,不像某些xxx,对用户不负责任。
现在的问题是EIP用一种算法抽象,使他能够摆脱base的影响.

该方法也解决了反病毒人员不够用的问题,使得每一个用户都有自己的话语权,专家只负责将用户举报多的进行确认,随着码表的不断完善,甚至能够根据EIP序列知道其功能,这对于很多爱A别人的病毒尤为好使。
2008-9-6 20:02
0
雪    币: 88
活跃值: (176)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
20
如果在原代码里预留两段nop空间,程序编译完后,再用工具把这两段nop改写成两段之间或之内随机jmp,,,,,,,,,
病毒公司对一个所有的样本给出的答案只是可能?到底是不是病毒还要用户去判断吗?
我觉得病毒为了生存付出了那么多努力,那么反病毒公司也要付出相当的成本,应该不会有一劳永逸的方法的,就像矛和盾一样
2008-9-6 20:37
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
21
*********************
2008-9-6 20:55
0
雪    币: 340
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
只管真正起作用的那一套eip就行了吗,在这之前该程序如何对比是不是目标文件夹往哪复制都不管,一句话,错误的eip导致不了正确的行为
2008-9-6 21:31
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
23
@@@@@@@@@@@@
2008-9-6 22:00
0
雪    币: 340
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
新的特征码的加入主要依靠用户的举报,相似度很低的时候不做任何存储。举报用户这个群体主要是 1.能够简单认识病毒,n多,很多人整天担心。。。。2.受害者,已经中了病毒,机器性能受影响或虚拟现实财产受损。
       指令的插入不差生影响(可以参考动态规划里的“最长公共不连续字符串”),变形可能会产生影响 (push eax pop ebx    mov ebx,eax),被完全认不出的代价就是release版本所有的指令悉数被替换。
     分割块我暂时没有想出办法。
     记录深度用一个逗留值来衡量。一个程序或者结束或者不断的routine,当他不断循环时eip成环状。

------------------------------------------------------------------------------------------------
分割快问题我想到了解决的办法了
从用户机器上得到的原始数据像下面这样:
004010DC
004010E6
004010F0
004010F2
0040124C
7023A82C
7023A82D
7023A82F
7023A835
00401000

我们对其不做任何的处理的话,用下面的算法可以求出最长公共非连续字符串:
现有两序列ab,nm分别为其长度  a[i](1<=i<=n)   b[j] (1<=j<=m)
k[i,j]表示a序列的前i项与b序列的前j项的最长公共子串
则有k[i,j]=max{k[i-1,j-1]+(b[j]-a[i]==b[j-1]-a[i-1]),
                        k[i,j-1],
                        k[i-1,j]}
for (i=1;i<=n;i++)
   for (j=1,j<=m;j++)
   {
       k[i,j]=max(k[i-1,j-1]+((b[j]-a[i])==(b[j-1]-a[i-1])),k[i-1,j]);
       k[i,j]=max(k[i,j-1],k[i,j]);
   }
我们比较两个基址不同的串 做的都是差值,今天晚上对这个算法写个demo
2008-9-6 22:30
0
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
25
我觉得相似度也不行啊,假如我写个病毒根据不同参数做完全不同的行为(甚至直接退出),那是不是要很多套序列?而且要用户执行了才知道,那时就完蛋了(你自己说不是虚拟机)
2008-9-6 23:22
0
游客
登录 | 注册 方可回帖
返回
//