菜单

创建扩展

相关源文件

本文档提供了创建、开发和分发Ghidra扩展的全面指南。Ghidra扩展允许开发人员通过创建可插入模块来扩展Ghidra的功能,这些模块可以与现有框架无缝集成。有关从源代码构建Ghidra本身的信息,请参阅构建Ghidra

理解Ghidra扩展

Ghidra扩展是独立的模块,通过插件架构扩展Ghidra的功能。它们被打包成zip文件,其中包含编译的代码、资源和元数据,可以安装到任何兼容的Ghidra安装中。

来源:gradle/support/extensionCommon.gradle18-129 DevGuide.md20-29

扩展类型

Ghidra支持多种类型的扩展,每种类型都有不同的用途

扩展类型描述主要类
分析器 (Analyzer)扩展Ghidra的分析能力AnalyzerBase 或 AbstractAnalyzer
插件扩展Ghidra用户界面Plugin 或 PluginTool
加载器加载/导入二进制文件格式加载器
文件系统 (FileSystem)打开文件系统格式以供浏览或批量导入GFileSystem
导出器 (Exporter)将Ghidra程序导出/保存为特定文件格式导出器 (Exporter)
处理器启用处理器/架构的汇编/反编译Sleigh文件和处理器模块

来源:GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/src/main/java/ghidradev/ghidraprojectcreator/utils/GhidraModuleUtils.java40-64

开发环境设置

所需工具

开发Ghidra扩展需要

  1. JDK 21 - Ghidra 11.x 及更高版本需要
  2. Eclipse IDE - 推荐用于开发
  3. GhidraDev Eclipse 插件 - 用于创建和调试Ghidra扩展
  4. Gradle - 用于构建和打包扩展

设置GhidraDev的Eclipse

  1. 安装Eclipse(推荐使用2023-12 4.30或更高版本以获取最新的GhidraDev)
  2. 通过以下任一方式安装GhidraDev插件
    • 通过Ghidra:Help → Install Extensions → Development → GhidraDev Eclipse Plugin
    • 手动安装:从Ghidra的Extensions/Eclipse/GhidraDev目录中解压GhidraDev,并按照安装说明进行操作

来源:GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/README.md40-78 README.md28-45

创建扩展项目

使用Eclipse和GhidraDev

  1. 打开已安装GhidraDev的Eclipse
  2. 转到 File → New → Project...
  3. 选择 Ghidra → Ghidra Module Project,然后点击 Next
  4. 配置您的项目
    • 输入项目名称
    • 选择项目的目录
    • 选择Ghidra安装
    • 选择您需要的扩展模板
  5. 点击 Finish 创建项目

来源:GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/src/main/java/ghidradev/ghidraprojectcreator/utils/GhidraModuleUtils.java91-116

项目结构

一个典型的Ghidra扩展项目具有以下结构

ExtensionName/
├── src/
│   ├── main/
│   │   ├── java/           # Java source code
│   │   ├── resources/      # Resources used by the extension
│   │   └── help/           # Help documentation
│   └── test/
│       └── java/           # Test code
├── ghidra_scripts/         # Ghidra scripts
├── data/                   # Data files
├── Module.manifest         # Module manifest
├── extension.properties    # Extension properties
├── README.md               # Documentation
└── build.gradle           # Gradle build file

每个目录都有特定用途

  • src/main/java: 包含扩展的Java源代码
  • src/main/resources: 包含资源,如图标和属性文件
  • src/main/help: 包含帮助文档
  • ghidra_scripts: 包含Python或Java脚本
  • data: 包含扩展使用的数据文件

来源:GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/src/main/java/ghidradev/ghidraprojectcreator/utils/GhidraModuleUtils.java107-114

开发扩展

基本组件

每个扩展都需要

  1. Module.manifest - 定义模块及其属性
  2. extension.properties - 包含扩展的元数据,包括版本
  3. 实现扩展功能的Java类

示例:创建一个基本的分析器扩展

分析器扩展执行程序分析。这是基本结构

添加Python支持

Ghidra扩展可以包含Python包来扩展功能

  1. 将Python文件添加到src/main/py目录
  2. 在您的build.gradle文件中配置Python包构建
  1. 创建必要的Python包文件(__init__.pysetup.py等)

