securifybv/Visual-Studio-BOF-template

GitHub: securifybv/Visual-Studio-BOF-template

一个用于在 Visual Studio 中快速开发 Cobalt Strike BOF 的项目模板,解决了动态函数解析、符号剥离和调试困难等问题。

Stars: 323 | Forks: 55

### 简介 Cobalt Strike beacon object files (BOFs) 是一项添加到 beacon 中的功能,旨在以更具 OPSEC 安全性的方式实现 beacon 的快速扩展。BOF 文件是一种 COFF 目标文件,它将在与 beacon 相同的进程中执行,从而无需使用诸如 fork&run 等 OPSEC 代价高昂的技术。BOFs 使用 C\C++ 编写,可以通过 Visual Studio 或 MinGW 构建。关于 BOFs 的官方文档可以在[这里](https://www.cobaltstrike.com/help-beacon-object-files)找到。TrustedSec 提供了一份写得很好的[面向开发者的 BOFs 介绍](https://www.trustedsec.com/blog/a-developers-introduction-to-beacon-object-files/),并且还为那些有兴趣深入了解 BOFs 底层运行机制的人提供了一个[示例 COFF 加载器](https://www.trustedsec.com/blog/coffloader-building-your-own-in-memory-loader-or-how-to-run-bofs/)。 在 Visual Studio 中开发 Windows 应用程序有其优势,主要是构建、调试和测试的便捷性,以及虚拟泄漏检测器、应用程序验证器、cppcheck 等测试工具的集成。然而,使用 Visual Studio 创建 BOFs 的体验并不愉快,因为动态函数解析的语法问题,以及生成 BOF 和剥离其调试符号所需的额外步骤。此外,BOFs 有时在任务中会失败,若能知道生产环境中失败的原因将会非常有用。 我想创建一个可复用的基线模板,以便在 Visual Studio 中开发 BOFs,而无需担心动态函数解析语法、剥离符号、编译器配置、C++ 名称修饰或意外的运行时错误。因此,需求如下: 1. 默认的 debug 和 release 构建配置,用于调试和测试内存或句柄泄漏等问题 2. 自定义 BOF 构建配置,用于生成 BOFs,剥离其调试符号,并将它们移动到输出目录 3. 预置的函数定义列表,允许开发人员复用现有代码,而无需添加动态函数解析语法 4. 内置错误函数,在生产环境中打印导致错误的行号和函数 5. 能够编写简单的 C++ 代码,而无需担心名称修饰 满足这些要求的第一个原型已经创建,并可在 GitHub 上获取。 ### 使用说明 #### 将模板导入 Visual Studio 要使用该模板,请从[发布页面](https://github.com/securifybv/Visual-Studio-BOF-template/releases)下载最新的 zip 文件,并将其复制到“我的文档”下的项目模板目录中。对于 Visual Studio 2019,该目录应为: %UserProfile%\Documents\Visual Studio 2019\Templates\ProjectTemplates 下次运行 Visual Studio 时,该模板将被自动加载。重启后,您可以在新建项目向导中搜索“beacon”以找到该模板。 ![Templates Location](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/24ee977454123312.png) ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/68dc8cebb6123313.png) #### 默认结构 解决方案的结构如下图所示。*Header Files* 筛选器包含开发 BOFs 所需的两个头文件。第一个是 Cobalt Strike 团队提供的 beacon 头文件。bofdefs 头文件是 TrustedSec 的 bofdefs 头文件的修改版本。接下来,*Resources* 筛选器包含一个用于剥离调试符号的 PowerShell 脚本。该 PowerShell 脚本基于 Matthew Graeber (@mattifestation) 的 ObjDump 脚本工作。最后,*Source Files* 筛选器包含 BOF 的源代码。 ![project_structure](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/6d2c2110b7123314.png) #### 使用模板 对于不带参数的 BOFs,该模板的使用非常简单,只需将 *main* 代码复制到 *go* 函数即可。下图显示 *go* 中的代码与 *main* 中的代码完全相同。无需进一步修改即可复用代码的能力提高了将现有项目移植到 BOFs 的效率,并消除了动态函数解析的非自然语法。对于带参数的 BOFs,只有参数解析部分会有所不同。下一个版本的目标是创建通用的参数解析宏或函数,以消除任何修改的需要。 ![Text](https://raw.githubusercontent.com/securifybv/Visual-Studio-BOF-template/master/images/code1.png) 当代码准备就绪后,可以使用项目模板中的预定义构建配置一次性构建 x64 和 x86 BOFs。为此,请转到 Build -> Batch Build 并勾选这两种架构。 ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/cb6f561c60123345.png) 若要仅为一种架构进行构建,请从下拉菜单中选择相应的 BOF 构建配置并点击构建,如下图所示。 ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/3bf33fb3ab123347.png) 无论使用哪种方法构建 BOF,结果都是剥离了符号的 BOF,可直接用于 Cobalt Strike。 ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/22b23a693f123347.png) #### BOFs 与 COM 对象 有时,特别是在处理组件对象模型 (COM) 对象时,使用 C++ 比 C 更容易。该模板也支持这一点。只需将 Source.c 重命名为 Source.cpp 并编译即可。您将免受名称修饰的困扰,因为如果使用 C++,模板会自动添加 *extern “C”*。然而,不要对开发 C++ BOFs 抱有过高期望,因为 Cobalt Strike 尚未完全支持它。 #### 错误报告 该模板附带一个内置函数,以对操作人员有意义的方式打印错误。目的是为操作人员提供足够的信息,以便在不查阅源代码的情况下了解 BOF 失败的原因。下面的错误消息是 Cobalt Strike 控制台的截图,为操作人员提供了发生错误的以下信息: - 导致错误的函数名称:create\_folder - 行号:164 - 开发者描述:“failed to create directory” - WIN32 错误代码:123 ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/4de11d2ca4123348.png) #### 修改模板 不同的团队有不同的需求,因此该模板可能并不适合所有人。修改模板很容易。只需解压 zip 文件,对文件进行修改,然后再次压缩即可! ### 示例项目 为了展示如何使用此模板,我包含了两个示例 BOFs。第一个 BOF 是 @am0nsec AppLocker 枚举器的移植版本,它将有效的 AppLocker 策略作为 beacon 输出转储。第二个示例是严重依赖 COM 的计划任务持久化。 ### 后续工作 该模板是一个初始原型,还可以添加更多功能。例如,我的待办事项列表中的功能包括: - 添加通用的参数解析,可供 *main* 和 *go* 使用而无需修改 - 接受可变参数的内部打印功能 也非常欢迎提交 Pull requests 和提出想法! ### 致谢 - 非常感谢 [TrustedSec](https://www.trustedsec.com/) 团队和 [@FreeFirex](https://twitter.com/freefirex2) 在[这里](https://github.com/trustedsec/CS-Situational-Awareness-BOF)分享态势感知 BOFs 的代码。该模板很大程度上依赖于他们的工作。 - Paul ([@am0nsec](https://twitter.com/am0nsec)) 在[这里](https://ntamonsec.blogspot.com/2020/08/applocker-policy-enumeration-in-c.html)分享了他的代码和未记录 COM 对象的经验。 - Matthew ([@mattifestation](https://twitter.com/mattifestation)) 在[这里](https://www.powershellgallery.com/packages/PowerSploit/1.0.0.0/Content/PETools%5CGet-ObjDump.ps1)分享了他关于 PowerShell ObjDump 的工作。 ### 作者 该项目由 Yasser Alhazmi [@yas_o_h](https://twitter.com/Yas_o_h) / [Securify](https://www.securify.nl/en/) 创建和维护
标签:AI合规, Beacon Object Files, BOF, C++, Cobalt Strike, COFF, RFI远程文件包含, Visual Studio, Windows 安全, 中高交互蜜罐, 安全工具开发, 安全测试, 客户端加密, 客户端加密, 开发模板, 恶意软件开发, 攻击性安全, 攻击诱捕, 数据展示, 数据擦除, 欺骗防御, 端点可见性, 红队