HullaBrian/ttd-capa

GitHub: HullaBrian/ttd-capa

ttd-capa 是一个兼容 CAPA 的功能提取器,通过分析时间旅行调试(TTD)追踪记录来识别加壳等复杂样本在运行期间才会暴露的实际功能。

Stars: 0 | Forks: 0

# 概述 ttd-capa 是一个兼容 [CAPA](https://github.com/mandiant/capa) 的功能提取器,专为时间旅行调试(TTD)追踪记录而构建。 TTD 记录了进程的完整执行过程,并暴露了大量可用于分析的信息。 ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/9c05bcf419092724.png) 借助此工具,逆向工程师只需凭借一份 TTD 追踪记录、一个工具和一个愿景,就能从二进制文件中获取多得多的信息。 以加壳的 CobaltStrike beacon 为例(见上方截图)。如果仅进行静态 CAPA 扫描,可能只能观察到很少的内容(截图左侧)。 你甚至可能看出所使用的加壳器类型(例如 UPX)。然而,对于加壳后可执行代码的实际功能,却几乎无法得出什么结论。 这正是 ttd-capa 的闪光之处。一旦记录了 TTD 追踪,ttd-capa 就可以扫描整个追踪记录,并识别出仅在运行期间才会暴露的功能(截图右侧)。 ![](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/3e58fad6e8092730.png) ttd-capa 不是一个独立的工具。相反,它旨在与 CAPA 工具协同运行,从而提取对 CAPA 规则匹配有用的信息。 常规的功能提取流程如下: 1. 记录给定样本的 TTD 追踪 2. 在追踪记录上运行 ttd-capa,生成兼容 CAPA 的 JSON 报告 3. 在报告上运行 CAPA,使用现有的 CAPA 规则提取功能信息 # 工作原理 ttd-capa 使用官方的 Microsoft TTD C++ SDK 与 TTD 进行交互,并使用 [nlohmann/json](https://github.com/nlohmann/json) 来处理 JSON。 ttd-capa 首先会收集一系列模块加载事件并逐一进行导航。一旦定位到目标,它将直接从 TTD 追踪中提取导出函数, 并存储它们关联的虚拟地址、函数名和模块名。接下来,ttd-capa 会向 TTD 引擎注册一个调用回调函数,并遍历整个 追踪记录。每次发生调用时,ttd-capa 都会检查调用目标是否存储在模块导出映射中。如果是,它将记录该调用以及 关联的模块、函数名、参数和返回值。此外,ttd-capa 还会自动尝试将函数参数解析为字符串, 这有可能在恶意软件分析中显著提升分析效率。 # 前置条件 - Windows - Microsoft C++ Build Tools v145 - TTD DLL(`TTDReplay.dll` 和 `TTDReplayCPU.dll`) - Python 3.10+(用于 CAPA) # 构建 ttd-capa 1. 在 Visual Studio 中打开 `ttd/ttdcapa-extract.sln` 2. 确保已安装所需的 nuget 包(`Microsoft.TimeTravelDebugging.Apis` 和 `nlohmann.json`) 3. 将构建模式设置为 `x64` 和 `Release` 4. 导航到 `Build > Build Solution` 开始构建 构建完成后,如果 Microsoft 的 `TTDReplay.dll` 和 `TTDReplayCPU.dll` 不与 `ttdcapa-extract.exe` 在同一目录下,ttd-capa 将无法正常运行。 要获取这些 DLL,请确保你已经安装了 WinDbg。然后,运行以下 PowerShell 命令查找系统上 DLL 的位置: ``` Join-Path (Get-AppxPackage Microsoft.WinDbg).InstallLocation 'amd64\ttd' ``` 然后,将 `TTDReplay.dll` 和 `TTDReplayCPU.dll` 复制到与 `ttdcapa-extract.exe` 相同的目录中。 # (临时)安装兼容 TTD 的 CAPA 我正在向 CAPA 主代码库提交 PR,希望 CAPA 最终能原生支持 TTD 追踪记录。在此期间,你可以安装一个自定义的 CAPA 分支。首先,克隆 [https://github.com/HullaBrian/capa](https://github.com/HullaBrian/capa) 克隆代码库后,创建一个 Python 虚拟环境,并安装 CAPA: ``` cd capa python -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -e . ``` 功能规则是由 CAPA 团队维护的独立代码库。请克隆与(临时)分支版本相匹配的规则发布版本(应为 9.4.0):[https://github.com/mandiant/capa-rules/archive/refs/tags/v9.4.0.zip](https://github.com/mandiant/capa-rules/archive/refs/tags/v9.4.0.zip) # 用法 ## Python 包装脚本 本代码库中包含 `ttd-capa.py`,这是一个包装脚本,它抽象掉了部分“底层管道”工作,并将提取特征和执行规则匹配简化为单一步骤。 ``` python ttd-capa.py [--sample sample.exe] [-- ] ``` 该包装器运行提取器生成一个临时报告(使用后删除),然后调用 `capa -f ttd`。在独立的 `--` 之后的任何内容都会被转发给 CAPA: ``` python ttd-capa.py --sample sample.exe -- -vv ``` 有用的标志: - `--extractor ` - 指定 ttd-capa 提取器可执行文件的路径 - `--max-calls N` - 将庞大的追踪记录限制在特定的调用数量 - `--with-stack-args` - 捕获堆栈中函数调用的参数(捕获超过 5 个以上的函数调用参数) - `--keep-json` - 在 Python 脚本运行后保留生成的 JSON 报告 ## 手动操作 要在不使用 Python 包装脚本的情况下手动提取功能特征: ``` # 从 trace 生成 report --sample -o # 针对 report 运行 capa python -m capa.main -f ttd -r ``` # 时间线生成 ttd-capa 暴露了 TTD 时间戳,这意味着我们不仅能获取 样本整个执行过程中的功能,还能知道它们被调用时的顺序和时间。 请参阅以下由 `ttd-timeline.py` 在 UPX 加壳的 CobaltStrike beacon 的 JSON 报告上生成的时间线示例。在时间线中, 清晰地定义了已执行功能的顺序,以及关联的函数参数。这可以在 初步分类排查工作中提供极大的便利。 ``` TTD POS TID CAPABILITY NAMESPACE TRIGGERING CALL -------------------------------------------------------------------------------------------------------------- ... 38DF:F52 4 create HTTP request communication/http/client wininet.InternetOpenA('Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt; DTS Agent', 0x0, 0x0, 0x0, 0x0, 0x19b5040, 0xcdbc90, '/jquery-3.3.1.min.js') -> 0xcc0004 38E5:6DA 4 connect to HTTP server communication/http/client wininet.InternetConnectA(0xcc0004, '192.168.81.129', 0x50, 0x0, 0x0, 0x3, 0x0, 0x11584c4) -> 0xcc0008 ... ``` `ttd-timeline.py` 允许你选择在最终的时间线视图中显示执行的功能,或是显示追踪记录中观察到的所有 API 调用。 仅查看追踪记录中已执行的功能: ``` python ttd-timeline.py -r ``` 查看追踪记录期间观察到的所有 API 调用: ``` python ttd-timeline.py --calls ``` # 局限性 - 目前仅支持 x64 追踪记录(不支持 x86 或 ARM) - 参数捕获是基于启发式算法的,因此可能会出现错误 - JSON 报告中只会记录已加载模块直接导出的函数 # 独立验证后端 `tests/test_ttd_extractor.py` 会加载报告并按作用域转储所有特征 - 这有助于确认预期的 `API`/`Number`/`String` 特征: ``` python tests\test_ttd_extractor.py [report.ttd.json] ``` 如果不带参数,它将使用内置的 `tests/sample.ttd.json` 测试夹具。
标签:C++, DAST, 云资产清单, 恶意软件分析, 数据擦除, 时序调试, 逆向工具, 逆向工程