能力值:
( LV4,RANK:50 )
2 楼
思路可以
不过在当前甚至未来数10年的有限存储、带宽和计算能力情况下不可行
楼主可以尝试用调试API SINGLE-STEP一下记事本,你就知道数据量。倘若每个用户随便点个程序都要记录,且都要产生对若干服务器的请求(按楼主的意思,其实是并发对N个服务器请求),说白了,最终的通讯情况是
M(桌面系统数量) <-> N中的X个(N为服务器总数量、X为其中的子集,比如楼主说的10)
考虑到实际应用时M非常非常大,而且以上通讯将会非常频繁(用户没每个操作都可能触发),另外服务器上做的其实是最消耗计算能力的对比、检索操作,再多高性能服务器恐怕都难以满足。
就算是引入P2P机制,P2P所带来的附加网络通讯流量恐怕极高,效果就像现在在低带宽线路开BT一样。
而且还要考虑到实际应用,安全管理是个问题。考虑到复杂网络情况,P2P是根本不适用的,比如企业的多个内网与互联网是隔离的、多个内网一般有访问控制。就算是不用P2P,这种模式是需要企业内部办公系统能直接访问外部网络的(否则谁来承担额外的服务器开销?),这本身就是不现实的情况
能力值:
( LV4,RANK:50 )
3 楼
还有个问题,实际应用的情况下,绝对不仅仅是CPU支持就能了事,操作系统的也必须支持,而且为了实际效率,那个EIP序列要忽略OS的代码(子集SINGLE-STEP一下记事本,看下OS代码的比例就知道必要性了),那么就带来两个问题
1)对于泛意义的病毒来说,并不是所有的病毒都是感染可执行文件的,还有宏病毒、脚本蠕虫、还有内嵌在网页中的恶意代码。此模式对这种病毒应该是没有对抗能力的(你要记录人家的解析器的EIP??)
2)对于已经执行的病毒,这种模式是没有任何的对抗能力的。
3)需要操作系统厂商合作。桌面系统,依据微软的一贯作风,恐怕微软会直接打包这种安全功能,不会分享给普通的反病毒厂商用的。实际上会极大挤兑第三方安全厂商的生存空间。不会有人愿意自杀的或者被杀的。
实际上,针对1)、2)夺得原因,考虑这种模式消耗太多资源,已经成为不适用的理由
能力值:
( LV2,RANK:10 )
4 楼
123kkdd
能力值:
( LV2,RANK:10 )
5 楼
rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
能力值:
( 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的状态,最终导致的还是寄存器的改变。
已经执行的病毒就更能察觉到了,即使他是一个线程
能力值:
( LV4,RANK:50 )
7 楼
1)反病毒的虚拟机是在特征扫描的结果符合一定条件的情况下才启用的,并不是像某些SB厂商炒作的那样一直在用,你这种思路跟虚拟机不是同一层次的。你想要对于每个被点击的程序执行
2)我就想你会说在客户端加CACHE,不过如果不动态与服务器群取得联系,这种模式的优势在什么地方?跟文件执行前的特征扫描对比有什么优势?速度上要甚至要慢一些的(如果你了解当前通用的特征扫描的优化手段,我想不用我说原因)
算喽~不扯了。
反正我的看法:无论是重新定制反病毒软件体系还是在现有体系上添加此模式,投入/产出不成比例
饿了,吃饭区
能力值:
( LV2,RANK:10 )
8 楼
(1)卡巴斯基平日里一直就开着虚拟机,我试过,不管你怎么变化你的程序,他只要结果,从这个角度看,看卡巴斯基不错,但虚拟机确实慢。
(2)特征码扫描永远揭示不了程序的结构,稍微加一个壳立马报废。
(3)软件模拟,挂钩子效率会低,但如果整合到cpu上,多出EP堆栈 和两个指针,效率高不说,没人hook得了
能力值:
( LV12,RANK:760 )
9 楼
做CPU级虚拟机...~
能力值:
( LV4,RANK:50 )
10 楼
商业上的运用不需要什么“揭示程序的结构”,要的是能解决实际问题、资源投入小于产出、要能适用于各种复杂环境。
CPU对于虚拟机的支持远没传说的那么强大,受限于CPU的设计初衷也不可能提供强大而复杂的支持。实际上,想实用现在INTEL CPU提供的恶心的虚拟化接口做出通用且稳定虚拟化支持,其难度不亚于开发与一个完整的操作系统内核,只有操作系统厂商或者专业的虚拟化公司才有这种实力。
如果不是对CPU虚拟化支持的实现复杂度有了解,还是不要随便寄托于“CPU怎么怎么样”
能力值:
( LV4,RANK:50 )
11 楼
懒得再扯了。
能力值:
(RANK:1060 )
12 楼
可惜现在一句一句jmp已经是萝卜白菜的活了
能力值:
( LV7,RANK:100 )
13 楼
我说两点:
1.除去系统函数还是有太多的eip序列,没有空间可以存放那么多(总要先储存再hash吧)
2.如果可以储存则涉及到安全问题,加密也没用,用户改一个字节就报废(不要说不可写)
3.对于一个程序eip序列几乎是不可测的,因为它可以有太多的if、cmp、jmp,程序执行受到太多的外在环境、参数影响。还有考虑到多CPU、多进程、特别是多线程的问题(甚至中断,如果cpu要弄清楚也太强了吧)
4.免杀更容易了(我写个工具,让天下所有virus隔两条指令jmp)
能力值:
(RANK:570 )
14 楼
说到底,还是特征码
一般的特征码是1对1
你的特征码呢? N 对 1
同一个病毒,你可能要提N个特征码才能很好识别.
不知道楼主分析过病毒没有.我分析病毒也没有什么经验,也就刚毕业那段试用期分析过.当时的样本基本分2个流程的,一是loader部分,另外一个就是runtime.在U盘病毒流行的时代,还包括在硬盘根目录下那种.
即一个病毒,你可以提取3套不同的EIP序列. 共有的部分是有的,即一开始当前目录的字符串比较.但是我很怀疑仅靠这么少的信息量就有用了
当然克服这个问题的事,在1个月之前已经在做了,不是采用EIP,而是其他一些东西,使得记录的时间复杂度和空间复杂度可行
另外我最早得知这种匹配算法,是一个曾经在某反病毒公司工作过的同事那里听说的.搞不好那个公司已经在用了,只是觉得还不是用来炒作的时机.
能力值:
( LV7,RANK:100 )
15 楼
还有,楼主的思路似乎要中毒之后才知道中毒……
还有“最大公共字符串是:a ->b ->c ->d ->e”未必是最大,可能很小如感染形的worm……
能力值:
(RANK:570 )
16 楼
**************************
能力值:
( LV2,RANK:10 )
17 楼
我晕我晕我晕晕..............
能力值:
( LV2,RANK:10 )
18 楼
没必要太论的东西还是少费点口舌较妥
能力值:
( 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别人的病毒尤为好使。
能力值:
( LV3,RANK:30 )
20 楼
如果在原代码里预留两段nop空间,程序编译完后,再用工具把这两段nop改写成两段之间或之内随机jmp,,,,,,,,,
病毒公司对一个所有的样本给出的答案只是可能?到底是不是病毒还要用户去判断吗?
我觉得病毒为了生存付出了那么多努力,那么反病毒公司也要付出相当的成本,应该不会有一劳永逸的方法的,就像矛和盾一样
能力值:
(RANK:570 )
21 楼
*********************
能力值:
( LV2,RANK:10 )
22 楼
只管真正起作用的那一套eip就行了吗,在这之前该程序如何对比是不是目标文件夹往哪复制都不管,一句话,错误的eip导致不了正确的行为
能力值:
(RANK:570 )
23 楼
@@@@@@@@@@@@
能力值:
( 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
能力值:
( LV7,RANK:100 )
25 楼
我觉得相似度也不行啊,假如我写个病毒根据不同参数做完全不同的行为(甚至直接退出),那是不是要很多套序列?而且要用户执行了才知道,那时就完蛋了(你自己说不是虚拟机)