BluePill est un cadre d'analyse dynamique open source pour gérer les logiciels malveillants évasifs. Son objectif est de concilier les propriétés de transparence nécessaires pour les analyses automatiques avec les capacités d'inspection et de correction d'exécution à grains fins requis pour l'analyse manuelle.
Bluepill est un prototype académique que nous maintenons pendant notre temps libre: vos commentaires sont précieux!
Bluepill peut contrer de nombreuses pilules rouges ciblant les hyperviseurs, les débogueurs, les outils tiers et les artefacts de synchronisation. Il s'appuie sur l'instrumentation binaire dynamique (DBI) pour surveiller les questions que les logiciels malveillants peuvent faire sur l'environnement à la recherche d'artefacts, modifiant leurs résultats lorsqu'ils peuvent révéler la présence d'un système d'analyse automatisé ou d'un agent humain. BluePill propose une interface distante GDB pour déboguer un échantillon tout en prenant soin des évasions du nom des analystes, ainsi que de nouveaux mécanismes de correctifs furtifs pour masquer les modifications de code apportées au débogueur à partir des schémas d'auto-retouche.
Nous avons testé BluePill sur des logiciels malveillants Windows hétérogènes PE32 fonctionnant sur Windows 7 SP1 32 bits: Par exemple, nous pouvons exécuter des exécutables protégés par des versions récentes de VMProtect et d'IMIDA et des échantillons très évasifs comme Furtim.
Bluepill a été présenté dans:
Pour contrer les évasions DBI, BluePill utilise une bibliothèque d'atténuations que nous avons écrites pour Intel Pin dans le cadre de notre article SOK: en utilisant une instrumentation binaire dynamique pour la sécurité (et comment vous pouvez vous faire prendre en flagrant délit) à partir de l'ASICCS 2019. Dans Bluepill, nous avons étendu la bibliothèque avec des mititiments supplémentaires pour les ancêtres et les pilules rouges GDB. Vous pouvez en savoir plus sur les évasions DBI dans l'article évaluant les systèmes d'instrumentation binaire dynamique pour des caractéristiques et des artefacts remarquables récemment apparus dans ACM DTRAP (préimprimée).
Ci-dessous une liste partielle des évasions Bluepill contré dans nos tests sur une machine VirtualBox 5.2 de Windows 7 SP1 32 bits pour une grande partie de protecteurs exécutables et d'échantillons blindés:
| Catégorie | Instances |
|---|---|
| Hyperviseur | Ajouts invités, fichiers, entrées de registre, bibliothèques et pilotes de VirtualBox |
| Matériel | BIOS et chaînes de firmware, adresse MAC, cpuid , taille du disque, puissance / capacités thermiques |
| Temps | Détection de ralentissement à l'aide des API liées au temps rtdsc et Windows |
| Logiciel | Artefacts d'outils de surveillance courants (processus en cours d'exécution, fenêtres de l'interface graphique), processus parent, disposition du clavier HKL, curseur de souris gelé |
| Débogage | Exceptions en une seule étape, int 2d , requêtes OS pour les débogueurs actifs / installés (par exemple, NtQueryInformationProcess ), les champs de blocs d'entrée de processus |
| Requêtes WMI | CPU, taille du disque, adresse MAC, ACPI, langues MUI, VirtualBox VBOXVIDEO |
| DBI | Les fuites du pointeur avec les instructions FPU, le contenu de la mémoire et les autorisations (par exemple, les pages de garde, NX applique) |
Remarque: Avant de devenir public pour BH Europe 2019, nous avons apporté des modifications radicales qui ont brisé la gestion du code 64 bits et (dans une petite mesure) du sous-système WOW64: veuillez considérer ces scénarios expérimentaux lorsque nous terminons les tests de régression et n'hésitez pas à signaler les problèmes.
BluePill s'appuie sur Intel PIN (V3.16 recommandé) et nécessite Visual Studio 2015 ou plus pour sa compilation.
PIN a certaines dépendances qui nécessitent une inclusion manuelle dans le projet. Nous avons créé un fichier Locals.props qui simplifie la configuration du projet. Ses valeurs par défaut sont l'installation de PIN en C:Pin316 et les en-têtes SDK 8.1 en cours d'utilisation:
<PropertyGroup Label="UserMacros">
<PinFolder>C:Pin316</PinFolder>
<WinHPath>C:/Program Files (x86)/Windows Kits/8.1/Include/um</WinHPath>
</PropertyGroup>
Par exemple, si vous souhaitez utiliser les en-têtes SDK 10.0.17763.0, après avoir modifié les paramètres du projet dans Visual Studio, vous devez également modifier la valeur de la propriété WinHPath en C:/Program Files/Windows Kits/10/Include/10.0.17763.0/um . SIMILARY, modifiez la valeur de la propriété si vos en-têtes SDK 8.1 sont installés dans C:/Program Files/ au lieu de C:/Program Files (x86)/ . Le but de ce champ est d'aider PIN lorsqu'il comprend le chemin absolu de Windows.h à partir de ses en-têtes CRT.
Vous devriez maintenant pouvoir compiler BluePill. Une fois la compilation se terminera, vous trouverez une bibliothèque bluepill32.dll dans le répertoire PIN. Si vous rencontrez une erreur msvc_compat.h manquante, assurez-vous que $(PinFolder)extrascrtinclude est un chemin valide.
Pour exécuter un exécutable sous BluePill Utilisation:
C:Pin316pin.exe -t bluepill32.dll [options] -- <file.exe>
BluePill prend en charge les options de ligne de commande suivantes:
| Option | Signification |
|---|---|
-evasions | Détecter et gérer la majorité des évasions soutenues (voir ci-dessous pour DBI) |
-debugger | Activer le mode débogueur via l'interface distante GDB |
-leak | Évasions DBI: corriger les fuites de réel EIP (par exemple, instructions FPU) |
-nx | Évasions DBI: Vérifiez que les pages de code sont exécutables |
-rw | Évasions DBI: masquez des pages qui appartiennent au moteur DBI |
Par exemple, pour exécuter un programme évasif nommé sample.exe dans un mode automatique de type bac à sable: essayez:
C:Pin316pin.exe -t bluepill32.dll -evasions -leak -- sample.exe
L'activation de l'atténuation -leak a un impact sur les performances minimal, tandis que -nx et finalement -rw peuvent aider avec des packers complexes qui tentent de vérifier la conformité sur l'espace d'adresse du programme.
BluePill créera un fichier nommé evasions.log sous le dossier de Pin C:Pin316 (modifiez la variable LOGPATH à l'intérieur pintoolsrclogging.h pour le modifier) que les journaux d'évasion possibles tentative d'interception pendant l'exécution.
BluePill prend en charge l'utilisation d'un débogueur pour contrôler l'exécution et effectuer une dissection de logiciels malveillants. Nous comptons sur l'interface distante GDB de PIN: Bluepill peut donc être utilisée comme backend distant de votre outil de débogueur s'il prend en charge le protocole GDB. Dans ce qui suit, nous fournissons des instructions pour mettre en place une session de débogage avec IDA Pro.
Pour activer l'interface de débogueur, vous devez fournir des options de ligne de commande supplémentaires à la fois ( -appdebug -appdebug_server_port <port> ) et bluepill ( -debugger ) comme suit:
C:Pin316pin.exe -appdebug —appdebug_server_port 10000 -t bluepill32.dll -debugger [other options] -- <file.exe>
Nous utiliserons 10000 comme numéro de port dans ce guide. L'application restera en pause jusqu'à ce que vous connectez un débogueur à la prise: cependant, si vous essayez de fixer un débogueur local au processus, vous finirez par déboguer tout le moteur à broches au lieu de l'application. La sortie attendue à l'écran sera quelque chose comme:

Vous pouvez désormais ouvrir l'exécutable dans IDA et sélectionner le backend de débogueur GDB distant de Debugger->Switch debugger . Vérifiez que les options (par exemple le numéro de port) sont correctes en utilisant Debugger->Process options comme dans la capture d'écran ci-dessous:

À ce stade, il aide à insérer un point d'arrêt sur une adresse dans la section exécutable principale, par exemple sur le point d'entrée. Ensuite, vous pouvez démarrer votre session de débogage avec Debugger->Start process . IDA vous informera que "il y a déjà un processus débogué par la distance. Voulez-vous vous attacher?" . Cliquez simplement sur oui et la session de débogage commencera, EIP étant quelque part à l'intérieur dans ntdll.dll.
Étant donné que les informations de mappage de mémoire ne sont pas disponibles par défaut sur le protocole distant GDB, nous avons ajouté une commande de débogueur personnalisée vmmap qui demande à BluePill de créer une telle carte. Nous avons automatisé ce processus avec un script addSegments.py disponible dans le dossier scripts/ : Chargez-le simplement en IDA avec File->Script file . Le script remplira la sous-vue de segments d'IDA avec les informations de mise en page de mémoire (c.-à-d. Les sections et leurs autorisations) pour chaque module de code. Remarque: nous allons bientôt ajouter du code pour mettre à jour le sous -vis du module, qui reste actuellement périmé.
Vous pouvez désormais déboguer votre échantillon car Bluepill vous protège à partir de beaucoup d'évasions :-)
Veuillez noter que la gestion des exceptions nécessite une solution de contournement pour la prise en charge actuelle du serveur GDB dans PIN. Lorsqu'une exception ne doit pas être transmise à l'application (par exemple, 0xc0000008 pour une poignée non valide passée à CloseHandle), envoyez une commande wait dans la console GDB juste après avoir reçu le message d'exception, puis déconnectez et reconnectez IDA à BluePill. En attendant, le débogueur Helper gardera l'exécutable en attente en réponse à la commande.
Remarque: Nous nous sommes également appuyés sur l'astuce de déconnexion pour d'autres types d'exceptions. Pour eux, des modifications nouvellement introduites dans une version de PIN après le 3,5 One ont conduit à une panne de affirmation interne lors de la réduction du débogueur ( A: sourcepinvmdebugger-connectiondebugger-connection.cpp: PINVM::DEBUGGER_CONNECTION::NotifyThreadsStopped: 1004: assertion failed: focus != PIN::INVALID_THREADID ). Par conséquent, lorsque vous affrontez, par exemple une exception 0xc0000005 à partir d'un opcode int 3 ou d'une évasion int 2d , vous passez l'exception à l'application. L'interface de débogueur de PIN ne sera pas détectée directement, mais l'adversaire peut toujours le faire en utilisant une montre d'écriture. Nous pensons actuellement à une solution de contournement pour protéger ces artefacts.
BluePill implémente une fonctionnalité unique pour corriger une partie de code lors du débogage tout en le cachant à partir du code d'exécution. Un patch appliqué reste invisible à des schémas anti-séquençants (par exemple, par exemple, les séquences d'auto-cocherdification) car elle est entièrement couplée au mécanisme JIT de la PIN. En un mot, nous refaisons la compilation JIT pour ajouter des trampolines qui remplacent les instructions compilées (d'origine) et passez inaperçues par les mécanismes de protection du code, car la mémoire se lit continue d'être redirigé vers les instructions du programme d'origine.
La création d'un patch est divisée en trois étapes:
Considérez le bloc de code dans l'image ci-dessous et supposons que nous voulons écraser l' mov ebp, esp à l'adresse 0x771X37A5 avec une instruction mov eax, esp ( 89 e0 en binaire), puis effectuez une reprise d'exécution à l'adresse 0x771X37A8 .

Lorsque BluePill fonctionne en mode débogueur, nous pouvons instruire la broche pour les correctifs via une commande GDB personnalisée: set_<START_ADDR>_<END_ADDR>_<CONT_ADDR>_<PATCH_CODE_BYTES> , avec des adresses exprimées en numéros hex Pour l'exemple ci-dessus, nous pouvons utiliser: set_771c37a6_771c37a6_771c37a8_89,e0 .
Les correctifs peuvent alors être supprimés à l'aide d'une autre commande GDB personnalisée: rm_<START_ADDR>_<END_ADDR> .
Si vous utilisez BluePill dans un projet académique ou si vous croyez qu'il conviendrait à une section de discussion dans votre article, nous serions reconnaissants si vous pouviez faire référence à notre travail en utilisant l'entrée Bibtex suivante:
@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}}