Wie kann ich Python-Skripte für Ghidra-Plugins in IDE debuggen?
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
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.