浅析恶意软件的自防护技术如果恶意软件很快被检测到,那么它窃取数据或达成其它目的的可能性基本为零。当前的 IT 安全市场已经比较成熟,安全技术和产品也更加有效。但是,攻击者也在不断学习和监控安全工具的工作机制;而且并不是所有的用户都部署了最佳的防御体系;一些防恶意软件工具已经过期,并且由于配置错误,沙箱也很容易被检测到。
恶意软件的制作者们在花费大量时间和精力研发更复杂的代码,通过逃避沙箱分析、防病毒软件以及恶意软件的分析,来达到目的。本文将为您介绍恶意软件用于逃避检测的几个常用手段。
恶意软件的自防御
恶意软件用以逃避检测和分析的技术有若干种,我们可以把它们分为以下三大类:
- 防安全工具:用以逃避防病毒软件、防火墙以及其他安全工具的检测。
- 防沙箱:用以检测自动分析以及躲避可以报告恶意软件行为的引擎。
- 防分析员:用以检测或愚弄恶意软件分析员。例如:发现 Process Explorer 或 Wireshark 等监控工具,以及一些进程监控技术或程序,以逃避逆向工程。
一些恶意软件同时使用以上三种技术,比如,使用诸如 RunPE (在内存中运行自己的另一个进程)的技术来逃避防病毒软件、沙箱和分析员。
逃避沙箱
沙箱是一个可用于快速检测和了解恶意软件的有效工具,但是,如果沙箱不够强悍,那么被恶意软件检测到也很轻而易举。恶意软件可以执行以下几种基本检查:
- MAC 地址检测:VMware 或 VirtualBox 等虚拟环境使用已知的 MAC 地址,这一地址通常存储在注册表(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}\0000\NetworkAddress) 中。恶意软件可以通过两种方法来检测:请求 Hive Key 或者使用 GetAdapterInfo API。
- 进程发现:恶意软件可以检测到那些正在运行的和沙箱有关的进程。例如,使用 CreateToolHelp32Snapshot API 可以轻松检测到诸如 VmwareService.exe 等进程,以获取当前运行进程的快照,然后使用 API Process32First 和 Process32Next 列出快照的每个进程。
- 注册表检测:虚拟环境在系统上创建的注册表项可以被恶意软件检测到。以下是一些可以被恶意软件检查到的部分注册表项列表:
- 检查钩子函数:钩子是一个可以更改操作系统或应用程序内部函数的行为的技术。沙箱使用钩子技术来更改一个样本的行为,例如:通过挂钩 DeleteFile 函数,恶意软件可以删除将会被沙箱拦截的文件。这一类函数位于内存的某个特定区域 (Kernel land)。恶意软件可以通过检查某个调用函数的地址来检测钩子。例如,如果返回的地址不是位于内核,那么该函数目前被挂钩了。
恶意软件还可以使用其他技术,例如检查某硬盘驱动器的容量或者使用某特别指示来检测某些特定的注册(Red Pill 或 No Pill 技术)。这些技术是基于这样一个事实:计算机里的注册都是独一无二的,并且必须在虚拟环境中重新定位。
躲避防病毒产品
防病毒产品有三个基本功能:特征码、扫描器和启发式。
- 通过改变样本的哈希可以躲避特征码检测,这个操作很简单,如同在可执行文件里改变一个字节。
- 通过创建大文件来迷惑模拟器,从而逃避扫描器的检测。
- 逃避启发式分析比较复杂,但也可以通过挂钩回调函数来实现。
恶意软件用以逃避防病毒工具的另一个方法是禁用该工具或者添加例外项。多形态代码非常难以检测。
反调试
恶意软件分析员通常会在代码分析期间进行深入挖掘。反调试是恶意软件用于规避调试器逆向工程的技术,通常会用来检测是否存在使用 Windows API 的调试器。
- IsDebuggerPresent:该函数用于检查进程环境块中 IsDebugged 字段的特定标记,如果该进程没有在调试器中运行,将会返回 0;如果附带了调试器则会返回非 0 值。
- FindWindow:该函数可以按照名字或者类别来搜索窗口(如 OllyDbg),它还可以检测诸如 Wireshark 或 Process Explorer 等工具。
- CsrGetProcessld:该函数可以找到系统进程 csrss.exe 的进程 ID。默认情况下,拥有 SeDebugPrivilege 进程的访问口令权限是禁用的;但是,当该进程被 OllyDbg 或 winDbg 等调试器载入时,SeDebugPrivilege 权限是启用的。如果一个进程可以打开 csrss.exe,则说明该进程的 SeDebugPrivilege 访问口令权限是启用的,表明该进程正在被调试。
反汇编
反汇编是恶意软件用以逃避逆向工程分析的技术。有很多方法可以用来阻止汇编:
- API 伪装可以掩盖某特殊函数的调用。例如,结果可能是一个没有 API 函数名称的调用。分析员必须通过逆向分析才能获知哪个函数在使用,而这需要时间。
- 插入垃圾代码:通过在恶意软件中插入垃圾代码来愚弄分析员,使他们不得不花费时间进行逆向分析这些无用的代码。由于垃圾代码从不会执行,因而不会改变样本的行为。
总结
除了上面所介绍的这些,还有很多可以逃避恶意软件分析的方法,比如通过隐藏恶意软件的进程使它不被检测到,或者隐藏恶意软件中的数据或部分代码等。我们在不断加强安全保护的同时,恶意软件也在不断进化以逃避安全检测,这是一个无休止的过程。通过了解恶意软件的逃避技术可以帮助我们更深入地了解它们的工作机制,从而更好地进行防御。