Análise de engenharia reversa do Formbook, um info-stealer que utiliza manipulação de assembly .NET e descriptografia XOR. Payload completo extraído via x32dbg, incluindo o loop de descriptografia XOR, inicialização do CLR, isca SQLExpress e APIs de keylogger/clipboard.
O dump de memória do x32dbg revela que o Formbook descriptografa seus dados de configuração e aloca memória para eles usando NtAllocateVirtualMemory.
NtAllocateVirtualMemory – Aloca memória para o payload descriptografado.mov edx, dword ptr ds:[esi+1C] – Recupera o tamanho dos dados criptografados do registrador ESI.push 0x1000 – Usa MEM_COMMIT para alocar memória.push 0 – Especifica o tipo de alocação ou flag de proteção.mov edx, dword ptr ds:[esi+4] – Recupera outro valor de configuração.lea ecx, [ebp-4] – Carrega um ponteiro para uma variável local.test ecx, ecx – Verifica se o ponteiro é válido.mov ecx, [esi+1C] – Recupera novamente o tamanho dos dados criptografados.push 0x1000 – Repete a flag MEM_COMMIT.push 0 – Repete a flag de alocação.ConnectionStrings – Chave de configuração .NET para endereços de C2.system.data, DbProviderFactories – Seções de configuração .NET (provavelmente iscas).system.serviceModel – Seção de modelo de serviço .NET.<DbProviderFactories /> – Elemento XML vazio (isca).ConnectionStrings provavelmente contém URLs de C2.
Visão do x32dbg mostrando NtAllocateVirtualMemory e a descriptografia de ConnectionStrings.
Esta visão do x32dbg revela que o Formbook usa manipulação de assembly .NET, descriptografia baseada em XOR e inicialização do CLR (Common Language Runtime) para executar seu payload.
xor eax, eax – Limpa EAX, indicando descriptografia baseada em XOR.call 0x6C6E7F60 – Chama uma função de descriptografia ou processamento.call 0x6C6EE8B0 – Chama outra função de processamento.DllCanUnloadNowInternal – Gerencia o carregamento/descarregamento de assembly .NET.PublicKeyToken=31bf3856ad364e35 – Personifica um assembly da Microsoft.system.serviceModel – Configuração do modelo de serviço .NET (comunicação C2).System.Web – Configuração web .NET (C2 baseado em HTTP).clr.NGenCreateNGenWorker – Cria um worker do .NET Native Image Generator.clr.GetCLRFunction – Recupera funções do CLR.return to clr.Initialize – Inicializa o runtime .NET.xor eax, eax e as chamadas call subsequentes confirmam a descriptografia baseada em XOR.PublicKeyToken faz com que pareça um assembly da Microsoft.system.serviceModel e System.Web armazenam configurações de C2.
Visão do x32dbg mostrando descriptografia XOR, DllCanUnloadNowInternal e inicialização do CLR.
Esta visão do x32dbg revela que o Formbook usa uma string relacionada a SQLExpress como isca e inicializa o CLR .NET para executar seu payload.
L"ce=..\SQLEXPR" – Uma string de isca, não relacionada a roubo de dados SQL. É usada para fazer o malware parecer um componente legítimo do SQL Server Expressclr.InitializeFusion – Inicializa o carregador de assembly .NET Fusion, que é usado para carregar o payload .NET na memória.clr.GetCLRFunction – Recupera funções do CLR para executar código gerenciado.clr.NGenCreateNGenWorker – Cria um worker do .NET Native Image Generator, permitindo que o payload seja executado sem compilação JIT.return to clr.InitializeFusion+1751 – Retorna à rotina de inicialização do CLR.SQLEXPR é uma isca para evitar detecção por ferramentas de segurança.
Visão do x32dbg mostrando L"ce=..\SQLEXPR", clr.InitializeFusion e funções do CLR.
Esta visão do x32dbg revela o início do payload do Formbook, localizado após a mensagem padrão do stub DOS do PE. O malware usa um loop de descriptografia XOR para descriptografar seu payload em memória.
This program cannot be run in DOS mode – Mensagem padrão do stub DOS do PE.xor dword ptr ds:[edi], eax – Aplica XOR nos dados em EDI com EAX (descriptografia).mov al, byte ptr ds:[edi+1] – Carrega um byte de EDI+1 em AL.xor al, byte ptr ds:[edx+1] – Aplica XOR em AL com o byte em EDX+1 (chave de descriptografia).mov byte ptr ds:[edi], al – Escreve o byte descriptografado de volta em EDI.call ntdll.77DDE45C – Chama RtlIsCurrentThreadAttachExempt (anti-debug).cmp dword ptr ds:[esi+4], 0 – Verifica se o contador (ESI+4) é zero.sub dword ptr ds:[esi+4], eax – Decrementa o contador.test edx, edx – Testa EDX para zero.jne ntdll.77DDF9F4 – Retorna se não for zero (loop de descriptografia).RtlIsCurrentThreadAttachExempt para evitar depuradores.
Visão do x32dbg mostrando o loop de descriptografia XOR após a mensagem padrão do stub DOS do PE.
A análise do Binary Ninja do payload extraído revela uma lista abrangente de APIs usadas pelo Formbook para keylogging, sequestro da área de transferência e escalação de privilégios.