
Script python IDA pour désobfusquer la DLL injecteur Astaroth/Guildma
Script Python d'IDA pour désobfusquer la DLL injecteur Astaroth/Guildma
En essayant d'analyser la DLL injecteur d'une récente campagne Astaroth/Guildma (grâce à ce journal du SANS ISC), je suis tombé sur une tentative d'obfuscation vraiment agaçante.
Une fonction (que j'ai nommée time_waster_3000 sur l'image ci-dessous) est appelée plus de 1 000 fois (!!!) dans toute la DLL. Cette fonction prend six chaînes codées en dur comme arguments, ainsi qu'un word aléatoire. La fonction elle-même est un dédale d'opérations arithmétiques qui ne servent à aucune fin pratique pour autant que je puisse en juger (si ce n'est à faire perdre du temps à un reverser). Voici à quoi ressemble DLLEntry avec ces agaçants appels en place :
Le but de ce script Python d'IDA est de masquer tous les blocs de code qui impliquent un appel à cette fonction parasite, ainsi que ses arguments. Voici à quoi ressemble DLLEntry après l'exécution du script :
Le script fonctionne en trouvant un appel à la fonction de bourrage, représentée par call sub_CHANGEME dans le script. Par conséquent, vous devez la renommer dans le script avec le nom de fonction trouvé sur l'échantillon que vous traitez. Par exemple, changer idc.print_operand(x, 0) == 'sub_CHANGEME' en idc.print_operand(x, 0) == 'sub_431000'.
J'ai choisi d'itérer sur l'instruction call sub_CHANGEME plutôt que sur les pushs d'arguments. La raison est simple : les chaînes codées en dur sont présentes à plusieurs endroits dans le binaire ; par conséquent, lorsque j'ai essayé de rechercher par instructions push impliquant les offsets de ces chaînes, le script ne trouvait pas toutes les instances de ces données parasites.
Le script fonctionnait à l'origine en masquant chaque instance du passage d'arguments et de l'appel à la fonction de bourrage comme un bloc replié. Comme la fonction est appelée plusieurs fois d'affilée, cela entraînait d'énormes espaces vides dans la vue de désassemblage. Je l'ai mis à jour pour masquer les instances séquentielles de ce bourrage dans un seul bloc replié, ce qui améliore vraiment la lisibilité.