[系统安全1]初级免杀基础理论(反病毒软件特征码提取介绍、免杀原理、壳)
在52pojie发表《xxxx》病毒查杀的帖子后,感谢论坛里的会员GleamJ牛不但指出我文章后所添加服务名字符串作为特征码方式的不足,还分享了他工作中4种提取特征码的方法。让我更加觉得要加紧时间学习,这样才不会被大牛甩得太远。弄清楚基本概念,以后吹水不致被嫌弃得太惨。嘿嘿!
基础篇 初级免杀技术
第1章 变脸
免杀是一种反杀毒技术。它除了使病毒木马免于被查杀外,还可以扩增病毒木马的功能,改变病毒木马的行为;
特征码其实是从反病毒领域引进的一个词,意指相应病毒或木马所持有的一段二进制码;
免杀主要分为3种, 其中一种便是行为免杀,通过控制病毒木马的行为来达到躲过杀毒软件主动防御检测的目的。
第2章 免杀基础知识
2.1 什么是Ring0?
计算机中有一个用于控制CPU完成各项功能的命令系统,它叫做“指令系统”,指令系统将指令分为特权指令与普通指令。对于一些危险的指令(即绝大部分特权指令),只允许操作系统及其相关模块使用,而普通的应用程序只能使用那些不会造成灾难的指令(即普通指令)。
Intel的CPU将特权级别分为4层,它们分别是Ring0,Ring1,Ring2与Ring3。Ring0为底层,也就是所谓的“内核层”,它也是操作系统的底层;Ring3为最高层,也就是用户层。
Ring0 只供操作系统使用(内核层)
Ring3 谁都可以用(用户层)
2.2 反病毒的工作原理
反病毒软件一般由扫描器、病毒库与虚拟机组成,并由主程序将它们整合为一体。
-
扫描器 用于查杀病毒,是反病毒核心
-
病毒库 总存储着病毒所具有的特征字符,称之为"特征码"。
-
虚拟机 可以使病毒在一个由反病毒软件构建的虚拟环境中执行,这样就与现实的CPU、硬盘等物理设备完全隔离了,从而可以更加深入地检测文件的安全性。
2.3 基于文件扫描的反病毒技术
第一代扫描技术
第一代扫描技术主要在文件中检索病毒特征序列。主要分为“字符串扫描技术”与“通配符扫描技术”
(1)字符串扫描技术
字符串扫描技术一般使用从病毒中提取出来的具有特征的一段字符来检测病毒,例如一个隐藏执行格式化所有硬盘的命令是不可能出现在普通程序里的。
(2)通配符扫描技术
此技术中的通配符可以理解为具有一定意义的符号,例如DOS命令里的“*”号就是代表任意长度、任意字符的通配符。扫描器中的通配符一般用于跳过某些字节或字节范围,而现在大多数的扫描器已经支持正则表达式了。
yara这款工具就是支持特征码进行扫描的开源工具。
(3)其他扫描技术
-
不匹配字节数扫描技术:允许字符串中有N个字节为任意值
-
通用检测法扫描技术:散列是一个常见的属于,这里指可以对特征码的首字节或第一个16位32位字节进行计算,从而允许字符串后面的字节包含通配符。
-
书签检测法:这是一种保证病毒检测与清除过程更加准确的方法。
-
首尾扫描检测法:通过只扫描文件头部和尾部而加快病毒检测速度的复杂方法。
-
入口点和固定点扫描:可以进一步提升防毒扫描工具检测速度的一种方法。
-
文件名扫描法:根据文件名及文件所在路径粗略判断此文件是否是病毒。
第二代扫描技术
第二代扫描技术对检测精度给予了充分的重视,分别为“近似精确识别法”与”精确识别法“、”智能扫描法“、”骨架扫描法“。
(1)智能扫描法
智能扫描法会忽略检测文件中像NOP这样无意义的指令。
(2)近似精确识别法
近似精确法包含了若干种方法。下面是两种具有代表性的扫描技术
-
多套特征码:该方法采用两个或更多个字符集来检测每个病毒,如果扫描器检测到其中一个特征符合,那么就会警告发现变种,但不会执行下一步操作,例如清除病毒体或删除文件。如果多个特征码全部符合,则报警发现病毒,并执行下一步操作。
-
校验和:思路是让每一个无毒的文件生成一个校验和,等待下次扫描时再进行简单的校验和对比。如果校验和有所变化,再做进一步的扫描,否则就说明这个文件没有被感染。除此之外,某些安全产品还对病毒文件采取了分块校验的方式以提高准确性。
校验和简单来说就是通过对病毒中的某一段代码进行计算,从而得出一个值(例如123XY4),它与MD5文件校验有些相似。
(3)骨架扫描法
此方法既不用特征码,也不用校验和。而是通过逐行解析宏语句,并将所有非必要字符丢弃,只剩下代码的骨架,通过对代码骨架的分析,从而提高对变种病毒的检测能力。
(4)精确识别法
精确识别法是现今能够保证扫描器精确识别病毒变种的唯一方法,常与第一代扫描技术结合使用。精确识别法也是利用校验和技术,能够对整个病毒进行校验和计算来生成特征图。
2.4 基于内存扫描的反病毒技术
因为程序在运行后会将自身释放到内存中,释放后的文件结构与未执行的文件相比有较大的差异。被加载到内存就证明它要开始执行一些动作了,在病毒或木马初始化运行环境的时候,会让更多的可疑点暴露出来。
反病毒厂商一般会为内存扫描组件单独定义一套新的特征码。
2.5 基于行为监控的反病毒技术
所谓的“行为”就是指一个应用程序运行后的操作。对于一个程序来说,如果按照某种顺序执行某一系列的操作,我们就将其成为“行为特征”。
例如:以一个典型的木马程序为例,它可能执行的操作步骤如下:
1)释放一些文件到系统关键目录中
2)修改系统设置使这些新释放的文件可以启动
3)删除自身
2.6 基于新兴技术的反病毒技术
-
云查杀:可信继承,群策群力
云查杀的基本思路就是以服务器为脑,以所有用户的机器为触角,从而使得服务器可以随时知道每个用户的情况。如果其中某一个用户与其他用户对比发生了异常,那么服务器就会发出指令,让发生异常的机器检查出问题的所在,从而在这个问题干扰到其他用户之前将其扼杀掉。
典型例子是绝大多数的机器上都运行过QQ.EXE,那么当一个新加入的机器也试图运行QQ.EXE时,服务器就认为这是正常的。否则服务器就会发出相应指令让用户的机器去阻止其运行。
(1)可信继承
整个云的信任机制是非常复杂的结构,其中包含用户参与的信任评价体系、反病毒专业人员参与的样本分析信任体系、服务端自动判断信任体系,以及基于数字签名的认证信任体系等。
顶端的信任体系是由数字签名、样本分析构成的。凡是由可信进程开启的新进程都被认为是可信的。
例如:进程A是具有数字签名的根可信进程,那么它在被用户直接执行时就不会触发反病毒软件的任何操作,而且由A进程创建的新进程也会成为可信进程。如果进程B是一个非可信进程,那么它在被用户执行时就会受到严密的监控,如果它在执行期间有什么敏感操作,其样本马上就会被提交给服务器处理。
(2)群策群力
其中一台计算机上发现新病毒,那么它马上就会被提交到服务端,在服务端快速更新后,所有在云中的计算机就都获得了对这种病毒的免疫力。
(3)多引擎查杀
360安全卫士在病毒查杀模块就是使用了多款反病毒引擎。同时运用多个反病毒引擎扫描病毒,其扫描准确度会比单一反病毒引擎有所提高。
2.7 主动防御与云查杀
这两项技术中最为强大的环节就在于代码仿真技术。
“虚拟机扫描技术”的原理是通过一个虚拟机环境来仿真CPU和内存管理系统,从而模拟代码执行过程。
当反病毒决定将某个程序放到虚拟机中运行时,首先要将可执行文件的内容读取到内存缓冲区中,然后将仿真器中一个庞大的Switch()语句对各个指令操作码进行逐一分析,最后执行。
“文件流查杀”的原理是让病毒被人为地主动运行,当病毒运行时它会分析病毒释放到内存中的代码,直到病毒本来的代码被完全还原后才进行查杀,因此这种扫描算法虽不需要耗费大量的系统资源,却十分被动。
第3章 PE文件- (书章 2.3)
在windows系统中,凡是可以直接以二进制形式被系统加载执行的文件都是PE文件,例如.exe/.dll/.sys/.ocx等都遵循PE文件结构的约定,属于可执行文件。
3.1 PE文件的结构
PE文件由DOS文件头、DOS加载模块、PE文件头、区段表与区段5部分构成。
整个程序以DOS文件头的MZ标志位开始的,也就是4D5A处。
PE文件头的标准大小为224字节。
区段表也称为节表,由.text、.data与.rsrc组成,在逆向过程中不同类型的程序区段表组成也是有所区别的。通过区段表名称我们可以大体猜出来这个区段里包含了些什么信息。
第4章 免杀原理 - (书章 2.4)
免杀的基本思想就是破坏特征码,文件特征码与内存特征码。
4.1 文件免杀原理
基于文件的免杀基本上就是破坏原有程序的特征。无论是修改特征码还是加上一段花指令还是加壳,目的就是为了打乱或加密可执行文件内部的数据。
-
- 改特征码免杀原理
第一种是将相对地址内的某句话改成别的就可以了,例如我文章中提到过的【Ghijkl Nopqrstu Wxy】这样的服务名改成其他的服务名。
第二种是针对校验和查杀技术提出的免杀思想,在某篇帖子里提到的
【在病毒文件内部选取两个位置(这两个位置可以是特色字符也可以是特色代码),计算这两段位置的哈希值作为特征。这种方法的好处是,不论选取多长的特征,那么最终生成的哈希值是固定的,这样就便于存储。】
校验和也是根据病毒文件不同的区块计算出来的。如果一个文件某个特定区域的校验和符合病毒库中的特征,就会被杀毒软件报毒。只要对病毒的特定区域进行一定的更改,就会使这一区域的校验和改变,从而达到欺骗杀毒软件的目的。
-
- 花指令免杀原理
花指令是一段毫无意义的指令,花指令是否存在对程序的执行结果没有影响,它存在的唯一目的就是阻止反汇编程序或对反汇编设置障碍。
这一章我理解为是汇编指令的变换。例如call指令,就是push一个地址,然后jmp到这个地址处。还有涉及到对堆栈的操作。
例如
push ebp
mov ebp,esp
add esp,-0C // 堆栈中减去0C个字节
add esp,0C // 堆栈中推出0C个字节
push eax
jmp入口
以上代码就相当于啥都没有做。
因为大多数反病毒软件是靠特征码判断文件是否有毒的,而为了提高精度,现在的特征码都是在一定偏移量限制之内的,否则会对反病毒软件的效率产生严重的影响。添加一段花指令后,程序的部分偏移会受到影响,如果反病毒软件不能识别这段花指令,那么它检测特征码的偏移量会整体位移一段位置,自然也就无法正常检测木马了。
-
- 加壳免杀原理
壳就是软件所增加的保护,并不会破坏里面的程序结构,当我们运行这个加壳的程序时,系统首先会运行程序里的壳,然后由壳将加密的程序逐步还原到内存中,最后运行程序。
加密后的文件结构会发生变化,自然会改变原有文件偏移的特征码,那么反病毒软件也就会认为它是一个正常的文件了。
4.2 内存免杀原理
数据进入CPU之前会在内存中处理成可以直接被CPU执行的形式。
所以反病毒公司会选择扫描内存的形式去查杀木马。因为将要被执行的程序肯定比未执行程序的威胁更大。再厉害的木马只要能保证它不被执行,它在用户的计算机中最多也就是算是一个垃圾文件,就不会对用户及网络构成任何威胁。
大多数反病毒公司的内存扫描与文件扫描采用的不是同一套特征码,必须要将它们全部破坏掉才能躲过反病毒软件的查杀。
对抗内存查杀,只要加一个混淆程序原有代码的“猛”壳,还是有几率能躲过杀毒软件的内存查杀。
行为免杀原理
从最早的“文件防火墙”发展到后来的“主动防御”,再到现在的部分“云查杀”,其实都应用了行为查杀技术。
一个应用程序之所以被称为“病毒”或者“木马”,就是因为它们执行后的行为与普通软件不一样。
【添加服务、创建驱动、释放资源、添加注册表、增加自启动、创建互斥体、遍历全硬盘的文件、远程线程注入、HOOK】等行为。
第5章 壳的分类 - (书章 2.5.1)
因为很多木马都是加过壳的,而且这些加壳后的木马已经被反病毒公司提取了特征,所以如果黑客们不能将其脱壳,也就无法进行有效的免杀。
这章只对壳的分类原理进行总结
-
- 压缩壳
压缩壳的主要目的是压缩应用程序的体积,例如UPX可以将一般的应用程序压缩到原体积的30%左右。
压缩壳并不会对被加壳程序本身做任何修改,而是直至将其换成一种更加节省空间的存储方式。经过压缩壳处理过的程序在真正被CPU执行前是会自动解压缩(解密)的。
-
- 加密壳
加密壳的主要目的是保护原程序不被破解,一般情况下,加密壳会对源程序进行一定的修改,例如代码乱序、代码混淆等。因此经过加密壳处理的程序即便是提交给CPU去执行,源程序的代码也还是发生了改变。
-
- 代码乱序
将本来线性执行的代码分成若干份后颠倒存储位置,再通过跳转指令将其按照正确的顺序连接起来。
这样对于CPU来说其执行的程序逻辑没变,只是多了几条跳转指令。但是这段代码在硬盘上或内存中的组织排列方式却发生了很大的变化。
-
- 代码混淆
代码混淆的本质就是一条指令扩展为若干条指令,例如原本是一个计算“1+1”的代码,但是混淆后就变成了“1+10-9+0-0+1-1”,虽然结果一样,但是代码本身的代码甚至部分逻辑都发生了变化。
-
- 虚拟机保护壳
虚拟机保护壳的关键技术就在于实现了一个软件版本的CPU,被加密的可执行代码不再遵循Intel制定的OPCode标准了,而是执行由虚拟机作者本身制定的非公开的、动态的CPU指令编码解码标准,我们通常称之为TextCode。