这篇文章不是我的原创文章,是我在黑客内参征求了作者的同意之后转载的一篇文章。
在今年的上一个季度,我们发现有越来越多的恶意软件开始使用各种加密、封装和加壳等保护技术来对恶意代码进行混淆处理,以防止系统或程序对其进行识别。除此之外,这些技术甚至还会让研究人员对其的静态分析变得更加困难。虽然越来越多的恶意软件开发人员开始使用这种保护性的加壳技术,但这也直接导致了另一种恶意软件分析方法的诞生。
其中的一种分析方法,就是通过分析恶意代码中负责告诉系统如何执行特定操作的API调用以及控制命令。在这种方法中,我们不需要对已加壳的文件进行逆向分析,因为我们只需要对恶意代码所执行的API调用来进行动态分析,就可以知道某个特定文件具体的功能了。通过这样的方法(分析API调用),我们可以确定一个文件是否具有恶意性,而有些API调用只有某些特殊类型的恶意软件才会去使用。比如说,常用的恶意Payload下载API是URLDownloadToFile,而GetWindowDC这个API一般用于间谍软件或键盘记录器等恶意工具(用于屏幕截取)。
接下来,我们会对一个恶意软件样本进行分析,并给大家介绍这项技术的实现方法。
木马样本
黑客内参所要分析的恶意软件样本是一个名叫1.exe的着名木马,它的SHA256如下:
0213b36ee85a301b88c26e180f821104d5371410ab4390803eaa39fac1553c4c
如何通过API调用来分析恶意软件
这个文件是加了壳的(VMProtect),所以我们就很难使用反编译工具来对其进行分析了。由于我个人并不擅长逆向工程分析,因此我打算通过分析该文件在沙盒环境的执行过程中的API调用来了解它的行为。
下面这张图片中,显示的是我们通过观察它在沙盒环境中的运行情况所得到的API调用列表:
如何通过API调用来分析恶意软件
首先,我们来看一看这些函数到底有什么作用。其中有部分函数可以在微软的网站中找到相关内容:
GetModuleHandle函数
为特定模块获取模块处理器,该模块必须在调用进程中被加载。GetModuleHandleA (ANSI)
GetProcAddress函数
获取一个输出函数的地址,或从指定的动态链接库(DLL)获取变量。
_wtoi
将一个字符串转换成整型
CreateStreamOnHGlobal函数
这个函数将创建一个流对象,该对象可以使用一个HGLOBAL内存处理器来存储流内容。
StrStr函数
查找字符串中出现的第一个子字符串,匹配是大小写敏感的。StrStrA(ANSI)
wsprintf函数
向特定的缓冲区中写入格式化数据,可根据相应的格式化字符串标准向输出缓冲区中写入任意参数。wsprintfA (ANSI)
WinHttpOpen函数
该函数可以初始化WinHTTP函数并返回一个WinHTTP-session处理器。
GetModuleFileName函数
获取包含指定模块的文件的完整路径,该模块必须在当前的调用进程中被加载。GetModuleFileNameW (Unicode)
LoadLibrary函数
向调用进程的地址空间加载特定模块,该模块可能还会加载其他的模块。LoadLibraryA (ANSI)
LocalAlloc函数
向堆内存中分配指定大小的字节。
LocalFree函数
释放指定的本地内存对象,并初始化该对象的处理器。
GetModuleFileName函数
获取包含指定模块的文件的完整路径,该模块必须在当前调用进程中被加载。GetModuleFileNameA (ANSI)
ExitProcess函数
终止调用进程以及所有相关的线程。
关键的恶意识别指标
需要注意的是,上面给出的所有函数并非都能够之别标明某个可执行程序的真实作用。但是针对WinHttpOpen的调用可以告诉我们这个应用是有特殊目的的。
那我们就可以从这个函数下手,我们使用URL Revealer(Kahu Security)来检测流量的目的地,并发现了两个该恶意应用会不断尝试连接的URL地址。
注:当我们向VirusTotalAPI提交一个文件来进行扫描时,最好提交这种形式的POST
上面这个链接指向的是一个已失效的Twitter地址,当我使用Twitter的高级搜索功能进行查找时,黑客内参发现这条推文早就已经被删除了。
如何通过API调用来分析恶意软件
但不幸的是,这个网站已经无法解析了,但这个网站原本是一个专门提供网站入侵服务的地下站点。不过需要注意的是,这个Twitter账号目前仍然是活跃的。
由此看来,我们就没办法弄清楚这个恶意软件想要利用GET请求来做什么了。但是我们可以用其他的方法搞清楚它想用VirusTotal来扫描什么东西?下面是我们使用WireShark所捕捉到的数据包:
如何通过API调用来分析恶意软件
在这个数据包中,你可以看到恶意软件用来在VirusTotal网站上扫描文件的API密钥以及文件名。所以,通过对API调用和数据包进行重构,我们发现这款恶意软件会向VirusTotal提交自己的拷贝版本,即恶意软件副本,而这正好是Vflooder木马家族的典型行为。Vflooder是一种特殊类型的Flooder木马,而Flooder木马可以向目标发送大量的信息来中断目标的正常操作。但是我认为VirusTotal可能无法检测到这种恶意软件威胁。
总结
实际上,我们本文所分析的Vflooder木马样本其实还是费查更简单的。但是通过分析API调用来了解恶意软件的行为,其实并不是一件容易的事情,因为我们发现有很多的恶意软件会添加无效/冗余的API调用来增加我们的分析难度。但无论怎样,分析API调用也是一种检测恶意软件的有效方法,因为攻击者想要做的事情,肯定要在代码中有所体现。
原文来自:[url=]黑客论坛[/url](/)