目录导航
fireeye capa简介
capa 是 FLARE 团队最新的用于分析恶意程序的开源工具。我们的工具为社区提供了一个框架来编码、识别和分享我们在恶意软件中看到的行为。无论您的背景如何,当您使用 capa 时,您都会调用数十年累积的逆向工程经验来弄清楚程序的作用。在这篇文章中,您将了解 capa 的工作原理、如何安装和使用该工具,以及为什么从今天开始应该将其集成到您的分类工作流程中。
capa的诞生原因
高效的分析师可以在调查中快速了解未知文件并确定其优先级。但是,确定程序是否为恶意程序、它在攻击中扮演的角色及其潜在功能至少需要基本的恶意软件分析技能。通常,需要有经验的逆向工程师才能恢复文件的完整功能并猜测作者的意图。
恶意软件专家可以快速对未知二进制文件进行分类,以获得初步见解并指导进一步的分析步骤。另一方面,经验不足的分析师通常不知道该寻找什么,并且难以区分通常情况和异常情况。不幸的是,strings/ FLOSS或 PE 查看器等常用工具显示的细节级别最低,给用户组合和解释数据点带来了负担,因此火眼团队开发了这一款名叫 capa 的开源恶意软件识别分析工具.
capa介绍
当我们针对示例程序运行 capa 时,下图中的工具输出几乎不言自明。主表显示了此示例中所有已识别的功能,左侧的每个条目描述了一个功能。右侧的关联命名空间有助于对相关功能进行分组。capa 做得非常出色,并描述了我们在上一节中讨论过的所有程序功能。

我们发现 capa 经常提供令人惊讶的好结果。这就是为什么我们希望 capa 始终能够显示用于识别能力的证据。下图显示了 capa 对“创建 TCP 套接字”结论的详细输出。在这里,我们可以检查二进制文件中 capa 找到相关特征的确切位置。我们稍后会看到规则的语法——同时,我们可以推测它们是由结合低级特征的逻辑树组成的。

capa 的工作原理
capa 由两个主要组件组成,它们通过算法对未知程序进行分类。首先,代码分析引擎从文件中提取特征,例如字符串、反汇编和控制流。其次,逻辑引擎查找以通用规则格式表示的特征组合。当逻辑引擎找到匹配项时,capa 会报告规则描述的能力。
特征提取
代码分析引擎从程序中提取低级特征。所有特征都与人类可能识别的一致,例如字符串或数字,并使 capa 能够解释其工作。这些特征通常分为两大类:文件特征和反汇编特征。
文件特征是从原始文件数据及其结构中提取的,例如 PE 文件头。通过滚动整个文件,您可能会注意到这些信息。除了上面讨论的字符串和导入的 API,这些还包括导出的函数和部分名称。
反汇编特征是从文件的高级静态分析中提取的——这意味着反汇编和重建控制流。下图 显示了选定的反汇编功能,包括 API 调用、指令助记符、数字和字符串引用。

因为高级分析可以区分程序中的函数和其他范围,所以 capa 可以在适当的细节级别应用其逻辑。例如,在不同的函数中使用不相关的 API 时不会混淆,因为 capa 规则可以指定它们应该独立地与每个函数匹配。
我们在设计 capa 时考虑到了灵活且可扩展的特征提取。可以轻松集成其他代码分析后端。目前,capa 独立版本依赖于vivisect分析框架。如果您使用的是 IDA Pro,您还可以使用 IDAPython 后端运行 capa。请注意,有时代码分析引擎之间的差异可能会导致不同的功能集,从而导致不同的结果。幸运的是,这在实践中通常不是一个严重的问题。
规则
capa 规则使用特征的结构化组合来描述可以在程序中实现的能力。如果所有必需的功能都存在,则 capa 会得出结论,该程序包含该功能。
capa 规则是包含元数据和用于表达其逻辑的语句树的 YAML 文档。除此之外,规则语言支持逻辑运算符和计数。在下图 中,“创建 TCP 套接字”规则表示数字6、1和 2以及对 API 函数套接字或WSASocket 的调用必须存在于单个基本块的范围内。基本块在非常低的级别对汇编代码进行分组,使它们成为匹配紧密相关的代码段的理想场所。除了在基本块内,capa 还支持函数和文件级别的匹配。函数作用域将反汇编函数中的所有特征联系在一起,而文件作用域包含整个文件中的所有特征。

