airbus-cert/comida
GitHub: airbus-cert/comida
ComIDA 是一款 IDA Pro 插件,通过自动追踪 COM GUID 引用并推断接口类型,帮助逆向分析师高效分析使用 COM 组件的二进制模块。
Stars: 232 | Forks: 29
# ComIDA
一个 IDA 插件,可在分析使用 COM 的模块时提供帮助。它的工作原理是搜索对已知 COM GUID(类或接口)的数据引用,
对于 Hex-Ray 插件用户,还能推断出使用以下函数/方法的类型:
* `CoCreateInstance` 函数
* `CoGetCallContext` 函数
* `QueryInterface` 方法
使用前:

使用后:

## 如何安装?
只需将 `comida.py` 脚本放入 IDA 的 `plugins` 文件夹中即可。
```
git clone git@github.com:Airbus-CERT/comida.git
mklink "C:\\Program Files\\IDA Pro 7.4\\plugins\\comida.py" "comida\comida.py"
```
启动 IDA 并按下 `Ctrl-Shift-M` 即可激活它。
## 它是如何工作的?
### COM 对象引用
`ComIDA` 有两个主要功能:
* 查找和跟踪 GUID
* 为 Hex-Ray 插件用户推断类型
为了查找和跟踪 GUID,我们只需搜索直接的操作数指令,例如 `mov ax, GUID`,其中 GUID 与 `HKCR\Classes` 或 `HKCR\Interfaces` 注册表配置单元中存在的相匹配。
我们在表格中预览结果,以便交互并轻松浏览所有 COM 对象引用。

双击即可跳转到感兴趣的代码处。
### 类型推断
主要目标是方便分析师的工作。当一个模块使用 COM 服务时,通常会用到:
* 使用 `CoCreateInstance` 创建实例
* 使用 `CoGetCallContext` 获取实例
* 使用 `IUnknown` 接口的 `QueryInterface` 方法转换接口,所有 COM 类都继承自该接口
comIDA 将针对这些模式执行类型推断。
在 comIDA 中,推断的工作流程如下:
1. 查找感兴趣的函数
2. 读取 GUID 参数并获取接口类型
3. 更改变量的输出类型
为了查找感兴趣的函数,我们针对每种类型使用了两种启发式方法:
- 对于函数类型,如 `CoCreateInstance` 或 `CoGetCallContext`,我们直接在导入表中搜索。
- 对于方法类型,如 `QueryInterface`,我们利用 Hex-Rays AST 来计算方法名称。
之后,我们使用 Hex-Ray 钩子在反编译阶段遍历函数的 AST。当我们发现对感兴趣方法的调用时,我们会根据 GUID 参数(接口的 GUID)对输出参数进行类型更改。
为了选择正确的类型,我们使用两种启发式方法来挑选类型:
* 我们检查注册表配置单元 `HKCR\\Interfaces` 中与接口 GUID 关联的名称
* 我们尝试直接将其转换为与第三个参数关联的符号名称(通常命名为 `IID_IWbemLocator` 等……我们只取 IWbemLocator)
接下来就是见证奇迹的时刻:
使用前:

使用后:

使用前:

使用后:

标签:COM组件, DAST, IDA插件, 云资产清单, 恶意软件分析, 类型推断, 逆向工具, 逆向工程