Skip to content

OpenRakis/spice86-ghidra-plugin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Spice86 Ghidra Plugin

What it is

  • Imports Spice86 data into Ghidra
  • Generates C# code from the imported data

Everything is under the new menu Spice86 that you will get after installing the plugin

Requirement

  • Java 17
  • Ghidra (of course!)

Building the plugin

Prerequisites:

  • Create an environment variable pointing to you ghidra local install called GHIDRA_INSTALL_DIR. Example: GHIDRA_INSTALL_DIR=/home/kevin/ghidra_10.1.2_PUBLIC
  • Install JDK 17
  • Install Gradle 7.5 or above

Run the following command in a terminal of your choice.

gradle buildExtension

Upon completion the output will be located in the dist folder.

Sometimes ghidra doesn't like a plugin being redeployed over and over. When you do changes, you can alternatively just redeploy the jar to the correct folder. Here is what I added to my .zshrc to do it:

export GHIDRA_VERSION="10.1.5_PUBLIC"
alias deployghidra='unzip -f dist/ghidra_${GHIDRA_VERSION}_`date +"%Y%m%d"`_spice86-ghidra-plugin.zip -d dist && cp dist/spice86-ghidra-plugin/lib/* ~/.ghidra/.ghidra_${GHIDRA_VERSION}/Extensions/spice86-ghidra-plugin/lib'

Then once build is done simply type deployghidra

Testing the plugin

The script in ci/testRunner can be used locally to test new builds of the plugin.

It works by running various binaries in emulated and generated mode:

  • Spice86 vanilla is run for each binary, and run data are collected
  • The plugin is called with the run data to generate code
  • Generated code is built and run, run data are collected
  • Emulated and geneated code ram are compared, if there is any difference the script stops.

Before you run it you need:

  • Spice86 compiled somewhere
  • Ghidra installed
  • The plugin installed in Ghidra (Until I figure out how to do a headless plugin install :) )
  • The spice86 cpu tests somewhere

Example run:

./ci/testRunner \
--spice86Exe=/path/to/spice86exe/Spice86 \
--testBinRoot=/path/to/cpuTests/ \
--ghidraHome=/path/to/ghidra_10.1.5_PUBLIC/ \
--scriptPath=/path/to/spice86-ghidra-plugin/src/main/java/

If you specify a folder to --workspace, the script will run there, otherwise it will create a temp folder.

If you don't want it to update the spice86 template from nuget (used to generate a project for generated code), you can say so by specifying --skipTemplateUpdate=true