Introduction

之前,我们在 基本静态分析 房间中学习了无需执行恶意软件即可对其进行分析的技术。但是,正如我们所了解的,恶意软件可以使用技术来向恶意软件分析师隐藏其功能。但无论恶意软件如何巧妙地将其功能隐藏在静态分析之外,其主要目的都是执行。当恶意软件执行时,它会留下痕迹,恶意软件分析师可以使用这些痕迹来识别它是否是恶意的。我们将在此房间中使用基本的动态分析技术来分析恶意软件在运行时留下的痕迹。

学习目标:

在此房间中,我们将学习:

  • 沙盒化和使用沙盒进行恶意软件分析。
  • 沙盒的组件以及如何为自己创建沙盒。
  • 使用 ProcMon 监视进程的活动。
  • 使用 API Logger 和 API Monitor 识别恶意软件发出的 API 调用。
  • 使用 ProcExp 识别进程是否被恶意修改。
  • 使用 Regshot 跟踪恶意软件所做的注册表更改。

先决条件:

在开始此房间之前,建议您完成以下房间,以便更好地了解此房间的内容。

Sandboxing

在所有恶意软件分析室中,都强调只能在受控环境中分析恶意软件,最好是在虚拟机中。然而,这对于恶意软件的动态分析变得越来越重要。在实时环境中对恶意软件进行静态分析的主要问题是意外执行,但我们在动态分析场景中有意执行恶意软件。这使得确保在沙盒环境中分析恶意软件变得更加重要。

那么创建沙盒需要什么?

广义上讲,创建沙盒需要以下设置:

  • 隔离的机器,最好是虚拟机,不连接到实时或生产系统,专用于恶意软件分析。
  • 隔离或虚拟机保存其初始清洁状态并在恶意软件分析完成后恢复到该状态的能力。此功能通常称为创建和恢复快照。在分析新恶意软件之前,我们需要恢复到原始清洁状态,以便以前的恶意软件的感染不会污染下一个恶意软件的分析。
  • 监控工具可帮助我们在恶意软件在虚拟机内执行时对其进行分析。这些工具可以是自动化的,就像我们在自动沙箱中看到的那样,也可以是手动的,需要分析师在执行分析时进行交互。我们将在稍后的房间中了解其中一些工具。
  • 文件共享机制,可用于将恶意软件引入虚拟机并将分析数据或报告发送给我们。通常,共享目录或网络驱动器用于此目的。但是,我们必须注意在执行恶意软件时卸载共享目录,因为恶意软件可能会感染所有文件。勒索软件尤其如此,它可能会加密所有共享驱动器或目录。

恶意软件分析简介 房间中,我们了解了一些帮助执行动态分析的自动沙箱。下面,我们将了解一些帮助创建沙箱的工具,这让我们拥有更多的分析控制权。让我们开始吧。

虚拟化:

有许多商业和免费工具可用于虚拟化。其中最著名的包括 Oracle 的 VirtualBox 和 VMware 的 Player 和 Workstation。这三种工具允许我们创建与本地机器隔离的虚拟机。但是,VMWare Player 无法创建快照。对于恶意软件的动态分析,快照创建是一项关键要求,这使得 VMWare Player 不适合恶意软件分析。VMWare Workstation 和 VirtualBox 具有快照创建选项,因此适合恶意软件分析。VirtualBox 是免费的,但 VMWare Workstation 有付费许可证。

除此之外,基于服务器的虚拟化软件(如 XenServer、QEmu、ESXi 等)有助于在专用服务器上进行虚拟化。企业经常使用这种类型的设置来满足虚拟化需求。安全研究组织经常使用类似的技术来创建 VM 场以实现大规模虚拟化。

就本房间的范围而言,我们将跳过创建 VM 并在其中安装操作系统的步骤。请注意,虚拟机的操作系统需要与恶意软件的目标操作系统相同,才能进行动态分析。在大多数情况下,这将是 Windows 操作系统。我们将在本房间介绍与 Windows 操作系统相关的工具。

分析工具:

一旦我们安装了操作系统的虚拟机,我们就需要在虚拟机上安装一些分析工具。自动化恶意软件分析系统有一些内置工具可以分析恶意软件的行为。例如,在 Cuckoo 的沙箱中,cuckoomon 是一种在 Cuckoo 沙箱设置中记录恶意软件活动的工具。在接下来的任务中,我们将了解一些用于执行恶意软件手动动态分析的工具。一旦我们在虚拟机上安装了所需的工具,并且在虚拟机上运行任何恶意软件之前,我们必须拍摄快照。在分析完每个恶意软件后,我们必须将虚拟机恢复到此快照,这将保持虚拟机的干净状态。这将确保我们的分析不会受到同时运行的不同恶意软件样本的污染。

