Wie kann ich Python-Skripte für Ghidra-Plugins in IDE debuggen?

Oct 22 2020

Ich möchte Ghidra-Plugin-Skripte, die in Python geschrieben wurden, mit einer IDE wie Eclipse debuggen. Ich habe Pydev und das GhidraDev-Plugin installiert (von Ghidra aus öffnen Sie ein Skript in Eclipse, um das Plugin automatisch zu installieren).

Wenn das Plugin-Skript in Eclipse geöffnet ist, setze ich einen Haltepunkt (z. B. auf dem Druck-Stmt unten), klicke dann auf Debug> GhidraScripts, um Ghidra zu starten, und starte das Skript schließlich manuell (siehe Beispielskript unten). Ich sehe den Thread und kann den Skript-Thread von Eclipse anhalten, aber die Haltepunkte werden nie erreicht.

Ich habe sowohl GhidraScripts (Headless) als auch GUI-basierten GhidraScript-Start ausprobiert, jedoch keine meiner Unterbrechungen.

# Hello Function Script
# @author mechgt
# @category _NEW_
# @keybinding
# @menupath
# @toolbar

import ghidra
import time
    
# Iterate through functions, parsing and printing each
function = getFirstFunction()
while function is not None:
    print("Function: {} Address: {}".format(function.getName(), function.getEntryPoint()))
    time.sleep(3)
    function = getFunctionAfter(function)

Wie kann ich Debugging-Funktionen für Ghidra Python-Skripte erhalten?

HINWEIS: Die Eclipse / Ghidra / PyDev-Debugging-Probleme hängen mit einem möglichen Fehler zusammen: https://github.com/NationalSecurityAgency/ghidra/issues/1707

Antworten

1 FlorianMagin Oct 23 2020 at 15:31

Ich benutze Eclipse nicht für Ghidra selbst, aber soweit ich es gerade überprüft habe, sollte es dies auch unterstützen. Ich kann bestätigen, dass dieser Ansatz (Remote-Debugging plus Python-Stubs) mit PyCharm gut funktioniert.

Remote-Debugging mit pydevd

Die Grundidee besteht darin, Remote-Debugging mit pydevdoder ähnlichem zu verwenden.https://stackoverflow.com/a/41492711/13220684 erklärt die grundlegende Verwendung.

Das Problem dabei ist, dass Sie pydevdin der Ghidra Jython-Umgebung installieren müssen . Das Folgende ist angepasst vonhttps://github.com/VDOO-Connected-Trust/ghidra-pyi-generator#python-packages

# Create a virtualenv for Ghidra packages.
# It is important to use Python2.7 for this venv!
# If you want, you can skip this step and use your default Python installation.
mkvirtualenv ghidra
 
# Create Jython's site-pacakges directory.
jython_site_packages="~/.local/lib/jython2.7/site-packages"
mkdir -p $jython_site_packages # Create a PTH file to point Jython to Python's site-packages directories. # Again, this has to be Python2.7. # Outside a virtualenv, use python -c "import site; print(site.getusersitepackages()); print(site.getsitepackages()[-1])" > $jython_site_packages/python.pth

# If using virtualenv, use the following instead
python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())" > $jython_site_packages/python.pth

 
# Use pip to install packages for Ghidra
pip install pydevd

Es sollte nun möglich sein, import pydevdein Ghidra Python-Skript (oder sogar die integrierte REPL) zu verwenden.

Ich erinnere mich nicht, ob das GhidraDev-Plugin für Eclipse eine Tab-Vervollständigung für das ghidraModul in Python-Skripten bietet, aber dieses Setup ist allgemein genug, dass Sie Eclipse nicht mehr verwenden müssen, wenn Sie eine andere IDE für Python bevorzugen.

Die IDE muss nur das Remote-Debugging über unterstützen pydevd. Ich empfehle auch dringend die Verwendunghttps://github.com/VDOO-Connected-Trust/ghidra-pyi-generator Wenn Sie eine andere IDE verwenden, um der IDE die Typinformationen, Methodensignaturen und Dokumentzeichenfolgen der Ghidra-API bereitzustellen.

Eine weitere Problemumgehung

Persönlich verwende ich meistens ghidra_bridgeund die zuvor erwähnten Typstubs für Python mit Ghidra. Da ghidra_bridgees sich um eine vollständige RPC-Schnittstelle handelt, können Sie ein Python 3-Skript mit vollständiger IDE-Unterstützung schreiben und über die IDE ausführen. ghidra_bridgeübernimmt dann die Verbindung zur Ghidra Python-Umgebung und überträgt alle relevanten Objekte. Bei den Typstubs behandelt die IDE das Skript lediglich als generisches Python-Skript und das ghidraModul wie jedes Python 3-Modul.