未知恶意软件的检测和分析

信息安全 恶意软件 病毒 检测
2021-08-16 10:29:28

假设我有一个可疑的二进制文件。我如何确定它是否是恶意的,如果是,逆向工程它的工作原理和作用?例如,也许使用静态分析?

某处是否有任何记录在案的恶意 API 调用?我在我读过的论文中找不到任何东西。我可以将它提交到沙箱,但我想学习如何分析恶意 PE 二进制文件。

4个回答

某处是否有任何记录在案的恶意 API 调用。我在纸上找不到。

不,因为所有 API 调用都可能是有效的和恶意的,具体取决于上下文。就分析恶意软件而言,这通常是您手动执行的操作。

Windows 可执行文件的快速入门如下所示:所有进行 API 调用的 Windows 可执行文件都必须从系统 DLL 导入这些地址。这发生在两个层面;如果可执行文件动态加载 DLL,则导入是静态编码的,并且是动态的。因此,开始分析的一个地方是查看可执行文件在 API 调用方面导入的内容。你可以这样做:

dumpbin /IMPORTS executablename.(exe|dll|ocx|scr|anything executable)

(或者,反汇编程序将在输出反汇编中显示此信息)。

另一种有用的技术可能是转储所有可打印的 ascii 字符串并查看它们。如果恶意软件写得不好,您很可能会在其中找到指向可疑位置的硬编码 URL 或其他数据。如果您在其中找到字符串cmd.exe,那将非常可疑。

可执行文件的其他可疑属性包括滥用 PE 格式,例如不正确地使用标头。大多数(如果不是全部)链接器都会尊重格式的所有标头,但有些是不必要的,Windows实际上会通过仔细组装来执行带有标头中代码的图像。像这样的小型可执行文件,尤其是那些调用网络功能的,应该被视为可疑的。

带有超出图像末尾数据的图像(这是允许的 - 这是 winzip 自解压器和 exe 类型的安装程序通常工作的方式)也可能被视为可疑,因为您在那里有数据有效负载。

但是,优秀的恶意软件作者知道这一点,并且能够混淆这些字符串并提供有效的可执行文件,因为实际的大小成本并没有那么高。在这一点上,静态地,通常值得反汇编代码并通读它。此时需要全面了解汇编,了解链接的工作原理以及如何在 ABI 级别与您所在的操作系统进行交互。Rakkhi 提到了人满为患的实验室——这就是他们进来的地方。

所以这是你可以做的一组简短的事情来静态分析图像(不运行它)。如果你有一个系统要牺牲(比如虚拟机),那么你也可以考虑运行它并分析会发生什么。适用于 Windows 的一些工具:

  • depends.exe 来自 DDK 的文件将分析可执行文件以计算出它们导入的所有 DLL。
  • windbg.exe允许您调试正在运行的实时映像,在运行时告诉您寄存器中的各种值可能是什么,正在进行什么调用。有些人喜欢 ollydbg,但在撰写本文时它还没有 x64 支持,所以我没有使用它。
  • SysInternals的各种工具可用于找出应用程序试图与之交互的注册表项、文件等。请参阅 Mark Russinovich 关于使用这组工具检测 sony rootkit 的文章。
  • 国际开发协会专业版我自己买不起这种工具,但它是这个行业的工具之一。

这些等价于 Linux 上的strace和等命令ltrace,以及pmap. 它们为您提供有关该过程实际尝试执行的操作的信息,并且其中的调试工具允许您逐步完成它。我应该指出这是非常不安全的,你应该只在受控环境中真正这样做。