下图突出显示了规则元数据,使 capa 能够向其用户显示高级别的有意义的结果。规则名称描述了已识别的功能,而命名空间将其与技术或分析类别相关联。我们已经在 capa 输出的能力表中看到了名称和命名空间。元数据部分还可以包括诸如作者或示例之类的字段. 我们使用示例来引用我们知道存在的功能的文件和偏移量,从而对每个规则进行单元测试和验证。此外,capa 规则是真实世界恶意软件中行为的重要文档,因此请随时保留副本作为参考。在以后的文章中,我们将讨论其他元信息,包括 capa 对 ATT&CK 和恶意软件行为目录框架的支持。

安装方法
为了尽可能轻松地使用 capa,我们提供了适用于 Windows、Linux 和 OSX 的独立可执行文件。该工具是用 Python 编写的,源代码可在我们的 GitHub 上找到。capa 存储库中提供了其他和最新的安装说明。
较新版本的FLARE-VM(可在GitHub 上获得)也包括 capa。
用法
要识别程序中的功能,请运行 capa 并指定输入文件:
capa suspicious.exe
capa 支持 Windows PE 文件(EXE、DLL、SYS)和 shellcode。要在 shellcode 文件上运行 capa,您必须明确指定文件格式和架构,例如分析 32 位 shellcode:
capa -f sc32 shellcode.bin
为了获取有关已识别功能的详细信息,capa 支持两个额外的详细级别。要获得有关规则匹配的位置和原因的最详细输出,请使用非常详细的选项:
capa -vv suspicious.exe
如果您只想关注特定规则,您可以使用标签选项来过滤规则元部分中的字段:
capa -t "create TCP socket" suspicious.exe
显示 capa 的帮助以查看所有支持的选项并合并文档:
capa -h
capa 2.0介绍
我们很高兴地宣布我们名为 capa 的开源工具的 2.0 版。capa 使用可扩展的规则集自动识别程序中的功能。该工具支持恶意软件分类和深入逆向工程。如果您之前没有听说过 capa,或者需要复习一下,请查看我们的第一篇博文。您可以从项目的发布页面下载 capa 2.0 独立二进制文件并在GitHub 上签出源代码。
capa 2.0 使任何人都可以更轻松地贡献规则,这使得现有的生态系统更加活跃。这篇博文详细介绍了 capa 2.0 中包含的以下主要改进:
- capa explorer IDA Pro 插件的新功能和增强功能,让您无需切换窗口即可交互式探索功能并编写新规则
- 通过使用 FLIRT 识别库函数并发布随附的开源 FLIRT 签名,获得更简洁和相关的结果
- 数以百计的新规则描述了额外的恶意软件功能,使收集的规则总数达到 579 条,其中一半以上与 ATT&CK 技术相关
- 迁移到 Python 3,以便更轻松地将 capa 与其他项目集成
capa 资源管理器和规则生成器
capa explorer 是一个 IDAPython 插件,可以直接在 IDA Pro 中显示 capa 结果。2.0 版本包含对该插件的许多添加和改进,但我们想强调最令人兴奋的添加:capa explorer 现在可以帮助您直接在 IDA Pro 中编写新的 capa 规则!
由于我们大部分时间都在使用 IDA Pro 等逆向工程工具分析恶意软件,因此我们决定添加一个 capa 规则生成器。图 1 显示了规则生成器界面。

使用入门指南安装 capa explorer 后,通过导航到Edit > Plugins > FLARE capa explorer打开插件。您可以通过选择capa 资源管理器窗格顶部的规则生成器选项卡来开始使用规则生成器。从这里,将您的 IDA Pro 反汇编视图导航到包含您想要捕获的技术的函数,然后单击分析按钮。规则生成器将解析、格式化和显示它在您的函数中找到的所有 capa 功能。您可以使用规则生成器的三个主要窗格编写规则:Features、Preview和Editor. 您的第一步是从“功能”窗格中添加功能。
该功能窗格是一个包含所有CAPA从你的函数提取的特征的树视图。您可以使用窗格顶部的搜索栏过滤特定功能。然后,您可以通过双击添加功能。图 2 显示了这一点。

当您从“功能”窗格添加功能时,规则生成器会自动设置格式并将其添加到“预览”和“编辑器”窗格中。该预览和编辑窗格帮你巧妙,你已经添加的功能,并允许你修改,如规则的元数据等信息。
该编辑器窗格是一个互动的树状视图显示的声明和功能层次构成您的规则。您可以通过右键单击上下文菜单使用拖放和编辑节点来重新排序节点。为了帮助人们理解规则逻辑,您可以通过在“描述”和“注释”列中键入来向特征添加描述和注释。规则生成器会自动格式化您在“编辑器”窗格中所做的任何更改,并将它们添加到“预览”窗格中。图 3 显示了如何使用编辑器窗格操作规则。

