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·
2.1 脚本的头部规范·
2.2 在 VSCode 里实现自动补全·
Python 可编程对象·
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Peng Liu's blog!
评论