Bluepill es un marco de análisis dinámico de código abierto para manejar malware evasivo. Su objetivo es conciliar las propiedades de transparencia necesarias para los análisis automáticos con la inspección de ejecución de grano fino y las capacidades de parcheo requeridas para el análisis manual.
Bluepill es un prototipo académico que mantenemos en nuestro tiempo libre: ¡sus comentarios son preciosos!
Bluepill puede contrarrestar muchas píldoras rojas dirigidas a hipervisores, depugadores, herramientas de terceros y artefactos de tiempo. Se basa en instrumentación binaria dinámica (DBI) para monitorear las consultas que el malware puede hacer en el entorno que busca artefactos, alterando sus resultados cuando pueden revelar la presencia de un sistema de análisis automatizado o un agente humano. Bluepill ofrece una interfaz remota GDB para depurar una muestra mientras cuida las evasiones de nombre de los analistas, junto con un nuevo mecanismos de parcheo de sigilo para ocultar los cambios en el código realizados en el depurador de los esquemas de autos.
Probamos BluePill en malware Heterogéneo PE32 Windows que se ejecuta en Windows 7 SP1 de 32 bits: como ejemplo, podemos ejecutar ejecutables protegidos con versiones recientes de VMProtect y Themida y muestras altamente evasivas como Furtim.
Bluepill ha sido presentado en:
Para contrarrestar las evasiones de DBI, Bluepill utiliza una biblioteca de mitigaciones que escribimos para el pin Intel como parte de nuestro documento SOK: Uso de la instrumentación binaria dinámica para la seguridad (y cómo puede ser atrapado con las manos en la masa) de ASIACCS 2019. En BluePill, extendimos la biblioteca con mitigaciones adicionales para el tiempo por encima y las píldoras rojas que se dirigen a la interfaz de debilitamiento remoto GDB GDB. Puede leer más sobre las evasiones de DBI en el documento que evalúa los sistemas de instrumentación binaria dinámica para características y artefactos conspicuos recientemente apareció en ACM DTRAP (preimpresión).
A continuación, una lista parcial de las Evasions BluePill contrarrestada en nuestras pruebas en una máquina Virtualbox 5.2 de 32 bits Windows 7 SP1 para una gran cantidad de protectores ejecutables y muestras blindadas:
| Categoría | Instancias |
|---|---|
| Hipervisor | Adiciones de invitados, archivos, entradas de registro, bibliotecas y controladores de VirtualBox |
| Hardware | BIOS y cadenas de firmware, dirección MAC, cpuid , tamaño de disco, capacidades de energía/térmica |
| Tiempo | Detección de desaceleración utilizando rtdsc y API relacionadas con el tiempo de Windows |
| Software | Artifactos de herramientas de monitoreo comunes (procesos de ejecución, ventanas de la GUI), proceso principal, diseño de teclado HKL, cursor de mouse congelado |
| Depuración | Excepciones de un solo paso, int 2d , consultas de SO para depuradores activos/instalados (por ejemplo, NtQueryInformationProcess ), Campos de bloque de entrada de procesos |
| Consultas de WMI | CPU, tamaño del disco, dirección MAC, ACPI, MUI Languages, Virtualbox VBOXVIDEO |
| DBI | Posinter fugas con instrucciones de FPU, contenido de memoria y permisos (por ejemplo, páginas de guardia, NX Cumplimiento) |
Nota: Antes de hacer público para BH Europe 2019, realizamos cambios radicales que rompieron el manejo del código de 64 bits y (en cierta medida) del subsistema WOW64: considere estos escenarios experimentales a medida que completamos las pruebas de regresión y no dude en informar problemas.
Bluepill se basa en el pin Intel (recomendado V3.16) y requiere Visual Studio 2015 o superior para su compilación.
El PIN tiene algunas dependencias que requieren inclusión manual en el proyecto. Creamos un archivo Locals.props que simplifica la configuración del proyecto. Sus valores predeterminados se están instalando en C:Pin316 y los encabezados SDK 8.1 están en uso:
<PropertyGroup Label="UserMacros">
<PinFolder>C:Pin316</PinFolder>
<WinHPath>C:/Program Files (x86)/Windows Kits/8.1/Include/um</WinHPath>
</PropertyGroup>
Por ejemplo, si desea utilizar los encabezados SDK 10.0.17763.0, después de modificar la configuración del proyecto en Visual Studio, también debe cambiar el valor de la propiedad WinHPath a C:/Program Files/Windows Kits/10/Include/10.0.17763.0/um . Similar, modifique el valor de la propiedad si sus encabezados SDK 8.1 están instalados en C:/Program Files/ en lugar de C:/Program Files (x86)/ . El propósito de este campo es ayudar a PIN cuando incluye la ruta absoluta de Windows.h desde sus encabezados CRT.
Ahora debería poder compilar bluepill. Una vez que termine la compilación, encontrará una biblioteca bluepill32.dll en el directorio PIN. Si se encuentra con un error msvc_compat.h faltante, asegúrese de que $(PinFolder)extrascrtinclude sea una ruta válida.
Para ejecutar un ejecutable bajo el uso de bluepill:
C:Pin316pin.exe -t bluepill32.dll [options] -- <file.exe>
BluePill admite las siguientes opciones de línea de comandos:
| Opción | Significado |
|---|---|
-evasions | Detectar y manejar la mayoría de las evasiones compatibles (ver más abajo para DBI) |
-debugger | Habilitar el modo del depurador a través de la interfaz remota GDB |
-leak | Evasiones DBI: corrige fugas de EIP real (por ejemplo, instrucciones de FPU) |
-nx | Evasiones DBI: verifique que las páginas de código sean ejecutables |
-rw | Evasiones DBI: ocultar páginas que pertenecen al motor DBI |
Por ejemplo, para ejecutar un programa evasivo llamado sample.exe en un modo automático tipo Sandbox, intente:
C:Pin316pin.exe -t bluepill32.dll -evasions -leak -- sample.exe
Habilitar la mitigación -leak tiene un impacto de rendimiento mínimo, mientras que -nx y, en última instancia, -rw pueden ayudar con los empacadores complejos que intentan verificar la conformidad en el espacio de direcciones del programa.
BluePill creará un archivo llamado evasions.log en la carpeta de pin C:Pin316 (modifique la variable LOGPATH dentro de pintoolsrclogging.h para cambiarlo) que registra los posibles intentos de evasión interceptados durante la ejecución.
Bluepill admite el uso de un depurador para controlar la ejecución y llevar a cabo la disección de malware. Confiamos en la interfaz remota GDB de PIN: Bluepill se puede usar como un backend remoto de su herramienta de depuración si admite el protocolo GDB. A continuación, proporcionamos instrucciones para configurar una sesión de depuración con IDA Pro.
Para habilitar la interfaz del depurador, debe proporcionar opciones adicionales de línea de comandos tanto para PIN ( -appdebug -appdebug_server_port <port> ) como Bluepill ( -debugger ) como sigue:
C:Pin316pin.exe -appdebug —appdebug_server_port 10000 -t bluepill32.dll -debugger [other options] -- <file.exe>
Usaremos 10000 como número de puerto en esta guía. La aplicación permanecerá en pausa hasta que conecte un depurador al enchufe: sin embargo, si intenta adjuntar un depurador local al proceso, terminará depurando todo el motor PIN en lugar de solo la aplicación. La salida esperada en la pantalla será algo así como:

