¿Cómo puedo depurar los scripts Python del complemento Ghidra en IDE?
Me gustaría depurar los scripts de complementos de Ghidra escritos en python usando un IDE como Eclipse. He instalado Pydev y el complemento GhidraDev (desde Ghidra abre un script en Eclipse para autoinstalar el complemento).
Con la secuencia de comandos del complemento abierta en Eclipse, estableceré un punto de interrupción (por ejemplo, en el stmt de impresión a continuación), luego haga clic en Depurar> GhidraScripts para iniciar Ghidra y, finalmente, iniciaré manualmente la secuencia de comandos (consulte la secuencia de comandos de muestra a continuación). Veo el hilo y puedo pausar el hilo del script de Eclipse, pero los puntos de interrupción nunca se alcanzan.
Probé el lanzamiento de GhidraScripts (sin cabeza) y GhidraScript basado en GUI, sin embargo, ninguno de mis descansos.
# 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)
¿Cómo puedo obtener la funcionalidad de depuración para los scripts de Ghidra Python?
NOTA: Los problemas de depuración de Eclipse / Ghidra / PyDev parecen estar relacionados con un posible error: https://github.com/NationalSecurityAgency/ghidra/issues/1707
Respuestas
Yo no uso Eclipse para Ghidra, pero por lo que acabo de comprobar, también debería ser compatible con esto. Puedo confirmar que este enfoque (depuración remota más stubs de Python) funciona bien con PyCharm.
Depuración remota con pydevd
La idea básica es utilizar la depuración remota con pydevdo similar.https://stackoverflow.com/a/41492711/13220684 explica el uso básico.
El problema con esto es que tendrá que instalar pydevddentro del entorno de Ghidra Jython. Lo siguiente está adaptado 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
Ahora debería ser posible import pydevddentro de un script de Ghidra Python (o incluso el REPL integrado).
No recuerdo si el complemento GhidraDev para eclipse proporciona finalización de tabulación para el ghidramódulo dentro de los scripts de Python, pero esta configuración es lo suficientemente genérica como para que ya no tenga que usar Eclipse si prefiere otro IDE para Python.
El IDE solo necesita admitir la depuración remota a través de pydevd. También recomiendo encarecidamente usarhttps://github.com/VDOO-Connected-Trust/ghidra-pyi-generator si está utilizando otro IDE para proporcionar la información de tipo, las firmas de métodos y las cadenas de documentos de la API de Ghidra al IDE.
Otra solución alternativa
Personalmente, utilizo principalmente ghidra_bridgelos códigos auxiliares de tipo mencionados anteriormente para Python con Ghidra. Debido a que ghidra_bridgees una interfaz RPC completa, puede escribir un script Python 3 con soporte IDE completo y ejecutarlo a través del IDE. ghidra_bridgeluego maneja la conexión al entorno Ghidra Python y hace proxy de todos los objetos relevantes. Con los stubs de tipo, el IDE simplemente trata el script como un script genérico de Python y el ghidramódulo como cualquier módulo de Python 3.