Este plugin experimental do Ghidra permite que você lide facilmente com a emulação nativa do pcode. Nenhum script é mais necessário, basta usá-lo diretamente do Ghidra. Pode ser particularmente ú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 poderá ser emulado! Por exemplo, a emulação de instruções eBPF é demonstrada abaixo:
Em essência, o plugin é um wrapper estendido em torno das classes dentro do pacote ghidra.app.emulator
. Aqui está o que foi implementado:
Embora a emulação de PCode implique idealmente em unificação, a maioria dos processadores precisa de sua própria abordagem. Sinta-se à vontade para relatar quaisquer problemas que encontrar. Eu realmente gostaria de testar todos os processadores, mas dificilmente é possível.
Contém todas as janelas do plugin: visualização de pilha, registros, visualização de pontos de interrupção e janela principal.
Contém teclas de atalho para definir o início e o fim da emulação, pontos de interrupção e aplicar bytes alterados ao estado do emulador.
Altere os registros como desejar. Definir o registro do link (seta verde) ajudará o emulador a entender qual registro contém o endereço de retorno. O plugin sabe como funciona por meio dos registros stack, lr Register, AARCH64 e MIPS. Se você tiver um exótico, selecione o link cadastro e aperte o botão.
Quando você abre seu programa no СodeBrowser, o GhidraEmu mapeia o espaço da pilha automaticamente. O ponteiro da pilha será definido no meio do intervalo da pilha. Isso permite definir valores na parte superior ou inferior dos quadros de pilha. Role-o se houver congelamentos na atualização ou redefinição. Durante o processo de emulação, caso o programa necessite de mais espaço para a pilha, o plugin irá alocá-lo automaticamente.
Se algum byte mudar durante a emulação, você o verá no ByteViewer clássico. Não se preocupe, eles serão redefinidos para seus valores originais após pressionar o botão "Redefinir" .
Se você fez alterações, informe o emulador sobre os bytes alterados (a pilha é atualizada automaticamente - sem necessidade disso). Após alterar, selecione-os (ficarão verdes), e pressione esta opção (ou use a tecla de atalho “M”).
Aqui o plugin imprime 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 se for detectada uma tentativa de leitura de memória não inicializada, esse recurso permite contorná-lo. Veja um exemplo. Aqui está uma das primeiras instruções em muitos programas x86_64, economia de pilha canário:
MOV RAX, qword ptr FS:[0x28]
Vamos apenas tentar trapacear um pouco e superar isso 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, avançar mais 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 (clássico "step over"), pressione a tecla de atalho F6
, e certamente acontecerá:
Alguns pontos importantes a serem considerados :
Use gradle para construir a extensão: GHIDRA_INSTALL_DIR=${GHIDRA_HOME} gradle
e use Ghidra para instalá-la: File → Install Extensions...
No CodeBrowser, vá para 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 tenha vergonha de abrir uma nova edição e eu descobrirei.
As restrições do EmulatorHelper não permitem o uso do espaço do programa em outro. Portanto, sua biblioteca externa compartilhada, por exemplo, nunca saberá sobre o espaço de memória do programa e vice-versa. Portanto, você não pode emulá-lo como um processo com um espaço de memória. Deixe-me saber se estou faltando alguma coisa aqui.