Come posso eseguire il debug degli script Python del plugin Ghidra nell'IDE?

Oct 22 2020

Vorrei eseguire il debug degli script del plugin Ghidra scritti in python utilizzando un IDE come Eclipse. Ho installato Pydev e il plugin GhidraDev (da Ghidra apro uno script in Eclipse per autoinstallare il plugin).

Con lo script del plugin aperto in Eclipse, imposterò un punto di interruzione (ad esempio sullo stmt di stampa di seguito), quindi fare clic su Debug> GhidraScripts per avviare Ghidra e infine avviare manualmente lo script (vedere lo script di esempio sotto). Vedo il thread e posso mettere in pausa il thread dello script da Eclipse, ma i punti di interruzione non vengono mai raggiunti.

Ho provato sia GhidraScripts (Headless) che il lancio di GhidraScript basato su GUI, tuttavia nessuna delle mie 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)

Come posso ottenere la funzionalità di debug per gli script Ghidra Python?

NOTA: i problemi di debug di Eclipse / Ghidra / PyDev sembrano correlati a un possibile bug: https://github.com/NationalSecurityAgency/ghidra/issues/1707

Risposte

1 FlorianMagin Oct 23 2020 at 15:31

Non uso Eclipse per Ghidra da solo, ma per quanto ho appena controllato dovrebbe supportare anche questo. Posso confermare che questo approccio (debug remoto più stub Python) funziona bene con PyCharm.

Debug remoto con pydevd

L'idea di base è usare il debug remoto con pydevdo simili.https://stackoverflow.com/a/41492711/13220684 spiega l'utilizzo di base.

Il problema con questo è che dovrai installare pydevdall'interno dell'ambiente Ghidra Jython. Quanto segue è adattato dahttps://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

Ora dovrebbe essere possibile import pydevdall'interno di uno script Ghidra Python (o anche del REPL integrato).

Non ricordo se il plug-in GhidraDev per eclipse fornisce il completamento con tabulazione per il ghidramodulo all'interno degli script Python, ma questa configurazione è abbastanza generica da non essere più obbligato a utilizzare Eclipse se preferisci un altro IDE per Python.

L'IDE deve supportare solo il debug remoto tramite pydevd. Consiglio vivamente anche di usarehttps://github.com/VDOO-Connected-Trust/ghidra-pyi-generator se stai utilizzando un altro IDE per fornire le informazioni sul tipo, le firme del metodo e le stringhe di documentazione dell'API Ghidra all'IDE.

Un'altra soluzione alternativa

Personalmente uso principalmente ghidra_bridgee gli stub di tipo precedentemente menzionati per Python con Ghidra. Poiché ghidra_bridgeè un'interfaccia RPC completa, puoi scrivere uno script Python 3 con supporto IDE completo ed eseguirlo tramite l'IDE. ghidra_bridgequindi gestisce la connessione all'ambiente Ghidra Python e invia tramite proxy tutti gli oggetti rilevanti. Con gli stub di tipo, l'IDE tratta lo script come uno script Python generico e il ghidramodulo come qualsiasi modulo Python 3.