Análisis de ingeniería inversa de Formbook, un info-stealer que utiliza manipulación de ensamblados .NET y descifrado XOR. Payload completo extraído mediante x32dbg, incluyendo el bucle de descifrado XOR, la inicialización del CLR, el señuelo SQLExpress y las API de keylogger/portapapeles.
El volcado de memoria de x32dbg revela que Formbook descifra sus datos de configuración y asigna memoria para ellos utilizando NtAllocateVirtualMemory.
NtAllocateVirtualMemory – Asigna memoria para la carga útil descifrada.mov edx, dword ptr ds:[esi+1C] – Recupera el tamaño de los datos cifrados desde el registro ESI.push 0x1000 – Utiliza MEM_COMMIT para asignar memoria.push 0 – Especifica el tipo de asignación o el indicador de protección.mov edx, dword ptr ds:[esi+4] – Recupera otro valor de configuración.lea ecx, [ebp-4] – Carga un puntero a una variable local.test ecx, ecx – Comprueba si el puntero es válido.mov ecx, [esi+1C] – Recupera de nuevo el tamaño de los datos cifrados.push 0x1000 – Repite el indicador MEM_COMMIT.push 0 – Repite el indicador de asignación.ConnectionStrings – Clave de configuración de .NET para direcciones C2.system.data, DbProviderFactories – Secciones de configuración de .NET (probablemente señuelos).system.serviceModel – Sección del modelo de servicio de .NET.<DbProviderFactories /> – Elemento XML vacío (señuelo).ConnectionStrings probablemente contiene las URL de C2.
Vista de x32dbg mostrando NtAllocateVirtualMemory y el descifrado de ConnectionStrings.
Esta vista de x32dbg revela que Formbook utiliza la manipulación de ensamblados .NET, el descifrado basado en XOR y la inicialización del CLR (Common Language Runtime) para ejecutar su carga útil.
xor eax, eax – Limpia EAX, lo que indica un descifrado basado en XOR.call 0x6C6E7F60 – Llama a una función de descifrado o procesamiento.call 0x6C6EE8B0 – Llama a otra función de procesamiento.DllCanUnloadNowInternal – Gestiona la carga y descarga de ensamblados .NET.PublicKeyToken=31bf3856ad364e35 – Suplanta a un ensamblado de Microsoft.system.serviceModel – Configuración del modelo de servicio de .NET (comunicación C2).System.Web – Configuración web de .NET (C2 basado en HTTP).clr.NGenCreateNGenWorker – Crea un trabajador del Generador de imágenes nativas de .NET.clr.GetCLRFunction – Recupera funciones del CLR.return to clr.Initialize – Inicializa el runtime de .NET.xor eax, eax y las funciones call posteriores confirman el descifrado basado en XOR.PublicKeyToken hace que parezca un ensamblado de Microsoft.system.serviceModel y System.Web almacenan la configuración de C2.
Vista de x32dbg mostrando el descifrado XOR, DllCanUnloadNowInternal y la inicialización del CLR.
Esta vista de x32dbg revela que Formbook utiliza una cadena relacionada con SQLExpress como señuelo e inicializa el CLR de .NET para ejecutar su carga útil.
L"ce=..\SQLEXPR" – Una cadena señuelo, no relacionada con el robo de datos de SQL. Se utiliza para hacer que el malware parezca un componente legítimo de SQL Server Expressclr.InitializeFusion – Inicializa el cargador de ensamblados Fusion de .NET, que se utiliza para cargar la carga útil de .NET en memoria.clr.GetCLRFunction – Recupera funciones del CLR para ejecutar código administrado.clr.NGenCreateNGenWorker – Crea un trabajador del Generador de imágenes nativas de .NET, lo que permite que la carga útil se ejecute sin compilación JIT.return to clr.InitializeFusion+1751 – Regresa a la rutina de inicialización del CLR.SQLEXPR es un señuelo para evadir la detección por parte de herramientas de seguridad.
Vista de x32dbg mostrando L"ce=..\SQLEXPR", clr.InitializeFusion y funciones del CLR.
Esta vista de x32dbg revela el inicio de la carga útil de Formbook, ubicada después del mensaje estándar del stub DOS del PE. El malware utiliza un bucle de descifrado XOR para descifrar su carga útil en memoria.
This program cannot be run in DOS mode – Mensaje estándar del stub DOS del PE.xor dword ptr ds:[edi], eax – Aplica XOR a los datos en EDI con EAX (descifrado).mov al, byte ptr ds:[edi+1] – Carga un byte desde EDI+1 en AL.xor al, byte ptr ds:[edx+1] – Aplica XOR a AL con el byte en EDX+1 (clave de descifrado).mov byte ptr ds:[edi], al – Escribe el byte descifrado de vuelta en EDI.call ntdll.77DDE45C – Llama a RtlIsCurrentThreadAttachExempt (anti-depuración).cmp dword ptr ds:[esi+4], 0 – Comprueba si el contador (ESI+4) es cero.sub dword ptr ds:[esi+4], eax – Decrementa el contador.test edx, edx – Comprueba si EDX es cero.jne ntdll.77DDF9F4 – Vuelve atrás si no es cero (bucle de descifrado).RtlIsCurrentThreadAttachExempt para evadir depuradores.
Vista de x32dbg mostrando el bucle de descifrado XOR después del mensaje estándar del stub DOS del PE.
El análisis de Binary Ninja de la carga útil extraída revela una lista completa de API utilizadas por Formbook para el registro de pulsaciones, el secuestro del portapapeles y la escalada de privilegios.