excel - unprotect - vba password recovery




Existe-t-il un moyen de casser le mot de passe sur un projet Excel VBA? (14)

On m'a demandé de mettre à jour certaines macros Excel 2003, mais les projets VBA sont protégés par mot de passe, et il semble qu'il y ait un manque de documentation ... personne ne connaît les mots de passe.

Existe-t-il un moyen de supprimer ou de casser le mot de passe sur un projet VBA?


Avez-vous essayé de les ouvrir simplement dans OpenOffice.org?

J'ai eu un problème similaire il y a quelque temps et j'ai constaté qu'Excel et Calc ne comprenaient pas le cryptage des uns et des autres, et permettaient donc un accès direct à à peu près tout.

C'était il y a un certain temps, donc si ce n'était pas juste un coup de chance de ma part, il pourrait aussi avoir été patché.


Colin Pickard a une excellente réponse, mais il y a une «attention» à cela. Il y a des instances (je n'ai pas encore trouvé la cause) où la longueur totale de l'entrée "CMG = ........ GC = ...." dans le fichier est différente d'un fichier Excel à la prochain. Dans certains cas, cette entrée sera de 137 octets, et dans d'autres, elle sera de 143 octets. La longueur de 137 octets est l'impaire, et si cela se produit lorsque vous créez votre fichier avec le mot de passe '1234', créez simplement un autre fichier, et il devrait passer à la longueur de 143 octets.

Si vous essayez de coller le mauvais nombre d'octets dans le fichier, vous perdrez votre projet VBA lorsque vous essayez d'ouvrir le fichier avec Excel.

MODIFIER

Ceci n'est pas valide pour les fichiers Excel 2007/2010. Le format de fichier .xlsx standard est en fait un fichier .zip contenant de nombreux sous-dossiers avec le formatage, la mise en page, le contenu, etc., stockés en tant que données XML. Pour un fichier Excel 2007 non protégé, vous pouvez simplement modifier l'extension .xlsx en .zip, puis ouvrir le fichier zip et parcourir toutes les données xml. C'est très simple.

Toutefois, lorsque vous protégez un fichier Excel 2007 par mot de passe, l'intégralité du fichier .zip (.xlsx) est cryptée à l'aide du cryptage RSA. Il n'est plus possible de changer l'extension en .zip et de parcourir le contenu du fichier.


Dans le cas où votre bloc de CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX" dans votre fichier "mot de passe connu" est plus court que le bloc existant dans le fichier "mot de passe inconnu" vos chaînes hexagonales avec des zéros traînants pour atteindre la bonne longueur.

par exemple

CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"

dans le fichier de mot de passe inconnu, doit être défini sur

CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000" pour conserver la longueur du fichier.

J'ai également travaillé avec des fichiers .XLA (format 97/2003) dans Office 2007.


Il convient de souligner que si vous avez un fichier Excel 2007 (xlsm), vous pouvez simplement l'enregistrer en tant que fichier Excel 2003 (xls) et utiliser les méthodes décrites dans d'autres réponses.


J'ai construit sur la réponse fantastique d'Đức Thanh Nguyễn pour permettre à cette méthode de fonctionner avec les versions 64 bits d'Excel. Je cours Excel 2010 64-Bit sur 64 bits Windows 7.

  1. Ouvrez le (s) fichier (s) contenant vos projets VBA verrouillés.
  2. Créez un nouveau fichier xlsm et stockez ce code dans Module1

    Option Explicit
    
    Private Const PAGE_EXECUTE_READWRITE = &H40
    
    Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr)
    
    Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _
    ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr
    
    Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr
    
    Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _
    ByVal lpProcName As String) As LongPtr
    
    Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
    
    Dim HookBytes(0 To 5) As Byte
    Dim OriginBytes(0 To 5) As Byte
    Dim pFunc As LongPtr
    Dim Flag As Boolean
    
    Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
        GetPtr = Value
    End Function
    
    Public Sub RecoverBytes()
        If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
    End Sub
    
    Public Function Hook() As Boolean
        Dim TmpBytes(0 To 5) As Byte
        Dim p As LongPtr
        Dim OriginProtect As LongPtr
    
        Hook = False
    
        pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
    
    
        If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
    
            MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
            If TmpBytes(0) <> &H68 Then
    
                MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
    
                p = GetPtr(AddressOf MyDialogBoxParam)
    
                HookBytes(0) = &H68
                MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
                HookBytes(5) = &HC3
    
                MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
                Flag = True
                Hook = True
            End If
        End If
    End Function
    
    Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _
    ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
    ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
    
        If pTemplateName = 4070 Then
            MyDialogBoxParam = 1
        Else
            RecoverBytes
            MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
                       hWndParent, lpDialogFunc, dwInitParam)
            Hook
        End If
    End Function
    
  3. Collez ce code dans Module2 et exécutez-le

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub
    

