菜单

脚本系统

相关源文件

目的与范围

Ghidra脚本系统提供了一个通过用户编写的脚本来自动化任务和扩展Ghidra功能的框架。它构建在OSGi(Open Service Gateway Initiative)框架之上,能够动态加载、编译和执行脚本。本文档涵盖了脚本系统本身的架构和实现,而不涉及脚本内部使用的API或如何编写脚本。

有关编写脚本和脚本API的信息,请参阅Ghidra关于脚本开发的文档。

架构概述

脚本系统围绕OSGi框架构建,该框架提供了一个模块化且动态的组件系统。脚本被管理为可以在运行时动态加载、编译和执行的捆绑包。

核心组件图

来源

关键类

  1. BundleHost:OSGi框架和脚本捆绑包的中心管理器
  2. ScriptList:维护可用脚本文件的列表
  3. GhidraScriptInfoManager:管理脚本的元数据
  4. GhidraScriptComponentProvider:脚本管理的主要UI组件
  5. JavaScriptProvider:处理基于Java的脚本(主要脚本类型)

包管理

脚本系统将脚本目录视为OSGi捆绑包。这些捆绑包由BundleHost类管理,该类提供添加、删除、启用、禁用和激活捆绑包的方法。

捆绑包类型

  • GhidraSourceBundle:表示一个在需要时编译的Java源文件目录
  • GhidraJarBundle:表示一个预编译的JAR文件捆绑包
  • GhidraPlaceholderBundle:用于无法加载的捆绑包(例如,文件丢失)

来源

Bundle生命周期

来源

脚本执行流程

执行脚本时,会发生以下顺序

来源

脚本提供程序

脚本可以用不同的语言编写,Java是主要的语言。每种语言都有一个扩展GhidraScriptProvider的相应提供程序

JavaScriptProvider尤其重要,因为它负责加载、编译和执行Java脚本。

来源

源捆绑包编译

对于GhidraSourceBundle实例,编译过程在捆绑包激活时自动处理

编译使用标准的Java编译器API(javax.tools)并生成符合OSGi规范的捆绑包。

来源

用户界面组件

脚本系统提供了几个用于管理和交互脚本的UI组件

来源

脚本目录管理

脚本系统管理脚本目录的方式如下

默认情况下,系统包含

  1. 用户脚本目录: $USER_HOME/ghidra_scripts
  2. Ghidra安装目录内的系统脚本目录

来源

无头脚本执行

脚本系统通过HeadlessAnalyzerGhidraScriptRunner支持无头(非GUI)执行

无头模式允许从命令行使用指定的参数执行脚本,而无需GUI。

来源

脚本依赖

脚本可以使用@importpackage标签指定依赖项,该标签由OSGi框架解析

来源

BundleHost初始化

BundleHost在脚本系统启动时初始化

来源

Bundle 状态管理

The BundleStatusComponentProvider 允许用户管理 bundle 状态,包括启用、禁用和刷新 bundle。

来源

结论

Ghidra 脚本系统通过基于 OSGi 的脚本 bundle,为自动化和扩展提供了灵活且可扩展的框架。它支持交互式和无头执行模式,并提供丰富的脚本管理 UI 组件。该系统的架构支持脚本的动态加载、编译和执行,使其成为逆向工程工作流的强大工具。