Ghidra脚本系统提供了一个通过用户编写的脚本来自动化任务和扩展Ghidra功能的框架。它构建在OSGi(Open Service Gateway Initiative)框架之上,能够动态加载、编译和执行脚本。本文档涵盖了脚本系统本身的架构和实现,而不涉及脚本内部使用的API或如何编写脚本。
有关编写脚本和脚本API的信息,请参阅Ghidra关于脚本开发的文档。
脚本系统围绕OSGi框架构建,该框架提供了一个模块化且动态的组件系统。脚本被管理为可以在运行时动态加载、编译和执行的捆绑包。
来源
脚本系统将脚本目录视为OSGi捆绑包。这些捆绑包由BundleHost类管理,该类提供添加、删除、启用、禁用和激活捆绑包的方法。
来源
来源
执行脚本时,会发生以下顺序
来源
脚本可以用不同的语言编写,Java是主要的语言。每种语言都有一个扩展GhidraScriptProvider的相应提供程序
JavaScriptProvider尤其重要,因为它负责加载、编译和执行Java脚本。
来源
对于GhidraSourceBundle实例,编译过程在捆绑包激活时自动处理
编译使用标准的Java编译器API(javax.tools)并生成符合OSGi规范的捆绑包。
来源
脚本系统提供了几个用于管理和交互脚本的UI组件
来源
脚本系统管理脚本目录的方式如下
默认情况下,系统包含
$USER_HOME/ghidra_scripts来源
脚本系统通过HeadlessAnalyzer和GhidraScriptRunner支持无头(非GUI)执行
无头模式允许从命令行使用指定的参数执行脚本,而无需GUI。
来源
脚本可以使用@importpackage标签指定依赖项,该标签由OSGi框架解析
来源
BundleHost在脚本系统启动时初始化
来源
The BundleStatusComponentProvider 允许用户管理 bundle 状态,包括启用、禁用和刷新 bundle。
来源
Ghidra 脚本系统通过基于 OSGi 的脚本 bundle,为自动化和扩展提供了灵活且可扩展的框架。它支持交互式和无头执行模式,并提供丰富的脚本管理 UI 组件。该系统的架构支持脚本的动态加载、编译和执行,使其成为逆向工程工作流的强大工具。