Analyse de rétro-ingénierie de Formbook, un info-stealer qui utilise la manipulation d'assembly .NET et le déchiffrement XOR. Charge utile complète extraite via x32dbg, incluant la boucle de déchiffrement XOR, l'initialisation du CLR, le leurre SQLExpress, et les API de keylogger/presse-papiers.
Le dump mémoire de x32dbg révèle que Formbook déchiffre ses données de configuration et alloue de la mémoire pour celles-ci à l'aide de NtAllocateVirtualMemory.
NtAllocateVirtualMemory – Alloue de la mémoire pour la charge utile déchiffrée.mov edx, dword ptr ds:[esi+1C] – Récupère la taille des données chiffrées depuis le registre ESI.push 0x1000 – Utilise MEM_COMMIT pour allouer de la mémoire.push 0 – Spécifie le type d'allocation ou l'indicateur de protection.mov edx, dword ptr ds:[esi+4] – Récupère une autre valeur de configuration.lea ecx, [ebp-4] – Charge un pointeur vers une variable locale.test ecx, ecx – Vérifie si le pointeur est valide.mov ecx, [esi+1C] – Récupère à nouveau la taille des données chiffrées.push 0x1000 – Répète l'indicateur MEM_COMMIT.push 0 – Répète l'indicateur d'allocation.ConnectionStrings – Clé de configuration .NET pour les adresses C2.system.data, DbProviderFactories – Sections de configuration .NET (probablement un leurre).system.serviceModel – Section du modèle de service .NET.<DbProviderFactories /> – Élément XML vide (leurre).ConnectionStrings contient probablement les URL C2.
Vue x32dbg montrant NtAllocateVirtualMemory et le déchiffrement de ConnectionStrings.
Cette vue x32dbg révèle que Formbook utilise la manipulation d'assembly .NET, le déchiffrement basé sur XOR et l'initialisation du CLR (Common Language Runtime) pour exécuter sa charge utile.
xor eax, eax – Efface EAX, indiquant un déchiffrement basé sur XOR.call 0x6C6E7F60 – Appelle une fonction de déchiffrement ou de traitement.call 0x6C6EE8B0 – Appelle une autre fonction de traitement.DllCanUnloadNowInternal – Gère le chargement/déchargement d'assembly .NET.PublicKeyToken=31bf3856ad364e35 – Usurpe l'identité d'un assembly Microsoft.system.serviceModel – Configuration du modèle de service .NET (communication C2).System.Web – Configuration web .NET (C2 basé sur HTTP).clr.NGenCreateNGenWorker – Crée un worker du Native Image Generator .NET.clr.GetCLRFunction – Récupère les fonctions CLR.return to clr.Initialize – Initialise le runtime .NET.xor eax, eax et les fonctions call suivantes confirment un déchiffrement basé sur XOR.PublicKeyToken lui donne l'apparence d'un assembly Microsoft.system.serviceModel et System.Web stockent les paramètres C2.
Vue x32dbg montrant le déchiffrement XOR, DllCanUnloadNowInternal et l'initialisation du CLR.
Cette vue x32dbg révèle que Formbook utilise une chaîne liée à SQLExpress comme leurre et initialise le CLR .NET pour exécuter sa charge utile.
L"ce=..\SQLEXPR" – Une chaîne leurre, sans rapport avec le vol de données SQL. Elle est utilisée pour faire passer le malware pour un composant légitime de SQL Server Expressclr.InitializeFusion – Initialise le chargeur d'assembly .NET Fusion, utilisé pour charger la charge utile .NET en mémoire.clr.GetCLRFunction – Récupère les fonctions CLR pour exécuter du code managé.clr.NGenCreateNGenWorker – Crée un worker du Native Image Generator .NET, permettant à la charge utile de s'exécuter sans compilation JIT.return to clr.InitializeFusion+1751 – Retourne à la routine d'initialisation du CLR.SQLEXPR est un leurre pour échapper à la détection par les outils de sécurité.
Vue x32dbg montrant L"ce=..\SQLEXPR", clr.InitializeFusion et les fonctions CLR.
Cette vue x32dbg révèle le début de la charge utile de Formbook, située après le message standard du stub DOS du PE. Le malware utilise une boucle de déchiffrement XOR pour déchiffrer sa charge utile en mémoire.
This program cannot be run in DOS mode – Message standard du stub DOS du PE.xor dword ptr ds:[edi], eax – Applique un XOR sur les données à EDI avec EAX (déchiffrement).mov al, byte ptr ds:[edi+1] – Charge un octet depuis EDI+1 dans AL.xor al, byte ptr ds:[edx+1] – Applique un XOR sur AL avec l'octet à EDX+1 (clé de déchiffrement).mov byte ptr ds:[edi], al – Réécrit l'octet déchiffré à EDI.call ntdll.77DDE45C – Appelle RtlIsCurrentThreadAttachExempt (anti-débogage).cmp dword ptr ds:[esi+4], 0 – Vérifie si le compteur (ESI+4) est à zéro.sub dword ptr ds:[esi+4], eax – Décrémente le compteur.test edx, edx – Teste EDX pour zéro.jne ntdll.77DDF9F4 – Revient en boucle si non nul (boucle de déchiffrement).RtlIsCurrentThreadAttachExempt pour échapper aux débogueurs.
Vue x32dbg montrant la boucle de déchiffrement XOR après le message standard du stub DOS du PE.
L'analyse Binary Ninja de la charge utile extraite révèle une liste complète d'API utilisées par Formbook pour le keylogging, le détournement du presse-papiers et l'élévation de privilèges.