文件共享:

不同的平台为在主机和客户操作系统之间共享文件提供了不同的选项。在最流行的工具(即 Oracle VirtualBox 或 VMWare Workstation)中,以下选项很常见:

  • 共享文件夹。
  • 在主机中创建 iso 并将其安装到 VM。
  • 剪贴板复制和粘贴。

除此之外,还有其他不太常见的选项,例如,在客户机上运行 Web 服务器,可以上传恶意软件样本或将可移动驱动器安装到虚拟机。请注意,共享文件的选项越隔离,对主机操作系统就越安全。除了与 VM 共享恶意软件外,文件共享选项还用于从 VM 中提取分析报告。

一旦我们创建了 VM,设置分析工具、拍摄快照并将恶意软件放入沙箱中后,我们就可以开始分析恶意软件了。在下一个任务中,我们将了解可以帮助我们的工具。

ProcMon

在此任务中,我们将学习如何使用进程监视器 (ProcMon) 来分析恶意软件的活动。ProcMon 是 Sysinternals 套件的一部分,该套件是一套由 Winternals Software 公司创建的实用程序,并于 2006 年被 Microsoft 收购。Sysinternals 包含许多方便的实用程序,可为 Windows 提供高级功能。Sysinternals 实用程序广泛用于安全研究,我们将在此房间以及其他房间中不时介绍其中一些。那么让我们从 ProcMon 开始吧。

ProcMon 的控件一目了然,如果我们将鼠标悬停在其中一个控件上,就会显示简短的说明。屏幕截图中的标签显示了这些控件下方可见数据的一些关键控件。

  • 1.显示“打开”和“保存”选项。这些选项用于打开包含 ProcMon 事件的文件或将事件保存到受支持的文件。

  • 2.显示“清除”选项。此选项将清除 ProcMon 当前显示的所有事件。执行感兴趣的恶意软件样本后,最好清除事件以减少噪音。

  • 3.显示“过滤”选项,这使我们能够进一步控制 ProcMon 窗口中显示的事件。

  • 4.这些是用于关闭或打开注册表、文件系统、网络、进程/线程和分析事件的切换开关。

在这些控件下方,我们可以从左到右看到活动的时间、进程、进程 ID (PID)、事件名称、路径、结果和详细信息。我们可以观察到事件按时间顺序显示。通常,ProcMon 会显示系统中发生的大量事件。为了便于分析,明智的做法是过滤掉我们感兴趣的事件。

过滤事件:

ProcMon 允许从事件窗口本身轻松过滤事件。例如,查看下面的屏幕截图。

如果我们右键单击所选进程的进程列,则会打开一个弹出菜单。我们可以在弹出菜单中看到不同的选项。其中一些选项与过滤有关。例如,如果我们选择选项“包括‘Explorer.EXE’”,ProcMon 将仅显示进程名称为 Explorer.EXE 的事件。如果我们选择选项“排除‘Explorer.EXE’”,它将从结果中排除 Explorer.EXE。同样,我们可以右键单击事件窗口的其他列来过滤其他选项。

如上图所示,当我们右键单击某个事件时,我们可以过滤/排除某个事件。同样,我们可以向结果添加更多过滤器,直到将结果缩小到我们感兴趣的事件。如果我们选择“包括‘Explorer.EXE’”和“包括‘CreateFile’”事件,ProcMon 将仅显示由 Explorer.EXE 触发的 CreateFile 事件。

高级过滤:

ProcMon 还允许我们实施高级过滤器。在此任务中第一张图片中标记为数字 3 的菜单中,我们可以看到过滤选项。当我们单击此选项时,我们会看到以下窗口弹出。

我们可以看到 ProcMon 中已经应用了一些预设过滤器,例如用于过滤掉 Procmon.exe 的过滤器。我们可以看到过滤过程的实现非常简单。我们选择过滤值,例如进程名称、其关系、值和操作。如果勾选了复选框,则应用过滤器。否则,将忽略过滤器。我们可以看到此屏幕截图中未应用前两个过滤器。第三个过滤器指出,如果进程名称是 Procmon.exe,则从报告中排除该事件。因此,我们看不到任何与 Procmon.exe 相关的事件。这里必须注意的是,“包含”过滤器将显示仅与该实体相关的事件。例如,如果我们包含 Explorer.EXE,则只会显示进程名称为 Explorer.EXE 的事件,其余的将被过滤掉。

