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 记录了进程的完整执行过程,并暴露了大量可用于分析的信息。

借助此工具,逆向工程师只需凭借一份 TTD 追踪记录、一个工具和一个愿景,就能从二进制文件中获取多得多的信息。
以加壳的 CobaltStrike beacon 为例(见上方截图)。如果仅进行静态 CAPA 扫描,可能只能观察到很少的内容(截图左侧)。
你甚至可能看出所使用的加壳器类型(例如 UPX)。然而,对于加壳后可执行代码的实际功能,却几乎无法得出什么结论。
这正是 ttd-capa 的闪光之处。一旦记录了 TTD 追踪,ttd-capa 就可以扫描整个追踪记录,并识别出仅在运行期间才会暴露的功能(截图右侧)。

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
标签:C++, DAST, 云资产清单, 恶意软件分析, 数据擦除, 时序调试, 逆向工具, 逆向工程