Ahora puede abrir el ejecutable en IDA y seleccionar el backend remoto del depurador GDB desde Debugger->Switch debugger . Compruebe que las opciones (por ejemplo, número de puerto) son correctas utilizando Debugger->Process options como en la captura de pantalla a continuación:

En este punto, ayuda a insertar un punto de ruptura en alguna dirección en la sección ejecutable principal, por ejemplo en el punto de entrada. Luego puede comenzar su sesión de depuración con Debugger->Start process . Ida le notificará que "ya hay un proceso depurado por remoto. ¿Quieres adjuntarlo?" . Simplemente haga clic en Sí y la sesión de depuración comenzará, con EIP en algún lugar dentro de NTDLL.DLL.
Dado que la información de mapeo de memoria no está disponible de forma predeterminada sobre el protocolo remoto GDB, agregamos un comando de depuración personalizado vmmap que instruye a BluePill a construir dicho mapa. Automatizamos este proceso con un script addSegments.py disponible en la scripts/ carpeta: simplemente cargándolo en Ida con File->Script file . El script llenará la subvisión de los segmentos de IDA con la información de diseño de memoria (es decir, secciones y sus permisos) para cada módulo de código. Nota: Pronto agregaremos código para actualizar la subvisión del módulo, que actualmente se mantiene obsoleto.
Ahora puede depurar su muestra mientras BluePill lo protege de muchas evasiones :-)
Tenga en cuenta que el manejo de excepciones requiere una solución para el soporte actual del servidor GDB en PIN. Cuando no se debe pasar una excepción a la aplicación (por ejemplo, 0xc0000008 para un mango no válido que se pasó a CloseHandle), envíe un comando wait en la consola GDB justo después de recibir el mensaje de excepción, luego desconecte y vuelva a conectar IDA a Bluepill. Mientras tanto, el ayudante del depurador mantendrá al ejecutable en espera en respuesta al comando.
Nota: Originalmente confiamos en el truco de desconexión también para otros tipos de excepción. Para ellos, los cambios recientemente introducidos en una liberación de PIN después del 3.5 One conducen a una falla de afirmación interna al volver a colocar el depurador ( A: sourcepinvmdebugger-connectiondebugger-connection.cpp: PINVM::DEBUGGER_CONNECTION::NotifyThreadsStopped: 1004: assertion failed: focus != PIN::INVALID_THREADID . Por lo tanto, cuando enfrenta, por ejemplo, una excepción 0xc0000005 de un Código de opciones int 3 o una evasión int 2d , debe pasar la excepción a la aplicación. La interfaz del depurador del PIN no se detectará directamente, pero el adversario aún puede hacerlo mediante el uso de un reloj de escritura. Actualmente estamos pensando en una solución para proteger tales artefactos también.
BluePill implementa una funcionalidad única para parchear una porción de código al depurarlo mientras lo oculta del código de ejecución. Un parche aplicado permanece invisible para los esquemas anti-manipulación (por ejemplo, secuencias de autosumisión de autosuficiencia), ya que está ligeramente junto con el mecanismo JIT del PIN. En pocas palabras, rehacemos la compilación JIT para agregar trampolines que anulen las instrucciones compiladas (originales) y pasamos desapercibidas por los mecanismos de protección de código, a medida que la memoria se lee se sigue siendo redirigida a las instrucciones del programa originales.
La creación de un parche se divide en tres pasos:
Considere el bloque de código en la imagen a continuación, y suponga que queremos sobrescribir la instrucción mov ebp, esp en la dirección 0x771X37A5 con una instrucción mov eax, esp ( 89 e0 en binario) y luego hacer reanudar la ejecución en la dirección 0x771X37A8 .

Cuando Bluepill funciona en modo depurador, podemos instruir PIN para parches a través de un comando GDB personalizado: set_<START_ADDR>_<END_ADDR>_<CONT_ADDR>_<PATCH_CODE_BYTES> , con direcciones expresadas como números hex y bytes de parche de código separados por una coma. Para el ejemplo anterior podemos usar: set_771c37a6_771c37a6_771c37a8_89,e0 .
Los parches se pueden eliminar simplemente utilizando otro comando GDB personalizado: rm_<START_ADDR>_<END_ADDR> .
Si está utilizando Bluepill en un proyecto académico o cree que se ajustaría a alguna sección de discusión en su artículo, estaríamos agradecidos si pudiera hacer referencia a nuestro trabajo utilizando la siguiente entrada de Bibtex:
@ARTICLE{BluePill,
author={D'Elia, Daniele Cono and Coppa, Emilio and Palmaro, Federico and Cavallaro, Lorenzo},
journal={IEEE Transactions on Information Forensics and Security},
title={On the Dissection of Evasive Malware},
year={2020},
volume={15},
number={},
pages={2750-2765},
doi={10.1109/TIFS.2020.2976559}}