目前普遍增长的趋势是使用机器学习机制自动检测恶意软件,给系统提供巨大的数据集,如所有的机器学习程序一样,这种机制可以更快更准确的吸收更多的恶意软件样本。这些机制可以提供大量的人类恶意软件分析师无法处理的级别的样本。Malware Detection Using Machine Learning[2]由BitDefender Romania Labs的 Gavriluţ Dragoş发表的这篇论文广泛的阐述了机器学习在恶意软件检测中的使用的内部原理。根据Konrad Rieck的论文 Automatic Analysis of Malware Behavior using Machine Learning[3],只要有足够的数据和时间,假阳性的结果将趋近于0,并且恶意软件的检测将在新的恶意软件样本上产生显著效果。
反射式DLL注入[4]是一个非常好的由 Stephen Fewer 开发的库注入技术,该方法是开发这个名为琥珀的壳的主要启发点。这种技术允许在内存执行中用反射编程的方法编写特定的DLL。由于采用了反射编程方法,这种技术允许多阶段payload的部署。除了这种技术的诸多优点之外几乎没有限制。第一个限制是所需的文件格式,该技术期望将恶意软件作为DLL文件进行开发或重新编译,不幸的是在大多数情况下,将已编译的EXE文件转换为DLL是不可能的,或者需要对二进制文件进行大量工作。第二个限制是需要重定位数据。反射型DLL注入技术需要重定位数据来调整内存中DLL的基址。同时,这种方法已经存在了一段时间了,这意味着最新的安全产品可以很容易的检测到反射型DLL注入的使用。我们的新工具,琥珀将为这些限制提供解决方案。
Process Hollowing[5]是另一种广为人知的内存执行方法,使用公开的WindowsAPI创建新的进程然后将PE文件映射进该进程。这种旨在降低恶意软件检测率的加密器和壳中很受欢迎。但是这个方法也有几个缺点。由于最新的Windows操作系统中的地址空间布局随机化(ASLR)安全措施,创建新进程时内存区域是随机的,因为process hollowing同样也需要实现在最新的Windows操作系统上的镜像基址重定位。如上所述,基址重定位需要PE文件内的重定位数据。另一个缺点是由于特定文件的映射和进程创建API函数的使用有特定的顺序,这种方法很容易被安全产品识别。
为了在运行时调用这些API,琥珀使用了Stephen Fewer的反射式DLL注入[4]方法所使用的公开的EAT解析技术。该技术简单在内存中通过PEB来定位InMemoryOrderModulesList结构。定位该结构后,可以读取所有加载的DLL导出表,读取由InMemoryOrderModuleList指向的每个_LDR_DATA_TABLE_ENTRY结构。在访问到DLL的导出表之后,将先前计算出的每个导出函数名的ROR(右移)13散列值进行比较,直到匹配。琥珀的加壳方法还提供了集中替代的WindowsAPI使用方法,其中之一是使用固定的API地址,如果使用者熟知承载琥珀的远程进程的相关信息的话。使用固定API地址将直接绕过最新的操作系统级漏洞利用,检查导出表地址删除API地址查找代码将减少总体的payload大小。另一种替代技术可用于定位所需功能的地址,例如 Josh Pitts 在 “Teaching Old Shellcode New Tricks”[7]中展示的技巧。当前版本的琥珀加壳器仅支持固定API地址和EAT解析技术,但IAT解析将在下一个版本中添加。
[1] Ramilli, Marco, and Matt Bishop. “Multi-stage delivery of malware.” Malicious and Unwanted Software (MALWARE), 2010 5th International Conference on. IEEE, 2010.
[2] Gavriluţ, Dragoş, et al. “Malware detection using machine learning.” Computer Science and Information Technology, 2009. IMCSIT’09. International Multiconference on. IEEE, 2009.
[3] Rieck, Konrad, et al. “Automatic analysis of malware behavior using machine learning.” Journal of Computer Security 19.4 (2011): 639-668.