基于API的分析技术
根据上一个季度的统计数据发现,使用加壳器、加密器和保护器(这些都是用于对恶意软件进行混淆处理,以防止被系统或安全软件识别出来的方法)的恶意软件的数量正在日益增加。这些加壳器极大的提高了进行静态分析的难度,甚至有些时候根本就无法对其进行静态分析。随着越来多的恶意软越件作者开始采用这些保护性措施,安全分析人员对于恶意软件分析替代技术的兴趣也越来越浓。
其中一种可行的替代方法就是,对代码中通知系统执行某些操作的API调用或命令进行安全检测。这种方法的好处是,不必对经过加壳处理的软件进行逆向分析,相反,我们可以通过对API调用进行动态分析,从而弄清楚某个文件的具体行为。通过分析相应的API调用,我们可以确定文件是否是恶意的,因为对于某些类型的恶意软件来说,它们的API调用是非常有特点的。例如,典型的下载API是URLDownloadToFile。而GetWindowDC这个API通常用于屏幕抓取,它经常出现在间谍软件和键盘记录器中。
下面,我们通过一个具体的例子来说明其工作原理。
木马样本
我们的示例是一个著名木马程序,名称为1.exe,其SHA256为0213b36ee85a301b88c26e180f821104d5371410ab4390803eaa39fac1553c4c。
由于该文件(使用VMProtect)进行了加壳处理,所以面对这种情况,反汇编器通常也是狗咬刺猬——无处下口。由于本人并非逆向分析的专家,所以我另辟蹊径,通过查看该文件在沙箱执行期间使用的API调用来搞清楚该文件的所作所为。
这是我们通过沙箱(Deepviz)获得的调用列表:
首先,我们来看看这些函数分别是做什么的。以下内容都是引自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。
- GET http://twitter.com/pidoras6
- POST http://www.virustotal.com/vtapi/v2/file/scan
这个POST是当您要提交扫描文件时,VirusTotal API接受的内容。
这个指向被废弃的Twitter句柄的链接让人非常迷惑,我决定在Twitter中使用高级搜索,确定这是个早已被删除的Tweet的链接。
这个Tweet的内容是一个base64编码的链接:https://w0rm.in/join/join.php。不幸的是,该网站已经无法解析,但它曾经是一个地下黑市,同时提供网站exploit与黑客服务,上面提到的Twitter个人资料在当时还未被删。
看来上面这条路是走不通了。因此,我们尝试了另一种方法,弄清楚它想要在VirusTotal上扫描的东西,并使用Wireshark来检测数据包。
在数据包中,您可以看到用于在VirusTotal站点扫描文件的API key和文件名。根据这个API调用和数据包进行重建后,我们发现恶意软件将其自身的副本提交给VirusTotal,这是Vflooder系列木马的典型行为。Vflooder是一种特殊的Flooder木马程序。Flooder木马旨在向特定目标发送大量信息,以破坏目标的正常运行。但是,我怀疑它甚至用于对VirusTotal发动攻击。或者与Twitter上的那个链接有关。
Vflooder木马只是分析API调用的一个简单的小例子。但是事情并非总是这么轻松:我们甚至看到某些恶意软件已经开始故意增加冗余/无用的API调用了,目的就是为了对执行流程进行混淆处理。不过,分析API调用确实是一种检测恶意软件隐藏自身行为的有效方法。但是别忘了,攻击者对这些也是心知肚明的。