Les classeurs Excel contiennent des macros pour enrichir leurs fonctionnalités. Elles sont écrites en Visual Basic for Applications (VBA) qui est un langage de script existant depuis 30 ans. Il est commun de vouloir protéger le code source VBA par un mot de passe pour le cacher volontairement ou simplement empêcher les utilisateurs professionnels d'interférer avec le contenu. Voyons comment retirer cette fausse protection, car il y a des cas particuliers.
Que se passe-t-il lorsque votre développeur quitte l'entreprise avec le mot de passe du fichier ? Mieux, vous avez reçu un fichier suspect par email et, en tant que responsable cyber-sécurité, vous devez analyser son contenu.
Ce mot de passe demandé est une fausse protection, car même sans le connaître, Office est capable d'exécuter les macros sans sourciller. Si le mot de passe était impliqué dans le chiffrement du code VBA, ce dernier ne serait exécutable qu'à la condition d'avoir le bon mot de passe. Comme ça n'est pas le cas, le logiciel de bureautique conditionne en réalité l'affichage du code source à la saisie valide du mot de passe valide.
Les fichiers Excel avec macros ont pour extension .xlsm
. Il s'agit d'un fichier ZIP contenant les différentes parties du classeur dans un format dit Office Open XML. Un des nombreux fichiers nous intéresse : xl\vbaProject.bin
. C'est dedans que sont stockées les macros et l'empreinte du mot de passe.
Cet article est la traduction fonctionnelle de cet autre article mais il ne nécessite pas d'installation de logiciels tiers.
L'idée de brute forcer le mot de passe est trop gourmande en temps et en ressources. Une autre idée est de remplacer les empreintes par celles d'un mot de passe connu (non testé et à condition que le contenu n'en dépende pas). Enfin, la dernière idée est de perturber la lecture de l'empreinte du mot de passe pour qu'Office passe en mode de récupération.
Tout d'abord, sauvegardez le script suivant dans un fichier unlock.vbs
. Ce n'est pas la version la plus élégante du siècle, ni la plus optimisée.
' Variables filename = "C:\dossier_à_modifier\vbaProject.bin" rechercher = "DPB=" remplacer = "DPx=" ' Recherche de la position des données à modifier Set fs = CreateObject("Scripting.FileSystemObject") Set fh = fs.GetFile(filename) With fh.OpenAsTextStream() data = .ReadAll() .Close End With position = InStr(data, "DPB=") ' Relecture des blocs à la bonne taille, car la fonction Mid malforme les données Set fh = fs.GetFile(filename) With fh.OpenAsTextStream() data1 = .Read(position - 1) data2 = .Read(Len(rechercher)) data3 = .ReadAll() .Close End With ' Sauvegarde des modifications With fs.createTextFile(filename & ".new") .Write (data1) .Write (remplacer) ' et non pas data2 .Write (data3) .Close End With
Ouvrez le fichier XLSM avec votre gestionnaire ZIP favori (7-Zip, WinZip, WinRar...). Si vous n'avez rien d'autre que l'explorateur de fichiers de Windows pour afficher les fichiers compressés, renommez le fichier .xlsm
en .zip
.
Extrayez le fichier xl\vbaProject.bin
dans le dossier où se trouve le script VBS ci-dessus. Modifiez la variable filename
du script pour pointer de façon absolue vers le fichier BIN extrait. Lancez le script VBS en double-cliquant dessus. Un nouveau fichier est généré avec l'extension .bin.new
.
La valeur ajoutée de ce script est de ne pas avoir à installer un éditeur héxadécimal tiers. Par ailleurs, en contexte professionnel, le VBS est certainement le seul langage de script qui soit installé par défaut pour tous les utilisateurs. Ainsi n'aurez-vous pas besoin d'installer Python ou des utilitaires Linux en ligne de commande pour faire la même opération.
Modifiez enfin l'archive Excel pour remplacer le fichier xl\vbaProject.bin
par le nouveau fichier obtenu. Gardez le nom d'origine bien entendu.
Votre fichier XLSM corrigé est prêt. Ouvrez-le, puis allez dans l'éditeur VBA avec Alt+F11. Ignorez les messages d'erreurs, modifiez le mot de passe du projet pour en mettre un nouveau, sauvegardez, retirez le mot de passe du projet, sauvegardez.
Le mot de passe n'est désormais plus demandé et vous pouvez analyser les détails du fichier.