Ghidra 逆向 p2:使用 Python 编程
坑边闲话:Ghidra 使用 Java 进行开发,因此核心运行时是 JVM. 与 JVM 沟通的最简单方法自然是用 Java 语言,但用 Java 写插件、脚本的代价太高,因此 Ghidra 内置了 Jython(类似于 CPython 2,是一种 Python 2 的 Java 实现),支持使用 Python 2 语法开发脚本。Python 程序通常比等价语义的 Java 程序短很多,大概只有 Java 的五分之一到十分之一长度。不幸的是,Jython 目前仅支持到 Python 2.7 标准。
1. Ghidrathon:Ghidra 的 Python 3 框架·
继续使用 Python 2 语法开发插件是不明智的,本章介绍 Ghidra 扩展:Ghidrathon.
1.1 Ghidrathon 框架简介·
Ghidrathon 基于 Jep 进行开发。Jep 通过 JNI 将 CPython 嵌入到 Java 中。
在 JVM 中嵌入 CPython 3 的一些好处:
- 解释器更加专业成熟:相比较 Jython,使用本机 Python 3 解释器快得多。Python 3 已经成熟、得到良好支持并且有详尽的文档。
- Python 3:访问高质量的 Python 模块,包括原生 CPython 扩展和基于 Python 的模块。
- Python 是一种解释型语言,可以对现有的 Java 代码进行脚本编写而无需重新编译。
- Java 和 Python 都是跨平台的,可以部署到不同的操作系统。
综上,Ghidrathon 使用本地的 CPython 解释器处理 Python 3 代码、调用第三方 Python 库;Ghidrathon 并非将 Python 3 翻译为 Python 2 的方式与 Ghidra 交互,而是通过 Jep 直接与 JVM 进行通信,进而可以获取、操控 Ghidra 内部类的状态。换言之,Ghidrathon 和 Ghidra 内置的 Jython 具有同等地位。
1.2 安装 Ghidrathon·
在 Ghidrathon 的 GitHub 主页,下载最新的 Release 版本,按照要求安装即可。
- 解压安装包,得到
Ghidrathon-v4.0.0.zip
:插件主体,需要在 Ghidra 的插件管理器中导入;requirements.txt
:依赖的 Python 组件,一般里面只有一行内容:jep==4.2.0
.
- 创建一个新的 Python 虚拟环境,比如使用
conda
:
conda create --name ghidrathon python=3.8
- 随后切换到该虚拟环境:
conda activate ghidrathon
- 安装依赖:
- 在 Ghidrathon 安装包的解压目录,执行
python -m pip install -r requirements.txt
安装所需依赖; - 安装帮助文件:
python ghidrathon_configure.py ${GHIDRA_ABSOLUTE_PATH}
- 安装插件,如下图所示。完成下图步骤,重启 Ghidra 并按照引导配置插件即可。
2. 使用 Python 控制 Ghidra·
使用 Python 控制 Ghidra,主要目的是实现自动化过程。笔者曾经使用 Ghidra 实现过如下功能:
- 批量导入 ARM 固件到 Ghidra Project,并对每一个 bin 进行自动化分析。其中涉及到如下流程:
- 创建库;
- 按照树结构导入 bin 文件,并设置 memory 段的权限,比如我们导入的是 text 段,就要设置为不可写但是可读可执行;
- 对每个被分析对象,调用自动化分析 profile 并施加分析。
- 使用 Function ID 功能,搜索固件中的特殊 function signature,并返回其地址
- 自动生成 Function ID 集合;
- 自动调用 Function ID 集合;
2.1 在 VSCode 里实现自动补全·
目前 Ghidrathon 编程框架没办法实现 VSCode 自动补全。使用 Java with Eclipse 可以获得受官方支持的 Ghidra 插件开发工具链,调试、代码高亮、自动补全会更加合适。
总结·
本文简要介绍了 Ghidrathon 框架,用户在使用 Python3 进行编程时可以考虑。然而,如果要开发重量级的插件,建议使用 Java,毕竟 Ghidra 就使用 Java 写的,导入 Jar 包自然也是非常合适。后期笔者已经全面换装 Java,本文只是留个记录。