AVIS DE NON-RESPONSABILITÉ Cela a fonctionné pour moi et je l'ai documenté ici dans l'espoir que cela aidera quelqu'un. Je ne l'ai pas entièrement testé . Assurez-vous de sauvegarder tous les fichiers ouverts avant de continuer avec cette option.


J'ai essayé certaines des solutions ci-dessus et aucune d'elles ne fonctionne pour moi (excel 2007 xlsm file). Ensuite, j'ai trouvé une autre solution qui récupère même le mot de passe, pas juste le crack.

Insérez ce code dans le module, exécutez-le et donnez-lui du temps. Il va récupérer votre mot de passe par force brute.

Sub PasswordBreaker()

'Breaks worksheet password protection.

Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
MsgBox "One usable password is " & Chr(i) & Chr(j) & _
Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End Sub

La protection est une simple comparaison de texte dans Excel. Chargez Excel dans votre débogueur favori ( Ollydbg étant mon outil de choix), trouvez le code qui fait la comparaison et corrigez-le pour toujours retourner vrai, cela devrait vous permettre d'accéder aux macros.


Les mots de passe du projet VBA sur les documents Access, Excel, Powerpoint ou Word (versions 2007, 2010, 2013 or 2016 avec les extensions .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM ) peuvent être facilement supprimés .

Il suffit de changer l'extension du fichier en .ZIP , de décompresser le fichier et d'utiliser n'importe quel éditeur hexadécimal de base (comme XVI32 ) pour "casser" le mot de passe existant, ce qui "dérange" Office pour qu'il demande un nouveau mot de passe la prochaine fois. le fichier est ouvert.

Un résumé des étapes:

  • Renommez le fichier afin qu'il ait une extension .ZIP .
  • ouvrez le ZIP et allez dans le dossier XL .
  • extraire vbaProject.bin et l'ouvrir avec un éditeur hexadécimal
  • "Rechercher & Remplacer" pour "remplacer tout" en changeant DPB en DPX .
  • Enregistrez les modifications, .bin fichier .bin dans le fichier zip, renvoyez-le dans son extension normale et ouvrez le fichier comme d'habitude.
  • ALT + F11 pour entrer dans l'éditeur VB et cliquez avec le bouton droit de la souris dans l'Explorateur de projet pour choisir VBA Project Properties .
  • Sous l'onglet Protection , définissez un nouveau mot de passe.
  • Cliquez sur OK , fermez le fichier, rouvrez-le, appuyez sur ALT + F11.
  • Entrez le nouveau mot de passe que vous avez défini.

À ce stade, vous pouvez supprimer le mot de passe complètement si vous le souhaitez.

Des instructions complètes avec une vidéo étape par étape que j'ai faite "sur le passé quand" sont sur YouTube ici .

Il est un peu choquant que cette solution de contournement existe depuis des années et Microsoft n'a pas résolu le problème.

La morale de l'histoire?

Les mots de passe du projet Microsoft Office VBA ne doivent pas être utilisés pour la sécurité de toute information sensible . Si la sécurité est importante, utilisez un logiciel de chiffrement tiers.


