
Um Explorador de Rastros para Engenheiros Reversos
Tenet é um plugin do IDA Pro para explorar traços de execução. O objetivo deste plugin é fornecer controles mais naturais e humanos para navegar por traços de execução em um determinado binário. A base deste trabalho decorre do desejo de pesquisar métodos novos ou inovadores para examinar e destilar padrões complexos de execução em software.
Para mais contexto sobre este projeto, por favor leia o blogpost sobre seu lançamento inicial.
Agradecimentos especiais ao QIRA / geohot e outros pela inspiração.
Tenet é um plugin Python 3 multiplataforma (Windows, macOS, Linux). Ele não possui dependências de terceiros, tornando o código portátil e fácil de instalar.
No console Python do seu descompilador, execute o seguinte comando para encontrar o diretório de plugins:
import idaapi, os; os.path.join(idaapi.get_user_idadir(), "plugins")Copie o conteúdo da pasta /plugins/ deste repositório para o diretório listado.
Reinicie seu descompilador.
Este plugin é suportado apenas para IDA 7.5 e versões posteriores.
Uma vez instalado corretamente, uma nova entrada de menu estará disponível no descompilador. Ela pode ser usada para carregar traços de execução coletados externamente no Tenet.
Como este é o lançamento inicial, o Tenet aceita apenas traços de texto simples legíveis por humanos. Consulte o tracing readme neste repositório para informações adicionais sobre o formato do traço, limitações e traçadores de referência.
Ao usar o Tenet, o plugin 'pinta' trilhas para indicar o fluxo de execução para frente (azul) e para trás (vermelho) a partir da sua posição atual no traço de execução ativo.
Para avançar ou retroceder no tempo, basta rolar enquanto passa o mouse sobre a linha do tempo no lado direito do descompilador. Para passar por cima de chamadas de função, segure SHIFT enquanto rola.
A linha do tempo do traço será ancorada no lado direito do descompilador. Este widget é usado para visualizar diferentes tipos de eventos ao longo da linha do tempo do traço e realizar navegação básica conforme descrito acima.
Ao clicar e arrastar pela linha do tempo, é possível ampliar uma seção específica do traço de execução. Esta ação pode ser repetida quantas vezes forem necessárias para alcançar a granularidade desejada.
Clicar duas vezes no ponteiro de instrução na janela de registradores o destacará em vermelho, revelando todos os locais onde a instrução foi executada ao longo da linha do tempo do traço.
Para pular entre execuções, role para cima ou para baixo enquanto passa o mouse sobre o ponteiro de instrução destacado.
Além disso, você pode clicar com o botão direito na listagem de desmontagem e selecionar uma das entradas de menu baseadas em navegação para buscar rapidamente a execução de uma instrução de interesse.
A tecla de atalho nativa do IDA F2 também pode ser usada para definir pontos de interrupção em instruções arbitrárias.
Ao clicar duas vezes em um byte na visualização de pilha ou memória, você verá instantaneamente todas as leituras/escritas para aquele endereço visualizadas ao longo da linha do tempo do traço. Amarelo indica uma leitura de memória, azul indica uma escrita de memória.
Os pontos de interrupção de memória podem ser navegados usando a mesma técnica descrita para pontos de interrupção de execução. Clique duas vezes em um byte e role enquanto passa o mouse sobre o byte selecionado para posicionar o traço em cada um de seus acessos.
Clicar com o botão direito em um byte de interesse fornecerá opções para buscar entre leitura / escrita / acesso de memória, se houver uma ação de navegação específica em mente.
Para navegar pela visualização de memória para um endereço arbitrário, clique na visualização de memória e pressione G para inserir um endereço ou símbolo do banco de dados para posicionar a visualização.
É possível definir um ponto de interrupção de memória em uma região de memória destacando um bloco de memória e clicando duas vezes nele para definir um ponto de interrupção de acesso.
Assim como nos pontos de interrupção de memória normais, passar o mouse sobre a região e rolar pode ser usado para percorrer os acessos feitos à região de memória selecionada.
Em engenharia reversa, é bastante comum encontrar situações em que você se pergunta "Qual instrução definiu este registrador com seu valor atual?"
Usando o Tenet, você pode buscar retroativamente essa instrução com um único clique.
Buscar retroativamente é de longe a direção mais comum para navegar pelas mudanças de registrador... mas para destreza, você também pode buscar adiante para a próxima atribuição de registrador usando a seta azul à direita do registrador.
Um 'shell' simples é fornecido para navegar para timestamps específicos no traço. Colar (ou digitar...) um timestamp no shell com ou sem vírgulas é suficiente.
Usando um ponto de exclamação, você também pode buscar uma 'porcentagem' especificada no traço. Inserir !100 buscará a instrução final no traço, enquanto !50 buscará aproximadamente 50% do traço. !last buscará a última instrução navegável que pode ser visualizada no descompilador.
O Tenet vem com dois temas padrão -- um tema 'claro' e um 'escuro'. Dependendo das cores atualmente usadas pelo seu descompilador, o Tenet tentará selecionar o tema que parece mais apropriado.
Os arquivos de tema são armazenados como JSON simples no disco e são altamente configuráveis. Se você não estiver satisfeito com os temas ou cores padrão, pode criar seus próprios temas e simplesmente colocá-los no diretório de temas do usuário.
O Tenet lembrará sua preferência de tema para carregamentos e usos futuros.
Tempo e motivação financiamento permitindo, trabalhos futuros podem incluir:
Aceito contribuições externas, issues e solicitações de funcionalidades. Por favor, faça pull requests para o branch develop deste repositório se desejar que sejam consideradas para um lançamento futuro.
Markus Gaasedelen (@gaasedelen)