Un exécutable compressé par UPX ne ressemble plus à un programme Visual Basic. Son point d'entrée est le petit décompresseur qu'UPX y a ajouté, ses sections sont compressées, l'en-tête du projet VB6 a disparu. Un décompilateur VB6 qui lit ces octets tels quels conclut, à juste titre, qu'il n'y trouve aucun programme VB6.

VBReFormer Gen2 (V7) ouvre désormais ces binaires comme les autres. Il les décompresse à l'ouverture, sans jamais les exécuter, puis reconstruit la structure du PE d'origine avant de l'analyser. Rien à préparer : déposez le fichier tel quel.

Un exécutable VB6 compressé par UPX, 14 Ko, ouvert dans VBReFormer Online : vue Assembleur avec les appels au runtime résolus
DemoNat.exe compressé par UPX 5.2.1 (14 Ko), ouvert dans VBReFormer Online : le projet est retrouvé et les appels au runtime (__vbaVarDup, __vbaVarMod) sont nommés, preuve que la table d'imports a été reconstruite.

Décompresser sans exécuter

La méthode habituelle pour se débarrasser d'UPX consiste à lancer le programme et à le laisser se décompresser en mémoire, ou à passer par un outil externe. Sur un binaire dont on ignore l'origine, et a fortiori sur un malware, lancer le programme n'est pas une option.

VBReFormer fait tout le travail de manière statique : le décompresseur d'UPX n'est jamais exécuté, aucun processus n'est lancé, rien n'est émulé. Le binaire est lu comme une donnée, décompressé, puis analysé. C'est la règle de tout le produit : VBReFormer n'exécute jamais ce qu'il analyse.

La décompression se fait à l'ouverture du binaire, une seule fois, et sert à toutes les vues. Elle est bornée en taille et en durée : un fichier forgé ne peut pas décider de la mémoire ni du temps consacrés à son analyse.

Reconstruire la structure du PE

Décompresser les sections ne suffit pas : pour être lisible, l'image doit redevenir un PE cohérent, avec ses sections, ses en-têtes et sa table d'imports. C'est ce que vérifie notre mesure : l'image reconstruite par VBReFormer est comparée, octet par octet, à celle que produit upx -d, l'outil officiel d'UPX.

Mesure du 23 octobre 2026Résultat
Binaires compressés par UPX 5.2.1 et 3.96186
Images identiques à upx -d178
Images qui ne diffèrent que par l'horodatage d'export8 (DLL et OCX)
Échecs0

Il reste un point qu'UPX ne restitue pas, même avec upx -d : la table des noms d'imports (OriginalFirstThunk) revient vide. Un lecteur PE ordinaire perd alors toute la liste des fonctions importées, et avec elle les noms des appels au runtime MSVBVM60.DLL. VBReFormer reconstruit cette table avant de lire le binaire. Les appels redeviennent __vbaStrCat ou __vbaVarDup au lieu d'adresses anonymes. La correction vaut pour tout binaire, y compris un fichier que vous auriez déjà décompressé vous-même avec upx -d.

Le moteur délimite aussi la section de code à partir du répertoire d'imports, pour ne jamais prendre les données d'import d'une image décompressée pour du code.

Le même projet qu'avec l'original

La preuve qui compte est la sortie finale. Sur les 14 binaires de l'épreuve automatique, le projet exporté depuis la version compressée est identique, fichier par fichier et ligne par ligne, à celui exporté depuis le binaire d'origine. Ces 14 binaires couvrent le code natif et le P-code, des exécutables, des DLL ActiveX et des contrôles OCX.

Même résultat sur notre plus gros témoin, un exécutable de 9,35 Mo compressé en LZMA : 57 049 lignes de projet, identiques à celles de l'original.

Témoin de 9,35 MoDurée de la décompression
Compression NRV (réglage par défaut d'UPX)0,1 s
Compression LZMA0,65 s

Autrement dit, la décompression est imperceptible devant l'analyse elle-même.

Une seule session, sur l'image décompressée

Une fois le binaire décompressé, toute la session travaille sur l'image reconstruite : la source, le désassemblage, la carte du format et le correctif binaire. Une adresse affichée dans une vue est donc la même dans toutes les autres. Le nom du fichier et son empreinte restent ceux du fichier que vous avez déposé : c'est lui que vous analysez.

Pour qui, et où

  • Toutes les éditions, y compris sans licence. La décompression a lieu à l'ouverture du binaire, avant tout contrôle de licence : l'aperçu gratuit en profite comme les licences payantes.
  • Bureau et studio en ligne. Les deux passent par le même service d'analyse. Dans VBReFormer Online, il suffit de déposer le fichier.
  • Natif et P-code, EXE, DLL et OCX.

Ce que VBReFormer dit quand il ne peut pas

Un binaire reconnu comme compressé par UPX, mais que VBReFormer ne parvient pas à décompresser, est analysé tel quel, avec un avertissement qui donne la raison. Vous ne lisez donc pas « ce n'est pas un programme VB6 » quand la vraie réponse est « c'est un programme VB6 compressé que je n'ai pas pu ouvrir ».

Les autres packers et protecteurs sont reconnus et nommés à l'ouverture : ASPack, PECompact, MPRESS, FSG, MEW, Upack, NsPack, PEtite, Themida, VMProtect, Armadillo, ASProtect et Enigma. Ils ne sont pas encore décompressés, mais vous savez à quoi vous avez affaire au lieu d'un simple refus.

Après UPX viendront ASPack, MPRESS et PECompact, avec la même décompression intégrée, sans exécution. Les protecteurs comme Themida ou VMProtect resteront reconnus et nommés, mais jamais exécutés : les lever exigerait de faire tourner le binaire, ce que VBReFormer ne fait pas.

Pourquoi c'est important

UPX est l'un des packers les plus répandus, dans les logiciels légitimes comme dans les malwares. Pour la récupération de code, c'est un vieil exécutable dont personne ne se rappelait qu'il avait été compressé. Pour l'analyse de malware, c'est l'une des premières couches que l'on rencontre sur un binaire Visual Basic 6 : nous en parlions dans Pourquoi les campagnes de malware reviennent au Visual Basic 6. Dans les deux cas, la réponse est désormais la même : déposez le fichier, VBReFormer s'occupe du reste.

Essayer