Oui, tant que vous utilisez une feuille de calcul au format .xls (la valeur par défaut pour Excel jusqu'en 2003). Pour Excel 2007 et .xlsx , la valeur par défaut est .xlsx , qui est un format relativement sécurisé, et cette méthode ne fonctionnera pas.

Comme le dit Treb, c'est une simple comparaison. Une méthode consiste simplement à remplacer l'entrée du mot de passe dans le fichier à l'aide d'un éditeur hexadécimal (voir Editeurs hexadécimaux pour Windows ). Exemple étape par étape:

  1. Créez un nouveau fichier Excel simple.
  2. Dans la partie VBA, définissez un mot de passe simple (disons - 1234).
  3. Enregistrez le fichier et quittez. Puis vérifiez la taille du fichier - voir Gotcha de Stewbob
  4. Ouvrez le fichier que vous venez de créer avec un éditeur hexadécimal.
  5. Copiez les lignes commençant par les clés suivantes:

    CMG=....
    DPB=...
    GC=...
    
  6. PREMIÈRE SAUVEGARDE le fichier excel vous ne connaissez pas le mot de passe VBA pour, puis ouvrez-le avec votre éditeur hexadécimal, et collez les lignes copiées ci-dessus à partir du fichier fictif.

  7. Enregistrez le fichier Excel et quittez.
  8. Maintenant, ouvrez le fichier Excel dont vous avez besoin pour voir le code VBA. Le mot de passe pour le code VBA sera simplement 1234 (comme dans l'exemple que je montre ici).

Si vous avez besoin de travailler avec Excel 2007 ou 2010, voici d'autres réponses qui pourraient vous aider, notamment: 1 , 2 , 3 .

EDIT février 2015: pour une autre méthode qui semble très prometteuse, regardez cette nouvelle réponse de Thanc Thanh Nguyễn.


Pour Excel 2007, vous devez changer votre extension de fichier en .zip Dans l'archive il y a un sous-dossier xl, là vous trouverez vbaProject.bin. Suivez l'étape ci-dessus avec vbaProject.bin, puis enregistrez-le dans l'archive. Modifiez votre extension et voilà! (ce qui signifie suivre les étapes ci-dessus)


Pour un .xlsm vous devez le faire d'une manière légèrement différente.

  1. Changez l'extension du fichier .xlsm en .zip .
  2. Ouvrez le fichier .zip (avec WinZip ou WinRar etc) et allez dans le dossier xl.
  3. Extrayez le fichier vbaProject.bin et ouvrez-le dans un éditeur hexadécimal.
  4. Recherchez DPB et remplacez-le par DPx et enregistrez le fichier.
  5. Remplacez l'ancien fichier vbaProject.bin par ce nouveau dans le fichier compressé.
  6. Remplacez l'extension de fichier par .xlsm .
  7. Ouvrir le classeur ignorer les messages d'avertissement.
  8. Ouvrez Visual Basic dans Excel.
  9. Allez dans Outils> Propriétés de VBAProject> onglet Protection.
  10. Mettez un nouveau mot de passe et enregistrez le fichier .xlsm .
  11. Fermez et réouvrez et votre nouveau mot de passe fonctionnera.

Si le fichier est un fichier zip valide (les premiers octets sont 50 4B - utilisé dans des formats comme .xlsm ), décompressez le fichier et recherchez le sous-fichier xl/vbaProject.bin . C'est un fichier CFB comme les fichiers .xls . Suivez les instructions pour le format XLS (appliqué au sous-fichier), puis fermez simplement le contenu.

Pour le format XLS, vous pouvez suivre certaines des autres méthodes de cet article. Personnellement, je préfère rechercher le bloc DPB= et remplacer le texte

CMG="..."
DPB="..."
GC="..."

avec des espaces vides. Cela évite les problèmes de taille de conteneur CFB.


Tom - J'ai fait une erreur d'écolier au début car je n'ai pas regardé la taille de l'octet et j'ai plutôt copié et collé depuis le "CMG" mis en place pour l'entrée suivante. C'était deux tailles de texte différentes entre les deux fichiers, cependant, et j'ai perdu le projet VBA juste comme Stewbob a averti.

En utilisant HxD, il y a un compteur qui suit le nombre de fichiers que vous sélectionnez. Copier à partir de CMG jusqu'à ce que le compteur indique 8F (hex pour 143) et de même quand coller dans le fichier verrouillé - je me suis retrouvé avec deux fois le nombre de "..." à la fin de la pâte, qui semblait étrange et presque non naturel, mais cela a fonctionné.

Je ne sais pas si c'est crucial, mais je me suis assuré de fermer à la fois l'éditeur hexadécimal et Excel avant de rouvrir le fichier dans Excel. J'ai ensuite dû parcourir les menus pour ouvrir l'éditeur VB, dans VBProject Properties et entrer le nouveau mot de passe pour déverrouiller le code.

J'espère que ça aide.


ElcomSoft fabrique les produits Advanced Office Password Breaker et Advanced Office Password Recovery qui peuvent s'appliquer à ce cas, tant que le document a été créé dans Office 2007 ou antérieur.







passwords