就实际运行的进程而言,有一些事情通常看起来一直很可疑。这些并不一定意味着进程本身是恶意的——它很可能已被利用并注入了代码。他们是:

  • 地图(0)。没有进程真的需要映射到零;操作系统通常会映射到标准使用下的任何其他地址空间。映射到零对于基于汇编程序的程序很有用,因为 0 是一个简单的引用地址。例如,Jonesforth 会这样做,因此调试器下的任何 0 字节字段都表示代码是从第四种语法而不是内置函数解释的,这是一个方便的技巧。但总的来说,除非可执行文件完全用汇编语言编写,否则它永远不会这样做。恶意软件作者可能会将其用作一个简单的参考点,因为那里可能没有任何映射。
  • 可执行堆栈。堆栈上的页面通常不是可执行的,因为堆栈应该只真正包含数据。
  • 在别处执行数据页。很少有程序需要加载自定义代码并执行它。
  • 访问某些操作系统资源,例如\Device\PhysicalMemory或 Linux 等效资源/dev/kmem
  • 对于驱动程序,修改系统服务表(Linux 称之为 sys 调用表)。在 Linux 上,系统调用表从 2.6.24ish 开始默认标记为只读。在 Windows 上,微软承诺他们将继续尝试阻止任何人直接修改系统服务表,因为基于驱动程序的 API 提供了任何合法代码可能需要的所有功能。
  • 不加选择的DLL注入,即系统范围的dll注入。另请参阅安装 shell 扩展、添加代码以启动路径、启动执行修改 - 任何自动运行暴露的内容都可能是合法操作或试图持续重启的恶意软件。如果您正在静态或动态地查看一个进程,如果它把东西放在这里,请调查它的作用。

至于 AV 如何进行签名识别,Rakkhi已经涵盖了这一点,特别是他观察到防病毒实现在其工作方式(但不是它们的作用)上就像恶意软件一样。签名只需要包含足够的信息(希望,尽管会发生误报)唯一地识别恶意软件,因此文件的关键属性(例如大小)和文件中的关键特征(某些指令组合,后跟压缩数据)例子)。

从职业的角度来看,我无法就如何进入这个领域提出建议;我是业余爱好者。但是,从技术上讲,如果您想弄清楚如何检查二进制文件,我会说选择一个安全的。选择您系统上的一个程序,比如说notepad.exe,然后查看它的作用和行为方式。然后继续做更​​复杂的事情。我这样说是因为您可以设置一次系统并且知道它不会以这种方式损坏,因此您可以改进您的工作而无需重建系统,因为恶意软件在您的动态分析出错并且您无法使用之后让它破坏系统。

希望这能让您了解如何开始。真的,这是一个巨大的领域,我需要几本书来彻底解释它。最后,小心处理恶意软件。

一些非常棒的资源尚未提及:

在汇编级别静态分析程序以确定它是否是恶意的听起来非常非常困难。如果你能做到这一点,我想你也可以在可执行文件中找到任何错误。如果您只搜索危险的调用,例如文件系统访问,您会发现许多程序在执行此操作时并没有恶意。对于大多数程序来说,使用文件系统是很常见的事情。因此,需要从另一个层面分析程序实际在做什么,并识别任何恶意行为。但是这种分析需要在任何复杂的深度下工作,因为源代码很容易交织在一起等,而且编译器可以转移代码,使得分析很难找到事件链对于恶意攻击。下一步,应该搜索哪些恶意攻击?以及如何定义每一次攻击,以便通过如此精细的分析方法发现它?

如果我理解正确的话,目前所有的反病毒方法都是基于识别病毒的模式,这是一种更容易找到恶意程序的方法。

这个问题让我想起了 Douglas R. Hofstadter 在Gödel-Escher-Bach中的写作,以及自我复制的部分。我认为这类似于-“任何足够强大的系统都能够自我毁灭”。

简而言之,如果我们仅仅从反汇编层面就能找到一个(新的)恶意程序,我想操作系统和开发工具会过于简化,以至于系统几乎无法使用。如果操作系统和开发工具足够先进,那么系统和工具将能够以我们有限的知识无法(早期)发现的方式产生恶意。

防病毒供应商的整个实验室都在这样做。最简单的方法是将其提交给一个。Sophos、McAfee、赛门铁克等

从我看到的许多演示文稿中,分析通常涉及在二进制文件中寻找异常行为或内容。具有讽刺意味的是,行为看起来像 AV 行为。挂钩系统调用、劫持浏览器对象、拨号回家等。隐藏内容可能是将可执行文件注入到 Excel 文件或电影中。反编译二进制文件,确保识别这些。

AV 以类似的方式工作,监视进程和内存中的异常活动并检查文件的已知签名(通常这将是单个文件级别,而不是每个二进制文件中的每一行)。

如果您希望进入该领域,特定的恶意软件论坛将为您提供更多信息和研究资源。

简单易行的解决方案是:将您的样本提交给Virus Total,看看他们怎么说。他们将在其上运行数十种防病毒产品并与您分享结果。

对于基于 Web 的恶意软件(包括 PDF 文件),我推荐使用Wepavet