| 导读 | 在今年的上一个季度,我们发现有越来越多的恶意软件开始使用各种加密、封装和加壳等保护技术来对恶意代码进行混淆处理,以防止系统或程序对其进行识别。除此之外,这些技术甚至还会让研究人员对其的静态分析变得更加困难。虽然越来越多的恶意软件开发人员开始使用这种保护性的加壳技术,但这也直接导致了另一种恶意软件分析方法的诞生。 |

其中的一种分析方法,就是通过分析恶意代码中负责告诉系统如何执行特定操作的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地址。
你们真牛什么名字都取