概述
1.基于特征码的静态扫描技术(YARA匹配杀毒)
2.虚拟机技术
3.主动防御
基于特征码的静态扫描技术
包含病毒的文件刚从网络上下载下来的时候,就会进行静态扫描
,看看是否匹配到病毒特征码。
传统的反病毒软件引擎使用的是基于特征码的静态扫描技术,即在文件中寻找特定十六进制串,如果找到,就可判定文件感染了某种病毒。
几个概念要了解:
1.引擎前端:非自身程序行为的程序行为捕获。包括来自于内存的程序运行,来自于给定文件的行为虚拟判断,来自于网络的动态的信息等等。
2.基于引擎机制的规则判断。这个环节代表了杀毒引擎的质量水平,一个好的杀毒引擎应该能在这个环节发现很多或者称之为相当规模的病毒行为,存而避免进入下一个判断环节。为了更好的发现病毒,相继开发了所谓的虚拟机,实时监控等相关技术。这个环节被叫做杀毒软件引擎工作的核心层。
3.引擎与病毒库的交互作用。这个过程往往被认为是收尾阶段,相对于前两个环节,这个阶段速度是非常慢的,杀毒引擎与要将非自身程序行为过程转化为杀毒软件自身可识别的行为标识符(包括静态代码等),然后与病毒库中所存贮的行为信息进行对应,并作出相应处理。当然必须承认,当前的杀毒软件对大量病毒的识别都是在这个阶段完成的。因此一个足够庞大的病毒库往往能够弥补杀毒软件引擎的不足之处。但是必须意识到,如果在核心层阶段就可以结束并清除病毒程序,那么杀毒软件的工作速度将会大幅提升。“很可惜的是,当前我们没有足够聪明的杀毒引擎来完成这个过程”,这就是为什么有病毒库的原因。
Norton微软最高级的安全方面核心合作厂商。Norton采用了基于系统最底层的系统核心驱动,这种实现方式是最安全的或者说最高级的实现方式,当然这需要微软的系统源代码级的支持(要花许多money),业界公认,这是最稳定的实现方法。
大部分厂商采用的是中间件技术,在系统底层与非自身应用程序之间作为中间件存在并实现其功能;
另有一些厂商使用的是应用程序或者嵌入技术,相对而言这种方法安全性较低。
YARA匹配杀毒
YARA 是一个通过rule对恶意样本进行鉴定和分类的模式匹配工具。
1.静态文件中,C2 地址被加密,跑起来才能通过 C2 地址对该样本进行识别。
2.静态文件中,互斥量名称被加密,跑起来才能通过互斥量对该样本进行识别。
3.样本执行时会调用某个 API,该 API 行为很少见,可用于作为识别该样本的核心规则,但该 API 是显式调用的。
rule silent_banker
{
strings:
$a = {6A 40 68 00 30 00 00 6A 14 8D 91}
$b = {8D 4D B0 2B C1 83 C0 27 99 6A 4E 59 F7 F9}
$c = “UVODFRYSIHLNWPEJXQZAKCBGMT”
condition:
$a or $b or $c
}
定义了一条名为叫 silent_banker 的规则。
当 yara 发现样本中包含 $a 或者 $b 或者 $c三者中任意一条字符串时,则该规则命中。
注意:
以 rule 关键字开始定义。
规则标识符(名称)必不可少,标识符词法和 C 变量一致。
规则体内,strings 部分可以省略,但condition 必不可少。
meta:元数据提供关于规则的更多信息,供人阅读。元数据不参与匹配判断。
$a = “ws2_32.dll” nocase 大小写不敏感 默认大小写敏感
$a = “domain” fullword 全字匹配
$a = { E2 34 6B ( C8 | AA C3 ) FB } |替代
$a = /state:(on|off)/ 匹配state:on或state:off
strings:
$a = “md5”
$b = “send”
condition:
#a > 5 and #b ==3 字符串出现的次数
$a at 100 若对象为文件,则是文件偏移 若对象为进程,则为虚拟地址(RVA)
$a at 100 and
b
a
t
(
100..
f
i
l
e
s
i
z
e
)
u
i
n
t
16
(
0
)
=
=
0
x
5
A
4
D
a
n
d
u
i
n
t
32
(
u
i
n
t
32
(
0
x
3
C
)
)
=
=
0
x
00004550
判
断
当
前
文
件
是
否
是
合
法
P
E
2
o
f
(
b at (100..filesize) uint16(0) == 0x5A4D and uint32(uint32(0x3C)) == 0x00004550 判断当前文件是否是合法 PE 2 of (
bat(100..filesize)uint16(0)==0x5A4Danduint32(uint32(0x3C))==0x00004550判断当前文件是否是合法PE2of(a, $b, $c) 等价于 2 of them 多组字符串匹配
$hex_string = { F4 23 [-] 62 B4 }
这个规则可以匹配到下面两个字符串
F4 23 AAFF 62 B4
F4 23 AAAA AA AA AA…FF FF 62 B4
引入模块
import “pe”
rule IsPE
{
condition:
pe.characteristics & pe.EXECUTABLE_IMAGE
}
病毒特征码需要满足以下几个要求:
1、不能从数据区提取,因为数据区的内容很容易改变,一旦病毒程序变更版本,改变了数据内容,特征码就会失效。而其它的区块则相对来说保险一些。
2、在保持特征码的唯一性的前提下,应当尽量使得特征码短小精悍,从而减少检测过程中的时间与空间的复杂度,提高检测效率。
3、经过详细的逆向分析之后选取出来的特征码,才足以将该病毒与其它病毒或正常程序相区别。
4、病毒程序的特征码一定不能匹配到普通程序,比如选取病毒入口点的二进制代码,就必然出现误报的情况。
5、特征码的长度应当控制在64个字节以内。
虚拟机技术
查毒引擎中的虚拟机,并不是像VMWare的工作原理那样,为待查的可执行程序创建一个虚拟的执行环境,提供它可能用到的一切元素,包括硬盘,端口等,让它在其上自由发挥,最后根据其行为来判定是否为病毒。(当然这是个不错的构想,但考虑到其设计难度过大,需模拟元素过多且行为分析要借助人工智能理论,因而只能作为以后发展的方向。)就目前而言,卡巴斯基在这方面做得还可以。
设计虚拟机查毒的目的,就是为了对付加密变形病毒,虚拟机首先从文件中确定并读取病毒入口处代码,然后以上述工作步骤解释执行病毒头部的解密段(Decryptor),最后在执行完的结果(解密后的病毒体明文)中查找病毒的特征码。这里所谓的“虚拟”,并非是指创建了什么虚拟环境,而是指染毒文件并没有实际执行,只不过是虚拟机模拟了其真实执行时的效果。这就是虚拟机查毒基本原理。
虚拟机技术主要表现在穿壳能力比较强
。不过,很多杀毒软件还是能够向用户发出警报,以弥补无法脱壳的缺憾。
主动防御
主动防御技术是通过动态仿真反病毒专家系统对各种程序动作的自动监视,自动分析程序动作之间的逻辑关系,综合应用病毒识别规则知识,实现自动判定病毒,达到主动防御的目的。
当我们在程序中调用某个API函数并运行程序后,程序会隐式地将API函数所在的DLL文件载入到进程中,这样,程序就会像调用自己的函数一样调用API函数。
例如当我们所编写的exe文件须要调用CreateProcess()函数的时候,会将kernel32.dll载入内存(事实上无论运行什么程序,kernel32.dll一般都会自己主动载入内存),然后调用该动态链接库中的CreateProcess()函数(事实上真正调用的是CreateProcessA或CreateProcessW)。
真正的CreateProcess()函数的是如今kernel32.dll模块中。这里所说的调用,事实上能够理解为直接跳到该函数的地址去运行。
基于这些知识,我们全然能够改动API函数在内存中的映像,从而实现对API函数的钩取。
1.InlineHook
详细来说就是直接使用汇编指令jmp来改变代码的运行流程,先不让它跳到0x7C80236B的位置,而是跳到我们自己编写的代码处运行,在运行完我们自己的代码后,再决定是否让它再跳到0x7C80236B继续运行。
详细到我们所要编写的主动防御程序,事实上函数钩取,也就是Hook CreateProcess()功能,是通过一个DLL程序来实现的,而我们的主函数的作用,就是将DLL注入到对应的进程中,当停止监控时,再将DLL卸载。
在Ring3层。我们经常使用的对系统进行全局监控的方式是使用Windows的全局钩子。
2.DLL注入
可见,这样的钩子须要使用DLL注入的方式来实现。假设使用这样的方式,我们须要使用SetWindowsHookEx()函数来进行钩子的设置。并将该函数的第一个參数设置为WH_GETMESSAGE,即监视被投递到消息队列中的消息。
事实上绝大多数的进程都是由explorer.exe进程创建的。比方我们打开ProcessExplorer。
首先,感谢任何一个阅读,关注或点赞我博客的朋友!! 当然博客中的任何问题都欢迎大家随时指出! 欢迎有兴趣的人私信留下你的联系方式,我们可以一起沟通,一起学习哦!我的学习交流QQ群366469549。 再次感谢大家的支持!!! 我会再接再厉的!!!
最后
以上就是追寻哑铃为你收集整理的神秘的杀毒软件原理曝光的全部内容,希望文章能够帮你解决神秘的杀毒软件原理曝光所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复