AlphaGolang
作者:Juan Andres Guerrero-Saade (JAG-S @ SentinelLabs)
描述:
AlphaGolang 是一组 IDAPython 脚本,旨在帮助恶意软件逆向工程师掌握 Go 二进制文件。其理念是将脚本拆分为具体的步骤,从而避免脆弱的单体脚本,并模拟分析人员在处理 Go 二进制文件时可能遵循的方法。
脚本根据 GPL 许可发布(感谢 Tim Strazzere 的原始 GolangLoaderAssist,我们对其进行了重构并更新为 Python3,向 Tim 致敬 :))。欢迎并鼓励贡献!
要求:IDA Pro(理想版本 v7.6+)和 Python3(嗯)
前两步(recreate_pclntab 和 function_discovery_and_renaming)可在 IDA v7.5- 上运行,但之后的脚本需要 IDAv7.6+。较新的版本是后续脚本的理想目标。
原始参考: Mandiant 网络安全防御峰会 2021 演讲(视频待发布)
AlphaGolang 分析方法论
-
步骤 0:用于识别 Go 二进制文件的 YARA 规则(PE/ELF/MachO)
- identify_go_binaries.yara
- 简单的头部检查 + Go 构建 ID 字符串的正则表达式。
- 或许可以改进构建 ID 长度范围。
-
步骤 1:重建 pcln 表
- recreate_pclntab.py(兼容 IDA v7.5-)
- 通过启发式方法重建 gopclntab 段
- 主要用于 IDA v7.5-
-
步骤 2:遍历 pcln 表发现函数,并为所有函数添加名称
- function_renaming.py(兼容 IDA v7.5-)
- 从 golang loader assist 中拆分而来
- 基于 pcln 表暴力发现缺失的函数
- 修复了 Python3 迁移过程中一些函数名称清理问题
- 根据 Akamai 的 Panchan!进行了重构,增加了对 Go v1.18 的改进。感谢 Alex(CycleOfTheAbsurd)。
-
步骤 3:筛选用户生成的函数
- categorize_go_folders.py(需要 IDA v7.6+)
- 自动将函数分类到文件夹中
- 需要 IDAv7.6+,并在函数视图中启用“显示文件夹”
- 更新于 2022-05-16:修复了与 IDA v7.7 文件夹排序的冲突
- 强烈建议在运行此插件之前恢复来自 Lumina 的元数据。
-
步骤 4:修复字符串引用
- fix_string_cast.py
- 从 golang loader assist 中拆分而来
- 添加了在定义新字符串之前取消定义已有字符串块的逻辑
- 新的健全性检查使其更加有效
-
步骤 5:提取类型信息(作者:Ivan Kwiatkowski)
- extract_types.py
- 注释所有对
newobject、makechan 等调用的参数
- 为这些对象应用正确的 C 类型并重命名
- 获取人类可读的名称并将其添加为注释
待修复及可贡献的空间:
- fix_string_cast.py
- 仍需重构 + 更好的字符串加载启发式方法
- 在大型二进制文件中可能导致锁定。
- 缺少某些间接字符串加载机制。
- extract_types.py
- 目前通过查找硬编码的
.rdata 或 __rodata 段名,适用于 PE 和 Mach-O 文件。
- 需要正确的检查/实现来处理变长编码的大小
后续步骤:
- 跟踪用户生成函数的字符串引用
- 基于用户生成函数自动生成 YARA 签名
- 生成用户生成函数的 Hex-Rays 伪代码输出
- 自动设置断点以进行动态参数分析
- ???
致谢:
- Tim Strazzere 发布了原始的 golang_loader_assist
- Milan Bohacek(Avast Software s.r.o.)在搞懂 idatree API 方面给予了宝贵帮助。
- Joakim Kennedy(Intezer)
- Ivan Kwiatkowski(Kaspersky GReAT)提供了步骤 5。
- Igor Kuznetsov(Kaspersky GReAT)
- Alex(又名 CycleOfTheAbsurd),来自 ESET,为 Go v1.18 支持重构了步骤 2。