Como posso depurar scripts Python do plug-in Ghidra no IDE?

Oct 22 2020

Eu gostaria de depurar scripts de plug-in Ghidra escritos em python usando um IDE como o Eclipse. Eu instalei o Pydev e o plugin GhidraDev (no Ghidra, abra um script no Eclipse para instalar o plugin automaticamente).

Com o script do plug-in aberto no Eclipse, definirei um ponto de interrupção (por exemplo, no print stmt abaixo), clique em Debug> GhidraScripts para iniciar o Ghidra e, por fim, iniciar manualmente o script (veja o script de exemplo abaixo). Eu vejo o encadeamento e posso pausar o encadeamento de script do Eclipse, mas os pontos de interrupção nunca são atingidos.

Eu tentei o GhidraScripts (Headless) e o lançamento do GhidraScript baseado em GUI, mas não tive sucesso.

# 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)

Como posso obter funcionalidade de depuração para scripts Ghidra Python?

NOTA: Os problemas de depuração do Eclipse / Ghidra / PyDev parecem relacionados a um possível bug: https://github.com/NationalSecurityAgency/ghidra/issues/1707

Respostas

1 FlorianMagin Oct 23 2020 at 15:31

Eu não uso Eclipse para Ghidra, mas pelo que acabei de verificar, ele também deve suportar isso. Posso confirmar que essa abordagem (depuração remota mais stubs Python) funciona bem com PyCharm.

Depuração Remota com pydevd

A ideia básica é usar a depuração remota com pydevdou similar.https://stackoverflow.com/a/41492711/13220684 explica o uso básico.

O problema com isso é que você terá que instalar pydevddentro do ambiente Ghidra Jython. O seguinte foi 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

Agora deve ser possível import pydevddentro de um script Ghidra Python (ou mesmo o REPL integrado).

Não me lembro se o plug-in GhidraDev para eclipse fornece preenchimento de guia para o ghidramódulo dentro de scripts Python, mas esta configuração é genérica o suficiente para que você não precise mais usar Eclipse se preferir outro IDE para Python.

O IDE só precisa oferecer suporte à depuração remota via pydevd. Eu também recomendo fortemente usarhttps://github.com/VDOO-Connected-Trust/ghidra-pyi-generator se você estiver usando outro IDE para fornecer as informações de tipo, assinaturas de método e docstrings da API Ghidra para o IDE.

Outra Solução Alternativa

Pessoalmente, eu uso principalmente ghidra_bridgeos stubs de tipo mencionados anteriormente para Python com Ghidra. Por ghidra_bridgeser uma interface RPC completa, você pode escrever um script Python 3 com suporte IDE completo e executá-lo por meio do IDE. ghidra_bridgeem seguida, trata da conexão com o ambiente Ghidra Python e faz proxy de todos os objetos relevantes. Com os stubs de tipo, o IDE apenas trata o script como script Python genérico e o ghidramódulo como qualquer módulo Python 3.