在预览窗格是包含最终规则文本的可编辑文本框。您可以编辑任何显示的文本。规则生成器会自动格式化您在“预览”窗格中所做的任何更改,并将它们添加到“编辑器”窗格中。图 4 显示了如何直接在“预览”窗格中编辑规则。

在您进行编辑时,规则生成器会检查您的规则,并使用“预览”窗格下方显示的消息通知您任何错误。编写完规则后,您可以通过单击“保存”按钮将其保存到 capa 规则目录中。规则生成器准确保存了预览窗格中显示的内容。就是这么简单!
我们发现使用 capa explorer 规则生成器可以显着减少编写新 capa 规则的时间。该工具不仅可以自动化大部分规则编写过程,而且无需在 IDA Pro 和您最喜欢的文本编辑器之间进行上下文切换,从而让您可以在脑海中清晰地记录恶意软件知识。
要了解有关 capa explorer 和规则生成器的更多信息,请查看自述文件。
使用 FLIRT 识别库函数
当我们编写了数百条 capa 规则并检查了数千条 capa 结果时,我们认识到由于嵌入的库代码,该工具有时会显示令人分心的结果。我们认为 capa 需要将注意力集中在程序员的逻辑上,而忽略支持库代码。例如,高度优化的 C/C++ 运行时例程和开源库代码使程序员能够快速构建产品而不是产品本身。因此,capa 结果应该反映程序员对程序的意图,而不是程序中每个字节的分类。
比较图 5 中的 capa v1.6 结果与图 6 中的 capa v2.0 结果。 capa v2.0 识别并跳过近 200 个库函数并产生更多相关结果。


因此,我们寻找一种方法来区分程序员的代码和库代码。
在尝试了一些策略后,我们采用了 Hex-Rays 开发的快速图书馆识别和识别技术 (FLIRT) 。值得注意的是,该技术自 1996 年以来一直保持稳定和有效,速度快,需要非常有限的代码分析,并且在 IDA Pro 用户群中享有广泛的社区。我们弄清楚了 IDA Pro 如何匹配 FLIRT 签名,并在 Rust 中使用Python 绑定重新实现了匹配引擎。然后,我们构建了一个开源签名集,涵盖了现代恶意软件中遇到的许多库例程。最后,我们更新了 capa 以使用新的签名来指导其分析。
capa 使用这些签名来区分库代码和程序员的代码。虽然 capa 可以提取和匹配嵌入式库函数的名称,但它会跳过在库代码中查找功能和行为。这样,capa 结果更好地反映了程序员编写的逻辑。
此外,库函数识别极大地提高了 capa 运行时的性能:由于 capa 跳过了库函数的处理,它可以避免在相当大比例的现实世界函数中进行昂贵的规则匹配步骤。在我们 206 个样本的测试平台中,我们的函数签名将 186,000 个函数中的 28% 识别为库代码。由于我们的实现可以识别大约 100,000 个函数/秒,库函数识别开销可以忽略不计,capa 比 2020 年快约 25%!
最后,我们引入了一个新的要素类,规则作者可以使用它来匹配已识别的库函数:function-name。此功能在文件级范围内匹配。我们已经开始使用这种新功能来识别加密例程的特定实现,例如Crypto++提供的 AES ,如图 7 中的示例规则所示。

