Trouver son mot de passe Excel

Vous avez protégé une spreadsheet Excel avec un mot de passe, et pas moyen de le retrouver. Ce script permet d’utiliser la technique appelée Brute Force pour le récupérer.

En fonction de la taille du mot de passe, il se pourrait que ça prenne très longtemps, voire trop longtemps, donc ceci est valable pour les mots de passe courts.

RAPPEL: Ne pas utiliser sur des fichiers Excel qui ne vous appartiennent pas. Ce serait contre je ne sais quelle loi.

Le but de ce script est de voir l’utilisation de jobs Powershell de façon récursive. J’ai expliqué les jobs ici et les fonctions récursives ici.

Pour cet exercice, nous allons combiner les fonctions récursives et les jobs. Nous allons faire des jobs récursifs!

Chaud devant.

Nous commençons notre script par définir un paramètre $maxPasswordLength, on va lui donner une valeur par défaut de 4.

On récupère l’endroit où se trouve le script qui va devenir notre répertoire par défaut.

On va utiliser les formes Windows pour un Open Files dialog box, ceci est une petite fenêtre qui permet de choisir le fichier Excel à traiter.

Le fichier Excel à traiter peut être récupéré à travers la variable membre FileName de l’objet Dialog Box.

On connait le nom du fichier, démarrons Excel.

Nous n’avons pas besoin qu’il soit visible.

Maintenant ouvrons notre fichier.

Et sélectionnons la spreadsheet active, celle par défaut.

Construisons une chaîne de caractères avec la liste des caractères que nous voulons essayer pour trouver le mot de passe.

Avec cette liste de caractères, nous allons créer toutes les combinaisons possibles. Nous allons stocker ces résultats dans un array.

Nous créons une boucle qui pour chaque niveau de la chaîne de caractères, va créer un job qui s’exécutera dans le background afin de paralléliser au maximum la génération des résultats.

A noter la création des arguments qui contiennent un script block appelé $buildList. Ce script block définit la fonction BuildList, qui étant récursive, doit pouvoir s’appeler. La définition de la fonction doit être faite dans le script block passé comme argument, sinon elle ne serait pas visible par le job. Les jobs s’exécutant dans leurs propre console, n’ont pas accès au variables définies dans notre script principal. Du coup on crée un script block, on y met tout ce que le job doit voir, et on lui passe comme paramètre. Comme le type [scriptblock] et les paramètres ne font pas bon ménage, on triche et on lui passe comme une [string], on devra le caster vers un [stringblock] à la réception.

Voici le script block:

Dans ce script block, nous commençons par recréer notre script block (il est passé comme une string).

Nous rentrons dans une boucle, qui pour chaque caractère de notre chaîne, va générer une string à sauvegarder.

Ensuite nous allons regarder le niveau dans la chaîne, si on est au max, nous avons tous les éléments pour créer la chaîne de résultats à retourner au niveau inférieur. A noter la ligne

Ceci envoie une string sur la console. La cmdlet Receive-Job, reçoit  tout ce qui a été envoyé sur la console, ainsi nous pouvons capturer tous les résultats. Par contre s’il y a une erreur quelque part, elle arriverait sur la console du job, et l’appelant la recevrait aussi, ce qui pourrait fausser ce qui est attendu. Donc bien débugger un job avant de se lancer.

Si nous n’avons pas exploré toutes les combinaisons, nous allons créer d’autres jobs, de façon récursive.  Et nous allons attendre avec Wait-Job, que les niveaux successifs aient fini. On récupère leurs résultats, et on les passe à l’appelant.

C’est compliqué car les fonctions récursives le sont, et en combinant ceci avec des jobs, ça devient franchement difficile à discerner complètement ce qui se passe au premier abord.

Une fois tous les résultats reçus à travers Receive-Job nous avons toutes les chaînes à essayer pour cracker notre spreadsheet.

Pour chaque élément dans la liste des résultats

Nous allons essayer la string comme un mot de passe et enlever la protection de la spreadsheet. On va attraper toutes les exceptions, car on sait que tous ces essais, et potentiellement, sauf un, produira des erreurs.

Et on vérifie si la spreadsheet est débloquée.

Finalement une fois toutes les combinaisons exécutées on peut sortir de Excel

Voilà.

Voici le script complet

  • Paul

    Bonjour et merci pour ton travail! Trs bien ton site!

    Je ne parviens pas à faire fonctionner ce script… Pourrais-je avoir quelques détails?

  • Bonjour Paul, bien sûr, est-ce que le script donne une erreur? Si oui laquelle? PI, j’ai utilisé Excel 2013 pour le tester.

  • Paul

    Rebonjour,
    à l’exécution, des fenêtres se lancent… Mais je n’ai pas l’impression qu’il y est du bruteforce sur le fichier…

    • Un test assez rapide est de réduire $MaxPasswordLength à 2 ou 3, et utiliser un fichier avec un mdp de 2-3 caractères maxi et voir s’il le trouve. Mais effectivement, Powershell n’est pas le langage le plus approprié pour ce type d’opération (trop lent à mon avis comparé à C ou autre langage de bas niveau). Le but de cet article c’est surtout pédagogique dans la gestion de Excel à partir de Powershell.

  • Paul

    D’accord merci! Je vais tester!
    C’est vrai que ya plus rapide comme langage pour ce genre de chose… mais pour des fichiers excel… Ya pas beaucoup de choix je trouve…
    Mais un grand merci pour ton travail et ton site, il est vraiment bien, propre, bien expliqué! Merci à toi!