来源:gradle/hasPythonPackage.gradle16-103 Ghidra/Features/PyGhidra/build.gradle16-111

构建和打包扩展

使用Gradle

Ghidra扩展使用Gradle构建和打包。主要任务是zipExtensions,它会创建一个zip文件,其中包含所有扩展组件。

构建您的扩展

  1. 从命令行,导航到您的扩展项目目录
  2. 运行gradle zipExtensions
  3. 扩展zip文件将在build/dist目录中创建

来源:gradle/support/extensionCommon.gradle18-142

扩展配置

extension.properties文件定义了扩展的关键元数据

请注意,@extversion@是一个令牌,在构建过程中会被替换为实际的Ghidra版本。

来源:gradle/support/extensionCommon.gradle38-43

安装和分发扩展

手动安装

安装扩展

  1. 启动Ghidra
  2. 选择 File → Install Extensions...
  3. 点击 "+" 按钮
  4. 导航到并选择您的扩展zip文件
  5. 根据提示重启Ghidra

程序化安装

扩展也可以通过以下方式进行程序化安装

  1. 将扩展zip文件复制到Ghidra安装的extensions目录
  2. 将扩展提取到Ghidra/Extensions目录

发行版

您可以分发您的扩展

  • 通过网站或代码仓库
  • 如果您的扩展是公开的,可以通过Ghidra扩展页面分发
  • 通过内部渠道在组织内部分发

来源:GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/src/main/java/ghidradev/ghidraprojectcreator/wizards/ExportGhidraModuleWizard.java

最佳实践和技巧

开发指南

  1. 遵循Ghidra编码约定

    • 使用适当的命名约定
    • 彻底记录您的代码
    • 遵循API使用模式
  2. 测试

    • 在不同Ghidra版本上测试您的扩展
    • 在您打算支持的所有平台上进行测试
    • 包含核心功能的单元测试
  3. 版本控制

    • 保持您的扩展与目标Ghidra版本兼容
    • 清晰记录兼容性要求

常见陷阱

  1. 依赖管理

    • 外部库必须包含在您的扩展中
    • 注意与Ghidra中包含的库的冲突
  2. 资源处理

    • 使用正确的资源加载机制
    • 考虑文件路径的平台差异
  3. 多线程

    • 使用Ghidra的任务框架处理长时间运行的操作
    • 注意从后台线程访问UI

来源:DevGuide.md17-29 gradle/support/ip.gradle

高级主题

扩展中的原生代码

如果您的扩展需要原生代码

  1. 在适当的目录结构中创建原生源代码
  2. 配置您的build.gradle以包含原生构建
  3. 确保为所有目标平台进行构建

扩展生命周期管理

扩展应正确处理其生命周期

  1. 初始化 - 扩展首次加载时
  2. 激活 - 当扩展被用户激活时
  3. 去激活 - 当扩展被去激活时
  4. 销毁 - Ghidra关闭时

对于插件,实现Plugin接口中适当的方法

来源:Ghidra/Features/PDB/build.gradle16-47 Ghidra/Features/PDB/buildNatives.gradle

跨扩展通信

扩展之间可以通过以下方式进行通信

  1. 服务 - 注册和消费服务
  2. 事件 - 发布和订阅事件
  3. 扩展点 - 在您的扩展中定义可扩展点

这允许构建一个模块化的扩展生态系统,使它们协同工作。

来源:GhidraBuild/EclipsePlugins/GhidraDev/GhidraDevPlugin/src/main/java/ghidradev/ghidraprojectcreator/utils/GhidraProjectUtils.java

结论

创建Ghidra扩展提供了一种强大的方式来增强Ghidra的功能并与社区共享功能。通过遵循本文档中的指南,您可以创建、构建和分发与Ghidra无缝集成的扩展。

请记住

  • 为您的需求选择正确的扩展类型
  • 正确设置您的开发环境
  • 遵循Ghidra的开发模式
  • 跨平台和Ghidra版本进行彻底测试
  • 为用户记录您的扩展

有关特定扩展类型或高级主题的更详细信息,请参阅Ghidra API文档和Ghidra随附的开发者指南。