坑边闲话: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 都是跨平台的,可以部署到不同的操作系统。

什么是 JNI

JNI(Java Native Interface) 是 Java 平台的一个标准,它允许 Java 代码与其他语言编写的应用程序或库(通常是 C 或 C++)进行交互。JNI 的存在使得 Java 程序能够调用或被其他原生应用程序调用,为 Java 提供了一个桥梁来接触和利用那些非 Java 语言编写的代码和库。

JNI 的主要功能和用途

  1. 调用本地方法:JNI 允许 Java 程序调用 C 或 C++ 等语言编写的函数。这对于使用已经存在的库非常有用,尤其是在性能敏感或依赖特定硬件和操作系统功能的应用程序中。
  2. 被本地应用调用:JNI 同样允许原生应用程序调用 Java 程序中的方法。这样,已有的本地应用可以利用 Java 的平台独立性和丰富的库支持。
  3. 性能优化:在某些情况下,由于 Java 的运行时环境和垃圾收集机制,某些性能敏感的操作可能不如直接用 C 或 C++ 编写的代码高效。JNI 提供了一种方法,使得可以用更适合这些任务的语言来实现它们。

综上,Ghidrathon 使用本地的 CPython 解释器处理 Python 3 代码、调用第三方 Python 库;Ghidrathon 并非将 Python 3 翻译为 Python 2 的方式与 Ghidra 交互,而是通过 Jep 直接与 JVM 进行通信,进而可以获取、操控 Ghidra 内部类的状态。换言之,Ghidrathon 和 Ghidra 内置的 Jython 具有同等地位。

1.2 安装 Ghidrathon·

在 Ghidrathon 的 GitHub 主页,下载最新的 Release 版本,按照要求安装即可。

  1. 解压安装包,得到
  • Ghidrathon-v4.0.0.zip:插件主体,需要在 Ghidra 的插件管理器中导入;
  • requirements.txt:依赖的 Python 组件,一般里面只有一行内容:jep==4.2.0.
  1. 创建一个新的 Python 虚拟环境,比如使用 conda
  • conda create --name ghidrathon python=3.8
  • 随后切换到该虚拟环境:conda activate ghidrathon
  1. 安装依赖:
  • 在 Ghidrathon 安装包的解压目录,执行 python -m pip install -r requirements.txt 安装所需依赖;
  • 安装帮助文件:python ghidrathon_configure.py ${GHIDRA_ABSOLUTE_PATH}
  1. 安装插件,如下图所示。完成下图步骤,重启 Ghidra 并按照引导配置插件即可。

图 1. 在 Ghidra 启动后的工程界面的 File 菜单,点击 Install Extensions

图 2. 点击绿色加号按钮,在文件选取器中选择 ghidrathon 压缩包。提示:选取的是解压之后的另一个压缩包,该 zip 文件保留原样即可,无需手动解压。

提示

ghidrathon_configure.py 实际上是在 Ghidra 文件夹里创建了一个名为 ghidrathon.save 的文件,该文件是 JSON 格式,内容如下:

1
2
3
4
5
6
7
8
9
{
"executable": "/Users/newton/bin/miniconda3/envs/ghidrathon/bin/python",
"home": "/Users/newton/bin/miniconda3/envs/ghidrathon"
}

其中:

- `executable` 关键字指示 Python 环境(虚拟环境)中 Python 解释器的绝对路径;
- `home` 关键字指示 Ghidrathon 虚拟环境的绝对路径。

2. 使用 Python 控制 Ghidra·

2.1 脚本的头部规范·

2.2 在 VSCode 里实现自动补全·

Python 可编程对象·