
Un Explorador de Trazas para Ingenieros Inversos
Tenet es un plugin para IDA Pro que permite explorar trazas de ejecución. El objetivo de este plugin es proporcionar controles más naturales y humanos para navegar por trazas de ejecución contra un binario dado. La base de este trabajo surge del deseo de investigar métodos nuevos o innovadores para examinar y destilar patrones de ejecución complejos en software.
Para más contexto sobre este proyecto, por favor lee el blogpost acerca de su lanzamiento inicial.
Agradecimientos especiales a QIRA / geohot y otros por la inspiración.
Tenet es un plugin de Python 3 multiplataforma (Windows, macOS, Linux). No tiene dependencias de terceros, lo que hace que el código sea portátil y fácil de instalar.
Desde la consola de Python de tu desensamblador, ejecuta el siguiente comando para encontrar su directorio de plugins:
import idaapi, os; os.path.join(idaapi.get_user_idadir(), "plugins")Copia el contenido de la carpeta /plugins/ de este repositorio en el directorio indicado.
Reinicia tu desensamblador.
Este plugin solo es compatible con IDA 7.5 y versiones posteriores.
Una vez instalado correctamente, aparecerá una nueva entrada de menú en el desensamblador. Se puede usar para cargar trazas de ejecución recolectadas externamente en Tenet.
Como este es el lanzamiento inicial, Tenet solo acepta trazas de texto simples legibles por humanos. Consulta el readme de trazas en este repositorio para obtener información adicional sobre el formato de traza, limitaciones y trazas de referencia.
Mientras usas Tenet, el plugin 'pintará' senderos para indicar el flujo de ejecución hacia adelante (azul) y hacia atrás (rojo) desde tu posición actual en la traza de ejecución activa.
Para avanzar o retroceder en el tiempo, simplemente desplázate mientras pasas el cursor sobre la línea de tiempo en el lado derecho del desensamblador. Para saltar llamadas a funciones, mantén presionado SHIFT mientras te desplazas.
La línea de tiempo de la traza estará acoplada en el lado derecho del desensamblador. Este widget se utiliza para visualizar diferentes tipos de eventos a lo largo de la línea de tiempo de la traza y realizar navegación básica como se describió anteriormente.
Al hacer clic y arrastrar a través de la línea de tiempo, es posible acercar una sección específica de la traza de ejecución. Esta acción se puede repetir cualquier número de veces para alcanzar la granularidad deseada.
Haciendo doble clic en el puntero de instrucción en la ventana de registros se resaltará en rojo, revelando todas las ubicaciones donde se ejecutó la instrucción a lo largo de la línea de tiempo de la traza.
Para saltar entre ejecuciones, desplázate hacia arriba o hacia abajo mientras pasas el cursor sobre el puntero de instrucción resaltado.
Además, puedes hacer clic derecho en la lista de desensamblado y seleccionar una de las entradas de menú basadas en navegación para buscar rápidamente la ejecución de una instrucción de interés.
La tecla de acceso rápido F2 nativa de IDA también se puede usar para establecer puntos de interrupción en instrucciones arbitrarias.
Al hacer doble clic en un byte en las vistas de pila o memoria, verás instantáneamente todas las lecturas/escrituras en esa dirección visualizadas a lo largo de la línea de tiempo de la traza. El amarillo indica una lectura de memoria, el azul indica una escritura de memoria.
Los puntos de interrupción de memoria se pueden navegar utilizando la misma técnica descrita para los puntos de interrupción de ejecución. Haz doble clic en un byte y desplázate mientras pasas el cursor sobre el byte seleccionado para llevar la traza a cada uno de sus accesos.
Hacer clic derecho en un byte de interés te dará opciones para buscar entre lectura/escritura/acceso de memoria si tienes en mente una acción de navegación específica.
Para navegar la vista de memoria a una dirección arbitraria, haz clic en la vista de memoria y presiona G para ingresar una dirección o un símbolo de la base de datos al cual dirigir la vista.
Es posible establecer un punto de interrupción de memoria en una región de memoria resaltando un bloque de memoria y haciendo doble clic en él para establecer un punto de interrupción de acceso.
Al igual que con los puntos de interrupción de memoria normales, pasar el cursor sobre la región y desplazarse se puede usar para recorrer los accesos realizados a la región de memoria seleccionada.
En la ingeniería inversa, es bastante común encontrarse con situaciones en las que te preguntas "¿Qué instrucción estableció este registro a su valor actual?"
Usando Tenet, puedes buscar hacia atrás hasta esa instrucción con un solo clic.
Buscar hacia atrás es, por mucho, la dirección más común para navegar a través de cambios en los registros... pero para mayor destreza también puedes buscar hacia adelante hasta la siguiente asignación de registro usando la flecha azul a la derecha del registro.
Se proporciona un simple 'shell' para navegar a marcas de tiempo específicas en la traza. Pegar (o escribir...) una marca de tiempo en el shell, con o sin comas, será suficiente.
Usando un signo de exclamación, también puedes buscar un 'porcentaje' especificado dentro de la traza. Ingresar !100 llevará a la instrucción final en la traza, mientras que !50 llevará aproximadamente al 50% de la traza. !last llevará a la última instrucción navegable que se puede ver en el desensamblador.
Tenet incluye dos temas predeterminados: un tema 'claro' y uno 'oscuro'. Dependiendo de los colores que esté utilizando actualmente tu desensamblador, Tenet intentará seleccionar el tema que parezca más apropiado.
Los archivos de tema se almacenan como JSON simple en el disco y son altamente configurables. Si no estás satisfecho con los temas o colores predeterminados, puedes crear tus propios temas y simplemente colocarlos en el directorio de temas del usuario.
Tenet recordará tu preferencia de tema para futuras cargas y usos.
Tiempo y motivación financiamiento mediante, el trabajo futuro puede incluir:
Acepto contribuciones externas, informes de problemas y solicitudes de funciones. Por favor, realiza cualquier solicitud de extracción a la rama develop de este repositorio si deseas que se consideren para un futuro lanzamiento.
Markus Gaasedelen (@gaasedelen)