
Native Pcode emulator
Este plugin experimental do Ghidra permite que você lide facilmente com a emulação de pcode nativo. Não são mais necessários scripts; basta usá-lo diretamente no Ghidra. Ele pode ser especialmente útil para trabalhar com uma variedade de processadores exóticos que não são suportados por emuladores comuns.
Se o processador/vm for suportado pelo Ghidra para engenharia reversa, ele pode ser emulado! Por exemplo, a emulação de instruções eBPF é demonstrada abaixo:

Em essência, o plugin é um wrapper estendido ao redor das classes do pacote ghidra.app.emulator. Veja o que foi implementado:
Embora a emulação de PCode idealmente implique unificação, a maioria dos processadores exige sua própria abordagem. Sinta-se à vontade para relatar quaisquer problemas que encontrar. Eu realmente gostaria de testar todos os processadores, mas isso é dificilmente possível.

Contém todas as janelas do plugin: visualização da Pilha, dos Registradores, dos Breakpoints e a Janela Principal.

Contém atalhos para definir o início e o fim da emulação, breakpoints e aplicar bytes alterados ao estado do emulador.
Altere os registradores como quiser. Definir o registrador de link (seta verde) ajudará o emulador a entender qual registrador contém o endereço de retorno. O plugin sabe como isso funciona por meio da pilha, do registrador lr e dos registradores AARCH64 e MIPS. Se você tiver um exótico, selecione o registrador de link e pressione o botão.
Quando você abre seu programa no СodeBrowser, o GhidraEmu mapeia o espaço da pilha automaticamente. O ponteiro de pilha será definido no meio do intervalo da pilha. Isso permite que você defina valores no topo ou na base dos quadros de pilha. Role a visualização se você tiver travamentos ao atualizar ou redefinir. Durante o processo de emulação, se o programa precisar de mais espaço para a pilha, o plugin o alocará automaticamente.
Se bytes forem alterados durante a emulação, você os verá no clássico ByteViewer. Não se preocupe, eles serão restaurados aos seus valores originais após pressionar o botão "Reset".
Se você fez alterações, informe ao emulador sobre os bytes alterados (a pilha é atualizada automaticamente -- não é necessário). Depois de alterar, selecione-os (eles ficarão verdes) e pressione esta opção (ou use o atalho "M").

Aqui o plugin imprime as informações de saída. Por exemplo, mensagens de erro de emulação como esta:

O recurso "Jump Over" permite que você avance uma instrução se não quiser emular a atual por algum motivo. Como o processo de emulação será abortado caso seja detectada uma tentativa de leitura de memória não inicializada, esse recurso permite contorná-la. Veja um exemplo. Aqui está uma das primeiras instruções em muitos programas x86_64, a gravação do canary da pilha:
MOV RAX, qword ptr FS:[0x28]
Vamos apenas tentar "trapacear" um pouco e pular por cima dela aumentando o valor do PC. Para fazer isso, pare na instrução que você não deseja emular e pressione a tecla de atalho J. Caso contrário, continuar a execução resultaria em um erro de leitura de memória não inicializada.

Se você parar em uma instrução que leva a uma sub-rotina (chamada interna) e quiser emular tudo até a próxima instrução (o clássico "step over"), pressione a tecla de atalho F6, e certamente isso acontecerá:

Alguns pontos importantes a considerar:
Use o gradle para compilar a extensão: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle e use o Ghidra para instalá-la: File → Install Extensions...
No CodeBrowser, vá em File → Configure → Miscellaneous e marque a caixa de seleção do plugin GhidraEmu.
Encontrou algum bug ao usar o plugin ou tem ideias para melhorias? Não seja tímido, abra uma nova issue e eu resolvo.
As restrições do EmulatorHelper não permitem usar o espaço do programa em outro. Portanto, sua biblioteca compartilhada externa, por exemplo, nunca saberá sobre o espaço de memória do programa e vice-versa. Então você não pode emulá-la como um único processo com um único espaço de memória. Deixe-me saber se estou esquecendo de algo aqui.