
Desensamblador interactivo fácilmente reorientable y hackeable con API de complementos compatible con IDAPython
ScratchABit es un desensamblador incremental interactivo con capacidades de análisis de flujo de datos/control. ScratchABit está dedicado a los esfuerzos de la comunidad de ingeniería inversa de código abierto (ingeniería inversa para producir controladores/firmware de código abierto para hardware no compatible adecuadamente por los fabricantes, para la interoperabilidad de hardware y software, y para la investigación de seguridad).
ScratchABit soporta la conocida API IDAPython de la comunidad para escribir módulos de desensamblado/extensión.
ScratchABit es un trabajo en progreso, las funcionalidades se añaden según se necesitan, las contribuciones son bienvenidas.
ScratchABit se publica bajo los términos de la Licencia Pública General GNU v3 (GPLv3).
No debe estar escrito en un lenguaje ofuscado. Esto incluye lenguajes que son demasiado de bajo nivel, que permiten acceder a variables no inicializadas, que no diferencian entre variables y funciones/procedimientos, que comienzan los índices de arreglos desde números arbitrarios, etc., etc. ScratchABit está escrito en Python (versión moderna, Python3) para su placer y cordura.
El marco de interfaz de usuario debe permitir la interacción del usuario al nivel necesario, no añadir dependencias, hinchazón, problemas e incompatibilidades entre versiones del marco. ScratchABit actualmente utiliza una interfaz de usuario de texto simple de pantalla completa, usando secuencias de escape de terminal ANSI/VT100 (sí, incluso la biblioteca curses se consideró una dependencia demasiado hinchada para imponerla a los usuarios).
Debe aprovechar formatos de texto fáciles de usar para almacenar la "base de datos", para facilitar la reutilización y la escritura de herramientas, y el almacenamiento en sistemas de control de versiones.
Para usar ScratchABit, necesita tener instalado Python3 (probado con Python 3.3 a 3.7) y una terminal o emulador de terminal VT100 (mínimo) o XTerm (recomendado) (cualquier sistema Unix debería ser compatible, como Linux/BSD/etc., vea las preguntas frecuentes a continuación para más información).
Clone el código usando:
git clone --recursive https://github.com/pfalcon/ScratchABit
Si clonó el código sin --recursive, ejecute git submodule update --init
en el directorio de ScratchABit.
ScratchABit ahora incluye plugin(s) de CPU basados en Capstone Engine, que permiten acceder a varias arquitecturas de CPU. Para usarlo, se debe instalar un módulo reciente de enlaces Python para Capstone (preferiblemente a los paquetes distribuidos por las distribuciones del sistema operativo, que a menudo están desactualizados). La forma más fácil de instalarlo es en el directorio de paquetes de usuario de Python:
pip3 install --no-cache-dir --user capstone
Una alternativa es instalarlo en un entorno virtual de Python dentro del directorio de ScratchABit:
python3 -m venv .venv
source .venv/bin/activate
pip3 install --no-cache-dir capstone
Cuando abra una nueva sesión de terminal para trabajar con ScratchABit,
ejecute el comando source .venv/bin/activate nuevamente para activar el
entorno virtual.
Si nada de lo anterior funciona, puede intentar instalar el paquete capstone a nivel de sistema (no recomendado):
sudo pip3 install --system capstone
Si desea desensamblar un archivo en formato ejecutable autodescriptivo
(como ELF), simplemente páselo como argumento a ScratchABit.py. El repositorio
incluye varios archivos example-*.elf para varias arquitecturas para un
inicio rápido. Por ejemplo, para probar la versión x86 de 32 bits:
python3 ScratchABit.py example-x86_32.elf
Alternativamente, si desea desensamblar un archivo binario sin formato, necesita crear un archivo .def (definición), para especificar qué áreas de memoria están definidas para el código, en qué dirección cargar el archivo binario, etc. (Nota: un archivo .def también puede ser útil para archivos .elf y similares). El repositorio incluye un código binario sin formato simple x86_64, y el archivo example-x86_64.def correspondiente (mire dentro para una descripción de las opciones disponibles):
python3 ScratchABit.py example-x86_64.def
Presione F9 para acceder a los menús (el mouse también funciona en terminales compatibles con XTerm). Presione F1 para obtener ayuda sobre los atajos de teclado (la mayoría de las acciones también son accesibles a través del menú). El flujo de trabajo de ScratchABit es similar a otros desensambladores interactivos (puede ser útil algo de experiencia previa o lectura de fondo).
Los plugins de procesador IDAPython se pueden cargar desde cualquier lugar
en la ruta de módulos de Python. Alternativamente, puede enlazar simbólicamente
o copiar el/los archivo(s) .py del plugin en el subdirectorio plugins/cpu/.
Una vez que el plugin está disponible, cree un nuevo archivo de definición basado
en example-x86_64.def que establezca el nombre del
módulo del plugin (sin la extensión .py) en la línea cpu xxx.
Para un ejemplo muy simple que usa un plugin externo, vea este archivo esp8266.def que funciona con el plugin xtensa.py del repositorio ida-xtensa2.
P: ¿Qué procesadores/arquitecturas están soportadas?
R: ScratchABit no soporta ninguna arquitectura de procesador por sí mismo, es completamente reorientable mediante plugins de la API IDAPython. Hay muchos plugins disponibles, y escribir un nuevo plugin es fácil. Para que los usuarios puedan probar ScratchABit, se incluye un plugin de procesador x86 simple en la distribución, que utiliza el desensamblador Pymsasid por debajo.
A partir de la versión 2.0, también se incluye un plugin de Capstone, que permite acceder a varias arquitecturas, incluyendo x86, ARM, MIPS, PowerPC, SPARC, etc. (el soporte de arquitecturas se habilita gradualmente según las pruebas de los usuarios).
Puede leer sobre los plugins incluidos con ScratchABit en
el README del directorio plugins/cpu/.
P: ¿Depurador?
R: ScratchABit está dedicado al análisis estático y al soporte fácil para nuevas arquitecturas de CPU (solo escriba un nuevo plugin de CPU en Python, puede obtener resultados iniciales en pocas horas). El análisis dinámico no fue concebido como una característica principal y no hay planes inmediatos para implementarlo. Aunque los parches son bienvenidos.
P: ¿Descompilador?
R: Hay un proyecto relacionado, llamado ScratchABlock para el análisis profundo de programas, transformación y descompilación. Se espera que a medida que ScratchABlock madure, parte de su funcionalidad estará disponible dentro de ScratchABit (quizás a través de plugins).
P: No estoy en Linux, ¿cómo puedo ejecutar ScratchABit?
R: Instale Linux en un emulador/VM en su sistema y regocíjese.
P: ¿Captura de pantalla obligatoria?
R: ¡Claro!
