Ruby,Kotlin,Groovy,Clojure和Jshell对Ghidra的支持。
查看“发行版”页面,以获取插件的最新版本。下载后,您可以通过转到File->Install Extensions... ,选择Add Extension选项,然后导航到下载的zip文件,然后将其安装在Ghidra中。提示您将重新启动Ghidra,以使新的扩展名活跃。
然后,您需要在使用插件之前激活该插件。下次打开CodeBrowser工具时,您可能会提示这样做,在这种情况下,您可以选择“确定”。否则,您可以通过打开CodeBrowser工具,转到File->Configure...并为Ruby选择Ruby的RubyDragon插件,Kotlindragon插件,kotlin的KotlinDragon插件, JShellDragon插件,用于Java Instrumer的Java Interver的jshelldragon插件以及用于Clojure的ClojureDragon插件。它们应该出现在Ghidra Core列表中,但是如果您找不到它们,则可以检查Configure All Plugins选项。
如果您需要删除语言插件,则可以通过在CodeBrowser工具中的“配置”对话框中取消选中框来进行操作。如果要整体上删除扩展名,则还需要在项目浏览器的Install Extensions菜单中取消选中它,最后重新启动Ghidra。您可能还需要手动从.ghidra/<ghidrainstall>/Extensions文件夹中删除该文件夹,以完全删除它,特别是如果您想通过Eclipse插件加载插件以进行开发。
启用Rubydragon插件后,您将能够通过转到Window->Ruby或单击工具栏中的Ruby图标,从CodeBrowser工具打开交互式Ruby会话。这是Jruby提供的IRB会话。
Java和Python脚本中提供的相同的环境变量以及几个附加功能也可以使用,如以下全局变量:
$current_address
$current_api
$current_data
$current_function
$current_highlight
$current_instruction
$current_location
$current_program
$current_selection $current_api变量是使用$current_program创建的FlatProgramAPI实例。这具有在GhidraScript实例中可用的许多(但不是全部)的(但不是全部)。
Ghidra提供的许多类可以自动导入到交互式终端中,因此您无需使用java_import语句来使用它们。如果要自定义此功能,则可以在安装中修饰auto-import.xml数据文件。要启用此功能(确实会影响启动时间),然后您可以在Ruby Dragon Interpreters类别中启用相关选项。使用相同的数据文件也针对所有其他语言完成。
您也可以用Ruby编写脚本,与Java或Python的方式几乎相同。 Ruby将作为新脚本类型可用,您可以在Examples.Ruby中看到几个示例脚本。脚本还具有附加的全局变量$script ,可为其提供对RubyScript实例的访问。
还提供了以相同方式使用的脚本中相同的全局变量。
您还可以在Ghidra Functionality->Scripting->Ruby Interpreter页面上的Ghidra帮助菜单(按F1 )中直接找到帮助。
如果您想在交互式解释器或脚本中安装宝石,则需要采取一些额外的步骤,具体取决于您希望GEM环境的隔离程度。
如果您使用RVM之类的东西来管理Ruby环境,那么您可以简单地依靠它来设置GEM_PATH环境变量以指向您的GEM安装。但是,为了获得最大的成功,您应该切换到Jruby安装,理想情况下,与Rubydragon中包装的版本相同,然后让RVM指向其中的GEMSET。
如果您希望Ghidra Gem设置为Ghidra,或者如果您在Ghidra以外没有红宝石环境可以指向的情况下,则可以自己选择一个位置,并设置GEM_PATH环境可变量以指向这一点。要在路径上安装新的宝石,请像这样从捆绑的jruby jar中调用gem的版本,根据需要更改版本和路径。在这里,宝石路径将设置为~/ghidra_gems
# from a shell environment
java -jar ~ /.ghidra/.ghidra_10.2_PUBLIC/Extensions/RubyDragon/lib/jruby-complete-9.3.9.0.jar -S gem install -i ~ /ghidra_gems wrapture REM from a windows command line
java -jar %USERPROFILE% .ghidra.ghidra_10.2_PUBLICExtensionsRubyDragonlibjruby-complete-9.3.9.0.jar -S gem install -i %USERPROFILE% ghidra_gems wrapture完成此操作后,您可以从脚本和交互式终端中需要wrapture宝石(或任何选择安装的东西)。
如果您不想在全局配置中创建环境变量,则需要弄乱用于启动Ghidra的脚本,以便设置GEM_PATH 。您可以通过在launch.bat或launch.sh中添加set命令来执行此操作(取决于您的操作系统)。对于Windows系统,您还需要从用于启动Ghidra的start命令中删除/I参数,以便将环境变量传递。
Kotlin的使用方式与Ruby Toolset几乎相同,并具有明显的差异,例如KotlinDragon插件提供,并从Window->Kotlin菜单选项到达。脚本的内置变量和Kotlin中的解释器窗口与Java相同:
currentAddress
currentAPI
currentData
currentFunction
currentHighlight
currentInstruction
currentLocation
currentProgram
currentSelection
Kotlin脚本使用kts扩展名,因为它们被解释为脚本,而不是首先将其编译到Java。
Groovy遵循与其他语言相同的模式,在GroovyDragon插件中提供,并可以从Window->Groovy菜单选项到达。它具有与其他人提供的相同内置变量:
currentAddress
currentAPI
currentData
currentFunction
currentHighlight
currentInstruction
currentLocation
currentProgram
currentSelection
Clojure遵循与其他语言相同的模式,在ClojureDragon插件和菜单项Window->Clojure中提供。
Clojure的解释器和脚本还具有绑定,使状态信息在ghidra命名空间内可用。他们是:
ghidra/current-address
ghidra/current-api
ghidra/current-data
ghidra/current-function
ghidra/current-highlight
ghidra/current-instruction
ghidra/current-location
ghidra/current-program
ghidra/current-selection ghidra/current-api作为用currentProgram创建的FlatProgramAPI的实例,就像其他解释器一样。 Ghidra类的自动导入也在ghidra名称空间中完成。
而且,与Ruby一样,在脚本中提供了ghidra/script绑定,该脚本可提供对基础ClojureScript实例的访问。但是,与Ruby不同,此变量不允许访问受保护的字段或私人方法。相反,这些也被注入ghidra名称空间。例如,要访问TaskMonitor脚本,您只需引用ghidra/monitor即可完成更新进度之类的事情。 Clojure Ghidra Basics脚本具有此类访问的示例。那些熟悉Python脚本界面的人可以识别此范式,因为那里的范例是一样的。
JSHELL插件提供了Jshell的交互式Java解释器,该解释器是Java中包含的Java Repl。它提供了与Java脚本中可用的变量相同的内置变量:
currentAddress
currentAPI
currentData
currentFunction
currentHighlight
currentInstruction
currentLocation
currentProgram
currentSelection
在编写Java脚本时,该解释器特别方便,因为它允许您从脚本中迭代测试代码段,而无需对Python或Kotlin(例如Python或Kotlin)进行任何类型的转换。
目前,最简单的贡献方法是发布任何建议或尝试一下,如果您有任何问题,请打开问题。前往问题列表加入讨论!
如果您喜欢冒险,可以在选择的语言中添加示例脚本。这可能等同于包装吉德拉(Ghidra)包装的脚本之一,也可能是全新的!只需确保您在GitHub Action Workflow中添加测试,以便以后不会打破。查看ghidra_scripts文件夹以查看现在的内容,也许会在您可以添加的内容上汲取一些灵感。
或者,如果所有这些都有点多,请在Twitter上在Twitter上向我们大喊大叫!