进程树:

ProcMon 还允许我们以父子关系查看所有现有进程,形成进程树。您可以通过点击菜单中的 图标来完成此操作。此选项有助于识别不同进程的父进程和子进程。如 ProcMon 所示,下面是示例进程树。

虽然进程树在分析恶意软件时是一个很好的信息,但我们稍后在探索 ProcExp 时会详细介绍它。

API logger and API monitor

在开始此任务之前,请重新启动连接到上一个任务的 VM。

Windows 操作系统抽象硬件并提供应用程序可编程接口 (API) 来执行所有任务。例如,有一个用于创建文件的 API、一个用于创建进程的 API、一个用于创建和删除注册表的 API 等等。因此,识别恶意软件行为的一种方法是监视恶意软件调用了哪些 API。API 的名称通常是不言自明的。但是,可以参考 Microsoft 文档 来查找有关 API 的信息。

在此任务中,我们将了解 API 记录器和 API 监视工具,它们可以帮助我们识别恶意软件正在进行的 API 调用。

API 记录器:

API 记录器是一个简单的工具,它提供有关进程调用的 API 的基本信息。我们可以通过导航到路径 ~Desktop\Tools\Utilities\ApiLogger.exe 在连接的 VM 中启动 API 记录器。当我们打开API记录器工具时,我们看到以下界面。

A screenshot showing the interface of API logger.

点击放大

要打开新进程,我们可以单击突出显示的三点菜单。单击后,文件浏览器允许我们选择要监视其 API 调用的可执行文件。选择可执行文件后,我们可以单击“注入和记录”以启动 API 记录过程。我们将在下部窗格中看到 API 调用的日志,如下图所示。在上部窗格中,我们可以看到正在运行的进程及其 PID。

A screenshot showing API Logger while also showing APIs it has logged from a monitored process.

点击放大

我们可以在“msg”字段中看到我们监控的进程的 PID 和调用的 API,以及有关 API 的基本信息。

我们可以单击 API 记录器的“PID”菜单来记录正在运行的进程的 API 调用。它将打开以下窗口。

A screenshot of API logger showing running processes to choose for monitoring using API logger.

点击放大

此窗口显示具有 PID 的进程、运行该进程的用户以及进程的图像路径。进程的其余部分与启动进程的情况相同。

API 监视器:

API 监视器提供有关进程 API 调用的更多高级信息。API 监视器分别针对 32 位和 64 位进程提供 32 位和 64 位版本。我们可以通过导航到路径 ~Desktop\Tools\Utilities\apimonitor-x64.exe~Desktop\Tools\Utilities\apimonitor-x86.exe 来启动 API 监视器。打开 API 监视器时,我们会看到以下窗口。

A screenshot showing different windows in the interface of API Monitor

点击放大

如我们所见,API Monitor 有多个选项卡,如上图所示。

  1. 此选项卡是我们要监控的 API 组的过滤器。例如,我们有一个“图形和游戏”相关 API 组,另一个“互联网”相关 API 组,等等。API Monitor 将仅向我们显示从此菜单中选择的组中的 API。
  2. 此选项卡显示正在监控 API 调用的进程。我们可以单击“监控新进程”选项来开始监控新进程。
  3. 此选项卡显示 API 调用、模块、线程、时间、返回值和任何错误。我们可以在此选项卡中监控进程调用的 API。
  4. 此选项卡显示 API Monitor 可以监控的正在运行的进程。
  5. 此选项卡显示 API 调用的参数,包括 API 调用之前和之后的这些参数的值。
  6. 此选项卡显示所选值的十六进制缓冲区。
  7. 此选项卡显示进程的调用堆栈。
  8. 最后,此选项卡显示输出。

为了更好地理解它,让我们在 API 监视器中打开一个进程。当我们单击选项卡 2 中的“监视新进程”选项时,我们会看到以下选项。

A screenshot showing the menu for starting monitoring of a process using API Monitor

点击放大

在此菜单中,我们可以从路径中选择进程、进程所采用的任何参数、我们想要启动进程的目录以及附加 API 监视器的方法。如果我们没有进程的任何参数并且想要从进程所在的路径启动它,我们可以忽略“参数”和“启动于”选项。一旦我们打开一个进程,我们就会看到选项卡填充,如下图所示。

A screenshot showing a process being monitored in API Monitor, while the RegOpenKey API is highlighted, showing that the process is calling this API call.

点击放大

