该系列文章将系统整理和深入学习系统安全、逆向分析和恶意代码检测,文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。漫漫长征路,偏向虎山行。享受过程,一起加油~
前文从产业界和学术界分别详细讲解恶意代码攻击溯源的相关知识,在学术界方面,用类似于综述来介绍攻击追踪溯源的不同方法;在产业界方面,主要参考李东宏老师从企业恶意样本分析的角度介绍溯源工作。
这篇文章将详细总结恶意代码检测技术,包括恶意代码检测的对象和策略、特征值检测技术、校验和检测技术、启发式扫描技术、虚拟机检测技术和主动防御技术。主要学习老师的课程,希望这篇文章对您有所帮助,如果文章中存在错误、理解不到位或侵权的地方,还请告知作者与海涵。且看且珍惜,加油~
文章目录:
- 一.恶意代码检测的对象和策略
- 二.特征值检测技术 1.特征值检测技术概念 2.特征值的提取选择及方法 3.优缺点
- 三.校验和检测技术 1.什么是校验和检测技术 2.校验和检测对象 3.优缺点
- 四.启发式扫描技术
- 五.虚拟机检测技术
- 六.主动防御技术 1.主动防御技术概念 2.主动防御实现机理 3.优缺点
- 七.总结
作者的github资源:
- 逆向分析: https://github.com/eastmountyxz/ SystemSecurity-ReverseAnalysis
- 网络安全: https://github.com/eastmountyxz/ NetworkSecuritySelf-study
声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。该样本不会分享给大家,分析工具会分享。(参考文献见后)
自全球第一个计算机病毒出现后,人们通过与病毒长期的斗争,积累了大量反病毒经验,掌握了大量实用的反病毒技术,并研制出一系列优秀的反病毒产品,主要用于病毒的防护、检测及其清除等。病毒的检测技术主要包括特征值检测技术、校验和检测技术、启发式扫描技术、虚拟机检测技术、主动防御技术,以及新兴的云查杀技术等。个人用户也可以通过经验、安全检测工具和反病毒软件来检查计算机是否感染病毒,或是采用沙箱及相关静、动态分析手段来对病毒进行深入分析。
一.恶意代码检测的对象和策略
恶意代码的检测是将检测对象与恶意代码特征(检测标准)进行对比分析,定位病毒程序或代码,或检测恶意行为。
首先,我们介绍恶意代码检测对象。检测对象主要包括:
- 引导扇区
- 文件系统中可能带毒的文件:安全公司的产品主要针对文件进行病毒检测
- 内存空间
- 主板BIOS:系统启动时涉及的代码
- 网络流量:网络交互也是检测对象,如VPS、VDS
- 系统行为
- …
接着我们主要介绍三类检测对象。
(1) 检测对象——引导扇区 引导扇区之所以成为检测对象,是因为部分引导扇区是具有控制权的,它在系统启动、执行过程中会执行相应代码,并且这些代码可能会被恶意软件所篡改。主要包括:
- 硬盘主引导扇区
- 硬盘操作系统引导扇区
- 可移动磁盘引导扇区
检测目标:
- 引导区病毒、MBR木马等
(2) 检测对象——可能带毒的文件 有些文件是正常被感染所致,有些文件是独立存在系统中的。
- 可执行程序 .exe;.dll;.com;.scr… (最普遍的检测对象)
- 数据文件 .doc;.xls;.ppt;.pdf; .mp3;.avi… (比如宏病毒、Office文档都是检测对象)
- 脚本文件 .js;.vbs;.php;.pl… (比如脚本病毒)
- 网页文件 .html;.htm;.asp… (比如网页挂马)
- …
(3) 检测对象——内存空间 恶意代码在传染或执行时,必然要占有一定的内存空间,部分功能代码驻留在内存中。
- 部分恶意代码仅存在于内存之中 – 无文件存在,或已自行删除 – 或被外部动态按需注入
- 部分恶意代码仅在内存中被还原
比如,部分恶意代码仅存在内存之中,它们是没有文件的,通过文件检测无法找到它们。另外,还有部分恶意代码最开始是有文件的,执行完毕之后会将自身进行删除,此时再去检测文件是检测不到的。也有一些木马程序,最开始执行时只是一个简单的主体程序,它所有的功能代码可能是通过Shellcode的方式进行远程注入,在文件中是找不到这些恶意代码的,此时就驻留在内存中,所以对内存中的代码进行检测是必要的。
同时,还有一些木马程序会启动IE进程,它启动之后会将IE进程掏空,然后将自己的恶意代码植入其中,这种情况的恶意代码也是驻留在内存之中。除此之外,还有一些恶意代码本身在文件中,它是一种加密或压缩状态,只要到内存之后才会进行还原。参考作者前文:
- WinRAR漏洞复现(CVE-2018-20250)及恶意软件自启动劫持
介绍完检测对象之后,我们分享病毒的检测策略。
(1) 专用检查技术:针对某个或某些特定已知恶意代码,比如反病毒软件所采用的文件特征值检测技术,发现病毒之后,对病毒的特征进行提取构建相关特征库。
- 反病毒软件必须随着新病毒的不断出现而频繁更新病毒库版本。
- 如文件特征值检测技术。
(2) 通用检测技术:针对已知和未知恶意代码,根据恶意软件广义的特征进行检测,但这里面涉及了很多人为经验,如启发式扫描技术,对目标程序的特性和行为进行判断,给出判断结果或用户提示。
- 广义特性描述或一般行为特征作为判定依据。
- 如启发式扫描技术、主动防御技术等。
二.特征值检测技术
1.特征值检测技术概念
病毒特征值:是反病毒软件鉴别特定计算机病毒的一种标志。通常是从病毒样本中提取的一段或多段字符串或二进制串。
如下图所示,特征值检测技术和古代通J令类似,通J令中包含了这个人的特征,对于特征值检测技术也是一样,它首先需要对目标恶意程序进行特征及标志提取。另外,通J令可以通过相关机构或群众发现,而特征值检测技术依靠反病毒引擎来进行比对。
特征值检测技术的具体思路:
- 获取样本 -> 提取样本特征 -> 更新病毒库 - > 查杀病毒
早期样本比较少,可以通过人工提取特征,但随着样本增多之后,就不再通过单纯的人工方式提取,会将样本特征更新至病毒库,再下发到客户端的病毒检测设备中。最早的时候,整体病毒数量不多,比如KV300,当时就是拿着软盘每个月去到指定的地方进行病毒库的更新,后来逐渐通过网络的方式更新反病毒软件,每天都可以更新很多次,反病毒软件再根据反病毒引擎进行病毒的查杀。
2.特征值的提取选择及方法
特征值的提取选择具体如下:
(1) 特定字串:从计算机病毒体内提取、为病毒所特有的特征串。如特定提示信息,特定签名信息等。 例如大麻病毒的提示为:“Your PC is now stoned”等。
(2) 感染标记:病毒为避免重复感染而使用的感染标记。 如黑色星期五的“suMs DOS”。
(3) 从病毒代码的特定地方开始取出连续的、不大于64且不含空格(ASCII值为32)的字节串。
同时,所提取的特征需要避免和正常的软件雷同,否则会形成误报。具体的提取方法如下:
- 人工提取 反病毒工程师对病毒样本进行分析后,人工确定病毒特征。
- 自动提取 – 通过软件系统自动提取特定范围内特定长度具有一定特征的数据。 – 处理不利则可能被别有用心者利用,形成误杀。比如杀毒软件会对Windows核心文件进行查杀,但样本提取时可能会有相应的失误,通过制造对抗样本使得正常程序或文件被误杀。
特征值的提取还有一些自动提取的方法,下面三篇文章是之前作者分享的。参考作者前文:
- 论文之基于机器学习算法的主机恶意代码
- 基于机器学习的恶意请求识别及安全领域中的机器学习
- 基于机器学习的恶意代码识别及人工智能中的恶意代码检测
3.优缺点
关于特征值检测技术,它有优缺点。具体如下:
- 优点: 检测速度快、误报率低等优点,为广大反病毒厂商所采用,技术也比较成熟。因为是对已有病毒进行分析后拿到的特征,所以误报率低,也是各大安全厂商采用的技术。
- 缺点: 只能检测已知恶意代码。容易被免杀绕过。
最后,针对特征值检测技术,恶意软件如何对抗?
- 手工修改自身特征 首先,利用反病毒软件定位(如CCL软件进行定位) 然后,进行针对性修改
- 自动修改自身特征 加密、多态、变形等
三.校验和检测技术
1.什么是校验和检测技术
校验和检测技术是在文件使用/系统启动过程中,检查检测对象的实际校验和与预期是否一致,因而可以发现文件/引导区是否感染。
首先,我们需要弄清楚什么是预期?
- 预期:正常文件内容和正常引导扇区数据。
它会通过校验和算法对原始的数据进行预算,从而得到校验值,如果对象被修改,其校验值会变化,从而判断其是否被感染。这里提到一个可信计算,它其实也使用了校验和技术。
- 静态可信:可信计算机对主引导扇区和一些系统关键程序进行了校验,从而保障系统启动之后的初始安全。
运用校验和检测技术查病毒主要采用以下三种方式:
- 系统自动监测 该技术在反病毒软件中用得比较多。它会将校验和检查程序常驻内存,每当应用程序开始运行时,自动核验当前与预先保存的校验和是否一致。如果不一致说明这段数据被篡改,会有相应的提示。
- 专用检测工具 对被查的对象文件计算其正常状态的校验和,将校验和值写入被查文件中或检测工具中,而后进行比较。如MD5Checker。
- 自我检测 有些应用程序会进行自我校验,比如QQ,如果修改其数据会有相应提示QQ被篡改。在应用程序中,放入校验和检测技术自我检查功能,将文件正常状态的校验和写入文件自身,应用程序启动比较现行校验和与原校验和值,实现应用程序的自检测。
2.校验和检测对象
校验和检测对象通常包括文件头部、文件属性、文件内容和系统数据等。
(1) 文件头部 目前大部分的寄生病毒,它要去感染其它程序,它通常都要改变目标程序头部的数据,比如PE病毒感染。一般比较整个文件效率较低,有的检测仅比较文件的头部。现有大多数寄生病毒需要改变宿主程序的头部。
(2) 文件基本属性 文件的基本属性在整个生命周期中相对固定,如果发生改变可能发生了病毒攻击。文件基本属性通常包括文件长度、文件创建日期和时间、文件属性(一般属性、只读属性、隐含属性、系统属性)。下图展示了Tripwire软件能够对UNIX和Windows中的文件属性进行监控,如果文件中任何一个属性发生了异常变化,则说明该文件极有可能被病毒攻击或感染、损坏了。
(3) 文件内容校验和 对文件内容(可含文件的属性)的全部字节进行某种函数运算,这种运算所产生的适当字节长度的结果就叫做校验和。这种校验和在很大程度上代表了原文件的特征,一般文件的任何变化都可以反映在校验和中。比如对于散列函数来说,原始特征哪怕改变一位,它的散列值都会发生很大变化。
- 可以采用一些散列函数,如MD5…
- CRC校验…
(4) 系统数据 有些病毒可能修改、且相对固定的重要系统数据。
- 如硬盘主引导扇区、分区引导扇区
- 内存中断向量表、SSDT、设备驱动程序处理例程等
3.优缺点
校验和检测技术优缺点如下:
优点:
- 方法简单,能发现未知病毒,因为只要病毒对目标修改,它就能发现目标文件的细微变化也能发现。
缺点:
- 必须预先记录正常文件的校验和[预期]
- 误报率高
- 不能识别病毒名称
- 效率低
四.启发式扫描技术
主要依赖病毒检测的经验和知识,如专业反病毒技术人员使用反汇编、调试或沙箱工具稍加分析,就可能判定出某程序是否染毒,主要通过的就是反病毒技术人员的经验。启发式代码扫描技术(Heuristic Scanning)实际上就是恶意代码检测经验和知识的软件实现。
经验主要是判断可疑的程序代码指令序列,常见的如下:
- 格式化磁盘类操作:它究竟是什么样的代码
- 搜索和定位各种可执行程序的操作
- 实现驻留内存的操作
- 发现非常用的或未公开的系统功能调用的操作、子程序调用中只执行入栈操作、远距离(超过文件长度的三分之二)跳转指令等
- 敏感系统行为:如调用驱动进行远程注入
- 敏感API函数(序列)调用功能:虽然正常程序也会出现,但当它们集中出现时可能是启发式扫描判断的依据
启发式扫描步骤如下:
- 定义通用可疑特征(指令序列或行为);
- 对上述功能操作将被按照安全和可疑的等级进行排序,授以不同的权值(甚至用机器学习);
- 鉴别特征,如果程序的权值总和超过一个事先定义的阈值,则认为 “发现病毒”。
下图展示反病毒软件的启发式分析过程,包括轻度扫描、中毒扫描、深度扫描。
为了方便用户或研究人员直观地检测被测试程序中可疑功能调用的存在情况,病毒检测程序可以显示地为不同的可疑功能调用设置标志。例如,早期TbScan这款病毒检测软件就为每一项可以病毒功能调用定义一个标志,如F、R、A等,从而直观地判断被检测程序是否感染病毒。
下图展示了TBScan不同病毒触发的标志。
启发式扫描优缺点如下: 优点:
- 能够发现未知病毒
缺点:
- 误报率高
解决方案:
- 启发式扫描技术+传统扫描技术
- 可提高病毒检测软件的检测率,同时有效降低了总的误报率
下面展示了相应的安全软件进行“启发式扫描 特征值扫描”的检测率。比如,卡巴斯基能达到99.57%,
2015年AVC测试结果,即启发式/行为检测能力的结果如下图所示。
2011年/2012年测试结果如下,针对未知病毒静态检测能力,其中奇虎对未知病毒检测率最高,然后是GDATA。
当时的结果报告中也给出了另一个结果——误报率,详见下图。如果你期待获得一个更严格的安全,误报率高一点也是可以承受的,希望不要有漏掉的,不同的安全软件存在不同的策略,当然同时提高检测率,降低误报率也非常考验安全公司的实力。
针对启发式扫描技术,病毒如何博弈?病毒又能采取什么措施呢?
- 直接对抗 – Disable启发式机制 – Disable反病毒软件
- 绕行 – 哪些是启发式检测的特征项? – 是否有其他替代实现方式
五.虚拟机检测技术
为什么需要虚拟机检测技术?主要是因为:
- 加密、多态、变形病毒的出现:导致传统的特征值检测更加困难。
- 加壳技术:对病毒体进行包裹,使得病毒代码没有直接反应在二进制中。
其中,加密病毒是指真实代码被压缩或加密,但最终需要在内存中还原。多态性病毒是指对自身二进制文件进行加密,在运行时再自解密,它在每次感染时都会改变其密钥和解密代码,以对抗反病毒软件,这类病毒的代表有 “幽灵病毒”。普通特征值检测技术对其基本失效,因为其对代码实施加密变换,而且每次感染使用不同密钥和解密代码。
在电脑病毒中有一个特殊群体,它们生活在比Windows系统更早启动的“异度空间”,拥有对整个系统和软件的生杀大权;同时它们又极隐蔽,检测难度远远高于普通病毒,我们将其统称为“幽灵病毒”。 一台电脑的启动顺序:BIOS(基本输入输出系统)-> MBR(磁盘主引导记录)-> VBR(卷引导记录)-> 系统加载程序(C盘根目录)-> Windows系统。BIOS、MBR和VBR就是幽灵病毒活跃的空间。360全球率先发现了BMW、谍影等BIOS病毒和VBR病毒,以及魅影、鬼影2、暗云Ⅱ、暗云Ⅲ等MBR病毒,并第一时间进行防御查杀。
早在2016年12月份,360安全卫士查杀团队首次发现了暗云的新一个变种,这就是今年兴起的暗云Ⅲ木马。此版本跟以往版本最大的不同之处,在于暗云Ⅲ加入了对360急救箱查杀对抗,占位了急救箱的驱动所有设备名。下图展示了占坑急救箱设备名,正常为 Device设备,而暗云为Event设备。
并且暗云Ⅲ能通过挂钩磁盘StartIO保护自身,去掉了上一个版本Object钩子,保留了DPC保护,在2016年12月,360安全卫士就已经专门为查杀此顽固木马下发了新驱动,一旦发现自身设备名被占用,即判定为暗云Ⅲ设备并开启查杀修复。
虚拟机检测技术如下:
- 在反病毒系统中设置的一种程序机制,它能在内存中模拟一个小的封闭程序执行环境,所有待查文件都以解释方式在其中被虚拟执行。通常虚拟执行一小部分代码即可。
最后介绍虚拟机检测技术的优点,具有如下:
- 有效处理加密类病毒。
- 虚拟机技术 特征值扫描,准确率更高。
- 虚拟机技术 启发式扫描,有利于检测未知变形病毒。
六.主动防御技术
1.主动防御技术概念
主动防御检测技术有时也被称为行为监控等技术。
- 动态监视所运行程序调用各种应用编程接口(API)的动作,自动分析程序动作之间的逻辑关系,自动判定程序行为的合法性。
- 监控应用程序的敏感行为,并向用户发出提示, 供用户选择。
东方微点公司创始人刘老师最早在国内提出了主动防御技术。下图展示了主动防御的过程,但该技术对于用户本身而言比较困难,因为用户缺乏专业知识。所以反病毒公司会根据实际情况制定自身的反病毒软件策略,结合用户需求可能会放松策略。
常见可疑行为包括:
- 对可执行文件进行写操作
- 写磁盘引导区
- 病毒程序与宿主程序的切换
- 写注册表启动键值
- 远程线程插入
- 安装、加载驱动
- 键盘钩子
- 自我隐藏
- 下载并执行等
- …
下图是卡巴斯基的主动防御过程。
2.主动防御实现机理
恶意软件包括几个主要的功能,
- 敏感信息获取 屏幕、文件、录像、键盘击键、账号和密码、游戏装备等
- 远控 流量转发和流量代理等
这些功能又细分为文件管理、进程管理、服务管理、注册表管理、屏幕监控、屏幕截取、语音视频截获、键盘记录、窗口管理、远程Shell等。
那么这些功能怎么实现的呢?主要是通过关键API实现。
- 键盘按键记录的API SetWindowsHookExA
- 文件遍历的API FindFirstFileA FindNextFileA
- 进程遍历的API CreateToolhelp32Snapshot Process32First Process32Next
- 文件操作的API fopen、fread、fwrite、fclose
- 截屏的API GetDC、SelectObject、GetDIBits
- 录像的API capCreateCaptureWindow capGetDriverDescription capGetVideoFormat
下图展示了录音API从设备准备、缓冲区准备到开始录音的过程。
对这些关键API或API序列监控,希望获取其逻辑关系,自动判断其合法性,判断行为的可行性。常见检测思路特征包括:
- 静态文件特征
- 网络流量特征
- 系统行为特征
- 功能行为特征
- 攻击意图
其中,功能行为特征主要是动态监视所运行程序调用各种应用编程接口(API)的动作,自动分析程序动作之间的逻辑关系,自动判定程序行为的合法性。
这里涉及到一个行为监控技术,它用于捕获拦截关键的API信息,具体包括:
- API调用的实参
- API调用的返回值
- API调用的上下文(栈)
具体的技术实现包括:
- Hooking:修改函数指针,如IAT表
- InlineHooking:修改函数代码,如函数头的几个字节
(1) Hooking Hooking包括IAT钩子、IDT钩子、SSDT钩子、过滤驱动程序、驱动程序钩子等,通过下图所示的工具可以查看SSDT表是否被挂了钩子,它会比较当前函数和原始函数的地址。
IAT Hooking显示如下图所示,其中MyMessageBox的地址为00002598位置,如果修改其Data后,它就会跳转到自身设置的位置。
(2) InlineHooking InlineHooking技术更为复杂一些。如下图所示,左边是部分描述了InlineHooking前的MessageBox,右边是MyMessageBox在内存中的定义体。
首先将MessageBox头部的5个字节Move到准备好的位置,其次把MessageBox的头部5个字节给一个jmp,跳转到自定义的MessageBox上(00401280)。
第三步,在定义好的MyMessageBox区域内给个jmp,跳转到原来的函数位置,即7566FD23处。
最后在MyMessageBox函数体中调用原始的MessageBoxA函数地址,即004012D7地址。
行为监控可以从用户态到核心态文件处理,再到核心态磁盘处理,有一系列的函数进行Hooking和InlineHooking进行整体的行为监控
3.优缺点
主动防御技术的优缺点如下:
- 优点:可发现未知恶意软件、可准确地发现未知恶意软件的恶意行为。
- 缺点:可能误报警、不能识别恶意软件名称,以及在实现时有一定难度。
同时给出两个小的思考问题:
- 对关键API进行监控,正常软件和恶意软件都会调用这些API。当捕获到一个或一组关键API调用时,如何判断这些调用实例的可信性呢?
- 攻击者了解Hooking技术,会有什么对抗防范呢?反之防御者又有哪些反制技术?
七.总结
写到这里,这篇文章就介绍完毕,希望对您有所帮助,下一篇文章作者将继续分析机器学习与恶意代码结合的知识,再下一篇会介绍恶意代码检测技术对应的安全软件评测,包括:
- 如此多的反病毒软件,哪款更适合你?
- 各个反病毒软件采用了哪些关键技术?
- 各自有什么特色?
学安全两年,认识了很多安全大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。作者作为网络安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,感谢老师、师兄师弟、师姐师妹们的教导,深知自己很菜,得努力前行。
最感恩的永远是家人的支持,知道为啥而来,知道要做啥,知道努力才能回去。夜已深,虽然笨,但还得奋斗。
欢迎大家讨论,是否觉得这系列文章帮助到您!任何建议都可以评论告知读者,共勉
参考资料: [1] https://mooc.study.163.com/learn/1000003014?share=2&shareId=1000001005 [2] 《软件安全之恶意代码机理与防护》WHU 强推 [3] 作者学习和实践经验