基于API调用的恶意软件分析技术

基于API的分析技术

根据上一个季度的统计数据发现,使用加壳器、加密器和保护器(这些都是用于对恶意软件进行混淆处理,以防止被系统或安全软件识别出来的方法)的恶意软件的数量正在日益增加。这些加壳器极大的提高了进行静态分析的难度,甚至有些时候根本就无法对其进行静态分析。随着越来多的恶意软越件作者开始采用这些保护性措施,安全分析人员对于恶意软件分析替代技术的兴趣也越来越浓。

其中一种可行的替代方法就是,对代码中通知系统执行某些操作的API调用或命令进行安全检测。这种方法的好处是,不必对经过加壳处理的软件进行逆向分析,相反,我们可以通过对API调用进行动态分析,从而弄清楚某个文件的具体行为。通过分析相应的API调用,我们可以确定文件是否是恶意的,因为对于某些类型的恶意软件来说,它们的API调用是非常有特点的。例如,典型的下载API是URLDownloadToFile。而GetWindowDC这个API通常用于屏幕抓取,它经常出现在间谍软件和键盘记录器中。

下面,我们通过一个具体的例子来说明其工作原理。

木马样本

我们的示例是一个著名木马程序,名称为1.exe,其SHA256为0213b36ee85a301b88c26e180f821104d5371410ab4390803eaa39fac1553c4c。

基于API调用的恶意软件分析技术

由于该文件(使用VMProtect)进行了加壳处理,所以面对这种情况,反汇编器通常也是狗咬刺猬——无处下口。由于本人并非逆向分析的专家,所以我另辟蹊径,通过查看该文件在沙箱执行期间使用的API调用来搞清楚该文件的所作所为。

这是我们通过沙箱(Deepviz)获得的调用列表:

基于API调用的恶意软件分析技术

首先,我们来看看这些函数分别是做什么的。以下内容都是引自Microsoft的相关文档:

GetModuleHandle函数

检索指定模块的模块句柄。被检索的模块必须是由调用进程加载的。GetModuleHandleA(ANSI)

GetProcAddress函数

检索从指定的动态链接库(DLL)导出的函数或变量的地址。

_wtoi

将字符串转换为整数。

CreateStreamOnHGlobal函数

该函数可以用来创建一个使用HGLOBAL内存句柄存储流内容的流对象。该对象是IStream接口的OLE实现。

StrStr函数

查找指定子字符串第一次出现在字符串中的位置。该函数区分大小写。StrStrA(ANSI)

wsprintf函数

将格式化数据写入指定的缓冲区。所有的参数,都会根据格式字符串中的相应的格式规范进行转换,并复制到输出缓冲区。wsprintfA(ANSI)

WinHttpOpen函数

对于应用程序来说,这个函数可以初始化WinHTTP函数并返回WinHTTP会话句柄。

GetModuleFileName函数

检索包含指定模块的文件的标准路径。该模块必须是由当前进程加载的。GetModuleFileNameW(Unicode)

LoadLibrary函数

将指定的模块加载到调用进程的地址空间中。这个指定的模块可能会导致其他模块被加载。LoadLibraryA(ANSI)

LocalAlloc函数

从堆中分配指定的字节数。

LocalFree函数

释放指定的本地内存对象并使其句柄无效。

GetModuleFileName函数

检索包含指定模块的文件的标准路径。该模块必须是由当前进程加载的。GetModuleFileNameA(ANSI)

ExitProcess函数

结束调用进程及其所有线程。

关键恶意指标

并不是上面显示的所有函数都能表明可执行文件的性质。但是API WinHttpOpen却能告诉我们,我们可以向特定的方面考虑。

对于这个函数,我们使用Kahu Security的URL Revealer来检查流量的目的地,并发现两个经常出现的URL。


  1. GET http://twitter.com/pidoras6 
  2. POST http://www.virustotal.com/vtapi/v2/file/scan 

这个POST是当您要提交扫描文件时,VirusTotal API接受的内容。

这个指向被废弃的Twitter句柄的链接让人非常迷惑,我决定在Twitter中使用高级搜索,确定这是个早已被删除的Tweet的链接。

基于API调用的恶意软件分析技术

这个Tweet的内容是一个base64编码的链接:https://w0rm.in/join/join.php。不幸的是,该网站已经无法解析,但它曾经是一个地下黑市,同时提供网站exploit与黑客服务,上面提到的Twitter个人资料在当时还未被删。

看来上面这条路是走不通了。因此,我们尝试了另一种方法,弄清楚它想要在VirusTotal上扫描的东西,并使用Wireshark来检测数据包。

基于API调用的恶意软件分析技术

在数据包中,您可以看到用于在VirusTotal站点扫描文件的API key和文件名。根据这个API调用和数据包进行重建后,我们发现恶意软件将其自身的副本提交给VirusTotal,这是Vflooder系列木马的典型行为。Vflooder是一种特殊的Flooder木马程序。Flooder木马旨在向特定目标发送大量信息,以破坏目标的正常运行。但是,我怀疑它甚至用于对VirusTotal发动攻击。或者与Twitter上的那个链接有关。

Vflooder木马只是分析API调用的一个简单的小例子。但是事情并非总是这么轻松:我们甚至看到某些恶意软件已经开始故意增加冗余/无用的API调用了,目的就是为了对执行流程进行混淆处理。不过,分析API调用确实是一种检测恶意软件隐藏自身行为的有效方法。但是别忘了,攻击者对这些也是心知肚明的。


原文发布时间为:2017-11-03

本文作者:shan66

本文来自云栖社区合作伙伴51CTO,了解相关信息可以关注51CTO。

上一篇:存储过程中使用事务与try catch


下一篇:Hibernate(七):*.hbm.xml配置文件中Set三个属性