在上图中,我们可以看到所有选项卡都已填充。

  • 在选项卡 1 中,我们看到我们已选择所有值,以便我们可以监视所有 API 调用。
  • 在选项卡 2 中,我们看到我们正在监视的进程的路径。
  • 在选项卡 3 中,我们看到 API 调用的摘要。突出显示的 API 调用可以看作 RegOpenKeyExW。因此,我们知道该进程尝试打开注册表项。我们看到 API 调用返回错误,我们可以在此选项卡的“返回值”字段中看到该错误,错误详细信息可在此选项卡的“错误”字段中找到。
  • 选项卡 5 显示了 API 调用前后的 API 调用参数。
  • 选项卡 6 以十六进制显示所选值。
  • 选项卡 7 显示进程的调用堆栈。

我们看到 API Monitor 比 API Logger 为我们提供了更多关于进程 API 调用的信息。但是,我们必须放慢分析过程以消化所有这些信息。在分析恶意软件时,我们可以根据自己的需求决定是否使用 API Logger 或 API Monitor。请前往 Windows API 简介 房间了解有关 API 调用的更多信息。

Process Explorer

Process Explorer 是 Sysinternals Suite 中另一个非常有用的工具。它可以被视为 Windows 任务管理器的更高级形式。Process Explorer 是一个非常强大的工具,可以帮助我们识别进程挖空和伪装技术。我们可以通过导航到 ~Desktop\Tools\Utilities\procexp.exe 来打开 Process Explorer 工具。当我们打开 Process Explorer 时,我们会看到类似以下屏幕截图的内容。

A screenshot showing the interface of Process Explorer

上面的屏幕截图以树状格式显示了系统中运行的所有不同进程。我们还可以看到它们的 CPU 利用率、内存使用率、进程 ID (PID)、描述和公司名称。我们可以从“查看”菜单中启用下部窗格视图,以查找有关进程的更多信息。启用后,我们会看到以下屏幕截图。

A screenshot showing Process Explorer while one process is highlighted and its opened handles are shown in a lower pane

当我们在上面的窗格中选择一个进程时,我们可以在下面的窗格中看到有关该进程的详细信息。在这里,我们可以看到进程为不同的部分、进程、线程、文件、互斥锁和信号量打开的句柄。句柄告诉我们此进程正在使用的资源。如果一个进程打开了另一个进程或另一个进程中的线程,则可能表明该进程中存在代码注入。同样,我们可以在下面窗格的其他选项卡中看到该进程的 DLL 和线程。

有关所选进程的更多详细信息,我们可以查看该进程的属性。我们可以右键单击进程树中的进程名称并选择“属性”来执行此操作。当我们打开进程的属性时,我们会看到类似下图的内容。

A screenshot showing the Image tab in the properties of a process when opened in Process Explorer

Process Masquerading:

如上图所示,属性函数在进程的不同选项卡中向我们展示了大量有关进程的信息。恶意软件作者有时会使用与 Windows 进程或常用软件类似的进程名称来躲避分析师的窥探。如上图所示,“图像”选项卡可帮助分析师挫败此技术。通过单击此选项卡上的“验证”按钮,分析师可以确定正在运行的进程的可执行文件是否由相关组织签名,对于 Windows 二进制文件,该组织将是 Microsoft。在此特定屏幕截图中,我们可以看到已单击“验证”选项。此外,我们可以在顶部看到文本“(主题中没有签名)Microsoft Corporation”。这意味着,尽管可执行文件声称来自 Microsoft,但它并未经过 Microsoft 数字签名,而是伪装成 Microsoft 进程。这可能表明存在恶意进程。

我们必须在此注意,此验证过程仅适用于存储在磁盘上的进程映像。如果签名的进程已被挖空,并且其代码已被内存中的恶意代码替换,我们仍可能会获得该进程的经过验证的签名。要识别被挖空的进程,我们必须从其他地方寻找。

进程挖空:

恶意软件用来隐藏的另一种技术是进程挖空。在这种技术中,恶意软件二进制文件通过从内存中删除所有代码并注入恶意代码代替合法代码来挖空已经运行的合法进程。这样,虽然分析师看到的是合法进程,但该进程运行的是恶意软件作者的恶意代码。进程资源管理器也可以帮助我们识别这种技术。当我们打开进程属性中的“字符串”选项卡时,我们会看到类似以下屏幕截图的内容。

A screenshot showing strings in a process' properties opened in Process Explorer