当我们为有趣的行为制定规则时,我们学到了很多关于合法使用不常见技术的地方。例如,作为恶意软件分析师,我们最常看到cpuid指令与反分析检查一起出现,例如在 VM 检测例程中。因此,我们天真地制定了规则来标记这条指令。但是,当我们针对我们的测试平台对其进行测试时,该规则与大多数现代程序相匹配,因为此指令通常合法地用于高度优化的例程(例如memcpy)以选择加入较新的 CPU 功能。事后看来,这是显而易见的,但当时在所有可执行文件的大约 15% 中看到cpuid有点令人惊讶。借助新的 FLIRT 支持,capa 识别优化的memcpyVisual Studio 嵌入的例程,不会标记嵌入的cpuid指令,因为它不是程序员代码的一部分。
当用户升级到 capa 2.0 时,他们会发现该工具运行速度更快并提供更精确的结果。
签名生成
为了向所有用户(尤其是没有 IDA Pro 许可证的用户)提供python-flirt的好处,我们花了大量时间为常见的恶意软件分析用例创建了一个全面的 FLIRT 签名集。签名包含在 capa 中,也可以在我们的 GitHub 上 根据 Apache 2.0 许可获得。我们相信其他项目可以从中受益匪浅。例如,我们期望一旦我们合并了库函数识别,FLOSS的性能就会得到提高。此外,您可以使用我们的签名与 IDA Pro 来识别更多库代码。
我们的初始签名包括:
- 从 Microsoft Visual Studio (VS),对于从 VS6 到 VS2019 的所有主要版本:
- C 和 C++ 运行时库
- 活动模板库 (ATL) 和 Microsoft 基础类 (MFC) 库
- 以下是使用 VS2015、VS2017 和 VS2019 编译的开源项目:
- CryptoPP
- curl
- Microsoft Detours
- Mbed TLS (previously PolarSSL)
- OpenSSL
- zlib
识别和收集相关的库和目标文件需要大量的工作。对于较旧的 VS 版本,这是手动完成的。对于较新的 VS 版本和相应的开源项目,我们能够使用vcpgk和 Docker自动化该过程。
然后我们使用 IDA Pro FLAIR 实用程序将千兆字节的可执行代码转换为模式文件,然后转换为签名。这个过程需要广泛的研究和大量的反复试验。例如,我们花了两周时间测试和探索各种 FLAIR 选项,以了解最佳组合。我们感谢 Hex-Rays 为 IDA Pro 提供高质量的签名,并感谢他们与社区分享他们的研究和工具。
要了解有关模式和签名文件生成的更多信息,请查看siglib存储库。FLAIR 实用程序可在Hex-Rays 网站的受保护下载区域中获得。
规则更新
自最初发布以来,社区已将能力检测规则总数从 260 条增加到570 多条!这意味着 capa 可以识别更多在现实世界恶意软件中看到的技术,当然可以节省分析人员逆向工程程序的时间。重申一下,由于来自十几个组织的近 30 名同事自愿提供他们的经验来制定这些规则,我们已经获得了一波支持。谢谢!
图 8 提供了 capa 当前捕获的能力的高级概述,包括:
- 主机交互描述了与文件系统、进程和注册表交互的程序功能
- 反分析描述了加壳程序、反虚拟机、反调试和其他相关技术
- 集合描述了用于窃取凭据或信用卡信息等数据的功能
- 数据操作描述了加密、解密和散列数据的能力
- 通信描述数据传输技术,例如 HTTP、DNS 和 TCP

超过一半的 capa 规则与MITRE ATT&CK技术相关,包括在 ATT&CK版本 9中引入的所有属于 capa 范围内的技术。此外,目前几乎一半的 capa 规则与恶意软件行为目录(MBC) 标识符相关联。
对于超过 70% 的 capa 规则,我们收集了相关的现实世界二进制文件。每个二进制文件都实现了有趣的功能并展示了值得注意的功能。您可以在我们的capa 测试文件 GitHub 页面查看整个样本集。我们非常依赖这些示例来开发和测试代码增强和规则更新。
Python 3 支持
最后,我们花了将近三个月的时间将 capa 从 Python 2.7 迁移到 Python 3。这涉及与vivisect 的密切合作,我们要感谢团队的支持。经过广泛的测试和支持两个 Python 版本的几个版本后,我们很高兴 capa 2.0 和未来版本将仅是 Python 3。
capa 2.0下载地址
①GitHub下载:
capa-v2.0.0-linux.zip 38.2 MB
capa-v2.0.0-macos.zip 29.4 MB
capa-v2.0.0-windows.zip 31.1 MB
源代码(zip)
源代码(tar.gz)
②云中转网盘:
capa-v2.0.0-linux.zip
capa-v2.0.0-macos.zip
capa-v2.0.0-windows.zip
结论
现在您已经看到了 capa 的所有最新改进,我们希望您立即升级到最新的 capa 版本!由于库函数识别 capa 将报告更快和更相关的结果。数以百计的新规则捕获了最有趣的恶意软件功能,而改进的 capa explorer 插件可帮助您专注于分析并在恶意软件知识新鲜时对其进行编纂。
适用于 Windows、Mac 和 Linux 的独立二进制文件可在capa Releases 页面上找到。
要从PyPi安装 capa,请使用命令pip installflare -capa。
源代码可在我们的capa GitHub 页面 获得。
GitHub 上的项目页面包含详细的文档,包括完整的安装说明和capa explorer的演练。
请使用GitHub提出问题、讨论想法和提交问题。
我们强烈鼓励您为 capa 的规则语料库做出贡献。改进的 IDA Pro 插件使它比以往任何时候都更容易。如果您有任何与规则相关的问题或想法,请在GitHub 存储库上告诉我们 。请记住,当您与社区共享规则时,您会在数十个组织中的数百名逆向工程师中扩展您的影响。