
Plugin de Binary Ninja para analizar y simplificar código ofuscado
Autores: Tim Blazytko & Nicolò Altamura
Analiza y simplifica código ofuscado
Obfuscation Analysis es un plugin de Binary Ninja que elimina la dificultad de trabajar con binarios fuertemente protegidos. Incluye un puñado de asistentes enfocados que te permiten
Algunos casos de uso de ejemplo se pueden encontrar en examples. Además, la charla de REcon "Breaking Mixed Boolean-Arithmetic Obfuscation in Real-World Applications" demuestra algunos casos de uso. Las diapositivas se pueden encontrar aquí. El plugin complementa a Obfuscation Detection: una vez que se marcan funciones sospechosas, Obfuscation Analysis te ayuda a limpiarlas y entenderlas. Se añadirán más asistentes con el tiempo.
La herramienta se puede instalar usando el gestor de plugins de Binary Ninja.
Para una instalación manual, sigue estos pasos en la carpeta de plugins de Binary Ninja:
git clone https://github.com/mrphrazer/obfuscation_analysis.git
cd obfuscation_analysis
# optionally: use a virtual environment
python -m venv obfana-env
source obfana-env/bin/activate
# install requirements
pip install -r requirements.txt
Si usas un entorno virtual, deberás establecer manualmente la ruta de site-packages en la configuración de Binary Ninja.
El plugin está disponible desde el menú de la barra superior de Binary Ninja en Plugins -> Obfuscation Analysis.
Para simplificar la ofuscación aritmética, primero resalta la expresión HLIL que deseas simplificar en la vista del descompilador. A continuación, elige Plugins -> Obfuscation Analysis -> MBA Simplification -> Slice & Simplify. El plugin resuelve el cálculo completo, lo ejecuta a través de msynth e inserta el resultado simplificado como un comentario en la misma línea. La breve animación a continuación muestra el flujo de trabajo completo:
La simplificación de MBA se basa en msynth. Por defecto, el plugin usa el oráculo de simplificación predeterminado de msynth, que se incluye con el plugin y está preconfigurado. Si deseas usar un oráculo más grande o personalizado, establece obfuscation_analysis.mba_oracle_path manualmente o navega hasta el archivo en la ventana de Configuración de Binary Ninja.
Si algo sale mal, el plugin escribe un mensaje conciso a nivel de usuario en el panel de Log; cambia la vista del registro a Debug para ver la traza completa.
El plugin incluye asistentes enfocados que abordan obstáculos comunes que encuentras al revertir binarios protegidos, cada uno ejecutable como una tarea en segundo plano desde la interfaz de usuario o desde scripts sin interfaz. A continuación se presentan las características disponibles actualmente.
Las Funciones corruptas son funciones cuyo desensamblado muestra artefactos indefinidos—bloques básicos vacíos, instrucciones inválidas o superpuestas, y similares. Este asistente recorre todo el BinaryView, marca funciones con esos síntomas y las lista de manera que el analista pueda inspeccionar rápidamente código que fue mal analizado o deliberadamente ofuscado. Una acción opcional de eliminación borra cada función marcada y fuerza un nuevo análisis, limpiando la lista de funciones. Es particularmente útil para localizar
La Aritmética Mixta Booleana (MBA) es una técnica de ofuscación que entierra cálculos simples en largas cadenas de operaciones aritméticas y booleanas. Esta característica simplifica tales expresiones en el descompilador. Cuando eliges una instrucción HLIL, el plugin recopila su cadena de cálculo completa con un backward slice SSA restringido al bloque básico actual, traduce ese slice a Miasm IR, lo introduce en msynth y finalmente añade el resultado simplificado como un comentario en la vista del descompilador. Esta característica te permite
Para la función actualmente seleccionada, este asistente aplica inlining recursivamente a cada función llamada dentro de la vista del descompilador, dando a Binary Ninja un IL único y autocontenido. Con todos los límites eliminados, el descompilador puede propagar datos entre funciones, permitiendo un plegado de constantes más profundo, eliminación de código muerto y, en general, una lógica más clara. Úsalo para
Ten en cuenta que HLIL puede volverse muy grande y lento de renderizar en funciones muy grandes o árboles de llamadas profundos. Además, algunas optimizaciones del descompilador pueden ser menos efectivas una vez que todo se fusiona en una sola unidad. Para controlar esto, puedes limitar la profundidad de inlining: establece Settings -> Obfuscation Analysis -> Max Function Inlining Depth a un límite superior N (por defecto establecido en 1). Con un límite de profundidad, solo se aplica inlining a los primeros N niveles de llamadas; las llamadas más profundas no se inlinean.
El plugin tiene algunas advertencias que debes conocer, la mayoría relacionadas con el pipeline de simplificación de MBA:
Bug de Binary Ninja: en BN 5.0 stable, el paso de backward-slicing puede fallar debido a type-casts de HLIL faltantes: https://github.com/Vector35/binaryninja-api/issues/6371; el problema está corregido en 5.1.7477-de y versiones más recientes
slice confinado a un bloque básico: las definiciones de variables ubicadas en bloques predecesores se ignoran (a menudo dependientes del flujo de control), por lo que algunos términos de MBA pueden permanecer parcialmente resueltos
brechas de traducción de HLIL a Miasm IR: no todas las construcciones de HLIL tienen un equivalente sólido en Miasm; cuando la traducción falla, la expresión se omite y se registra un error
cobertura de IL: los nodos de flujo de control y las operaciones de punto flotante actualmente no se traducen
restricciones heredadas de msynth : la simplificación de MBA hereda todas las limitaciones de msynth
Para más información, contacta a Tim Blazytko (@mr_phrazer) o Nicolò Altamura (@nicolodev).