在截图的下方,我们可以看到选项‘Image’和‘Memory’。当我们选择‘Image’时,Process Explorer 会展示进程磁盘镜像中存在的字符串。当选择‘Memory’时,Process Explorer 会从进程的内存中提取字符串。在正常情况下,由于内存中加载的是同一个进程,因此进程镜像中的字符串与内存中的字符串会比较相似。但是,如果某个进程被挖空,我们会看到镜像中的字符串和进程内存中的字符串有明显的区别。因此,内存中加载的进程与磁盘上存储的进程有很大的不同。

Regshot

在开始此任务之前,请终止虚拟机并重新启动它,以便从快照中重新开始。

Regshot 是一种识别注册表(或我们选择的文件系统)的任何更改的工具。它可用于识别在恶意软件动态分析期间创建、删除或修改了哪些注册表项。Regshot 的工作原理是在执行恶意软件之前和之后拍摄注册表快照,然后比较两个快照以识别两者之间的差异。要在附加的虚拟机中执行 Regshot,请导航到 ~Desktop\Tools\Utilities\Regshot-x64-Unicode.exe

当我们执行 Regshot 时,我们会看到以下界面。请注意,我们在附加的虚拟机中看到的输出路径可能会有所不同。

A screenshot of Regshot before taking the first snapshot. The '1st shot' option is highlighted.

在这个简单的界面中,如果我们选择 Scan dir1 选项,我们还可以扫描文件系统的更改。但是,为了简洁起见,我们将只介绍注册表更改。首先,我们可以单击“第一次拍摄”选项。它会询问我们是拍摄还是拍摄并保存。拍摄完第一次拍摄后,我们会看到类似以下屏幕截图的内容。

A screenshot of Regshot after the 1st shot is taken, showing the details from the first shot.

现在我们已经保存了注册表的快照,我们可以执行恶意软件了。一旦我们执行了恶意软件并确信它已经执行了恶意活动,我们就会进行第二次攻击。为此,我们点击“第二次攻击”选项。

A screenshot of Regshot when we click the '2nd shot' option. It shows the different options for taking the 2nd shot

现在我们有了两个截图,我们可以比较它们来识别恶意软件执行的注册表更改。我们通过点击“比较”选项来做到这一点。我们将看到一个类似于以下屏幕截图的摘要。

A screenshot of Regshot showing a summary of the results of comparison of 1st and 2nd shot.

请注意,它显示了已添加、删除和修改的键和值。它还显示了文件和文件夹的更改。我们看到文件夹和文件没有任何变化,因为我们在拍摄照片时禁用了“扫描 dir1”。如果我们启用了此选项并提供要监视的目录,我们将看到有关恶意软件在我们选择的目录中所做的文件系统更改的详细信息。现在,让我们继续执行结果。如果我们通过单击“比较”>“输出”保存结果,Regshot 将为我们提供注册表中的更改,如下面的屏幕截图所示。

A screenshot of Regshot comparison results, as seen in Notepad.

这里我们可以看到 Regshot 拍摄的日期和时间、计算机名称、用户名和 Regshot 的版本。在其下方,我们可以看到对注册表所做的更改列表,从删除的键开始。>

与本室讨论的所有其他工具相比,Regshot 的一个优势是,当我们执行恶意软件时,它不需要运行。某些恶意软件可以检查所有正在运行的进程,并在任何分析工具运行时关闭。在分析时,我们可能经常会遇到恶意软件样本,这些样本在执行任何恶意活动之前会检查 ProcExp、ProcMon 或 API Monitor,如果发现这些进程,则会退出。因此,这些样本可能会阻碍我们的分析工作。但是,由于 Regshot 在执行恶意软件样本之前和之后都会拍摄一次,因此它不需要在恶意软件执行期间运行,从而使其免受这种检测规避技术的影响。另一方面,我们必须确保在使用 Regshot 进行分析时没有其他进程在后台运行,因为 Regshot 中没有过滤机制,就像我们在其他工具中看到的那样。因此,任何由后台进程产生的噪音也将被 Regshot 记录,从而导致误报。

Conclusion

好了,这就是我们的基本动态分析室。我们了解了如何:

使用 ProcMon 监控进程的活动并过滤掉其他进程以专注于我们感兴趣的进程。
识别进程正在进行的 API 调用以识别该进程的行为。
确定恶意软件样本是否试图通过执行进程伪装或进程空洞来逃避检测。进程资源管理器是我们用于此目的的首选工具。
使用 Regshot 识别恶意软件在注册表中所做的更改。
此外,我们必须明白,恶意软件分析需要毅力、毅力和对细节的关注。恶意软件作者总是会试图阻挠分析师的努力,而我们迄今为止所介绍的内容不足以分析最先进的恶意软件。我们将在即将到来的高级分析室中介绍一些调查高级恶意软件行为的技巧。