Comment puis-je déboguer les scripts Python du plugin Ghidra dans l'IDE?
J'aimerais déboguer les scripts de plugin Ghidra écrits en python en utilisant un IDE tel qu'Eclipse. J'ai installé Pydev et le plugin GhidraDev (depuis Ghidra ouvrez un script dans Eclipse pour installer automatiquement le plugin).
Avec le script du plugin ouvert dans Eclipse, je vais définir un point d'arrêt (par exemple sur le stmt d'impression ci-dessous), puis cliquer sur Déboguer> GhidraScripts pour lancer Ghidra, et enfin lancer manuellement le script (voir l'exemple de script ci-dessous). Je vois le fil et je peux mettre en pause le fil de script d'Eclipse, mais les points d'arrêt ne sont jamais atteints.
J'ai essayé à la fois GhidraScripts (Headless) et le lancement de GhidraScript basé sur l'interface graphique, mais aucune de ma pause.
# 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)
Comment puis-je obtenir la fonctionnalité de débogage pour les scripts Ghidra Python?
REMARQUE: les problèmes de débogage Eclipse / Ghidra / PyDev semblent liés à un bogue possible: https://github.com/NationalSecurityAgency/ghidra/issues/1707
Réponses
Je n'utilise pas Eclipse pour Ghidra moi-même, mais pour autant que je viens de le vérifier, il devrait également le supporter. Je peux confirmer que cette approche (débogage à distance plus stubs Python) fonctionne bien avec PyCharm.
Débogage à distance avec pydevd
L'idée de base est d'utiliser le débogage à distance avec pydevdou similaire.https://stackoverflow.com/a/41492711/13220684 explique l'utilisation de base.
Le problème avec ceci est que vous devrez installer pydevddans l'environnement Ghidra Jython. Ce qui suit est adapté dehttps://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
Il devrait maintenant être possible d' import pydevdintégrer un script Ghidra Python (ou même le REPL intégré).
Je ne me souviens pas si le plugin GhidraDev pour eclipse fournit la complétion des onglets pour le ghidramodule dans les scripts Python, mais cette configuration est suffisamment générique pour que vous ne soyez plus obligé d'utiliser Eclipse si vous préférez un autre IDE pour Python.
L'EDI doit uniquement prendre en charge le débogage à distance via pydevd. Je recommande également fortement d'utiliserhttps://github.com/VDOO-Connected-Trust/ghidra-pyi-generator si vous utilisez un autre IDE pour fournir les informations de type, les signatures de méthode et les docstrings de l'API Ghidra à l'EDI.
Une autre solution de contournement
Personnellement, j'utilise principalement ghidra_bridgeet les stubs de type mentionnés précédemment pour Python avec Ghidra. Comme il ghidra_bridges'agit d'une interface RPC complète, vous pouvez écrire un script Python 3 avec un support IDE complet et l'exécuter via l'EDI. ghidra_bridgegère ensuite la connexion à l'environnement Ghidra Python et met en proxy tous les objets pertinents. Avec le type stubs, l'EDI traite simplement le script comme un script Python générique et le ghidramodule comme n'importe quel module Python 3.