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