Y a-t-il un moyen de cracker le mot de passe sur un projet Excel VBA?
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 sait le mot de passe.
Existe-t-il un moyen de supprimer ou de cracker le mot de passe sur un projet VBA?
21 réponses
vous pouvez essayer cette approche directe VBA
qui ne nécessite pas d'édition hexadécimale. Il va travailler pour tous les fichiers (*.xls,*.xlsm,*.xlam ...).
testé et fonctionne sur
Excel 2007
Excel 2010
Excel 2013 - pour la version 32 bits .
Excel 2016 - pour la version 32 bits .
vous recherchez une version 64 bits? Voir https://stackoverflow.com/a/31005696/4342479
comment ça marche
je vais essayer de mon mieux pour expliquer comment il fonctionne - s'il vous plaît excusez mon anglais.
- le VBE appellera une fonction système pour créer la boîte de dialogue Mot de passe.
- si l'utilisateur entre le mot de passe droit et cliquez OK, ce retour de fonction 1. Si l'utilisateur entre le mauvais mot de passe ou cliquez sur Annuler, cette fonction renvoie 0.
- après la fermeture de la boîte de dialogue, le VBE vérifie la valeur retournée de la fonction système
- si cette valeur est 1, le VBE" pensera " que le mot de passe est correct, donc le projet VBA verrouillé sera ouvert.
- le code ci-dessous échange la mémoire de la fonction originale utilisée pour afficher la boîte de dialogue Mot de passe avec un utilisateur défini fonction qui retournera toujours 1 lors de l'appel.
utilisant le code
- ouvrir le fichier(s) qui contiennent vos projets VBA verrouillés
-
créer un nouveau fichier xlsm et stocker ce code dans Module1
code credited to Siwtom (nick name), a Vietnamese developer
Option Explicit Private Const PAGE_EXECUTE_READWRITE = &H40 Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _ (Destination As Long, Source As Long, ByVal Length As Long) Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _ ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _ ByVal lpProcName As String) As Long Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, _ ByVal pTemplateName As Long, ByVal hWndParent As Long, _ ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer Dim HookBytes(0 To 5) As Byte Dim OriginBytes(0 To 5) As Byte Dim pFunc As Long Dim Flag As Boolean Private Function GetPtr(ByVal Value As Long) As Long 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 Long Dim OriginProtect As Long 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 Long, _ ByVal pTemplateName As Long, ByVal hWndParent As Long, _ ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer If pTemplateName = 4070 Then MyDialogBoxParam = 1 Else RecoverBytes MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _ hWndParent, lpDialogFunc, dwInitParam) Hook End If End Function
-
coller ce code dans Module2 et l'exécuter
Sub unprotected() If Hook Then MsgBox "VBA Project is unprotected!", vbInformation, "*****" End If End Sub
-
revenez à vos projets VBA et profitez-en.
Oui, tant que vous utilisez un tableur de format .xls
(par défaut pour Excel jusqu'en 2003). Pour Excel à partir de 2007, la valeur par défaut est .xlsx
, qui est un format assez sûr, et cette méthode ne fonctionnera pas.
comme dit Treb, c'est une simple comparaison. Une méthode consiste simplement à permuter l'entrée de mot de passe dans le fichier en utilisant un éditeur hex (voir éditeurs Hex Pour Windows ). Exemple étape par étape:
- créez un nouveau fichier excel simple.
- dans la partie VBA, définissez un mot de passe simple (say - 1234).
- Enregistrer le fichier et quitter. puis vérifier la taille du fichier-voir Stewbob's gotcha 1519180920 "
- ouvrez le fichier que vous venez de créer avec un éditeur hex.
-
Copiez les lignes commençant par les touches suivantes:
CMG=.... DPB=... GC=...
-
PREMIÈRE SAUVEGARDE le fichier excel que vous ne connaissez pas le mot de passe VBA, puis de l'ouvrir avec votre éditeur hexadécimal, et collez-le au-dessus de copié les lignes du fichier factice.
- sauvegarder le fichier excel et quitter.
- maintenant, ouvrez le fichier excel dans lequel vous devez voir le code VBA. Le mot de passe du code VBA sera simplement 1234 (comme dans l'exemple que je vous montre ici).
si vous avez besoin de travailler avec Excel 2007 ou 2010, il ya d'autres réponses ci-dessous qui pourraient aider, en particulier ces: 1 , 2 , 3 .
MODIFIER Feb 2015: pour une autre méthode qui a l'air très prometteur, regardez cette nouvelle réponse par Đức Thanh Nguyen.
il y a une autre solution (un peu plus facile), sans les problèmes de taille. J'ai utilisé cette approche aujourd'hui (sur un fichier xls 2003, en utilisant Excel 2007) et j'ai réussi.
- Sauvegarde le fichier xls
- ouvrir le fichier dans un éditeur hexadécimal et localiser le
DPB=...
part - changer la chaîne
DPB=...
enDPx=...
- ouvrir le fichier XLS en Excel
- ouvrir l'éditeur VBA ( ALT + F11 )
- la magie: Excel découvre une clé invalide (DPx) et demande si vous voulez continuer à charger le projet (en ignorant la protection)
- vous serez en mesure d'écraser le mot de passe, alors changez-le en quelque chose que vous pouvez vous rappeler
- Enregistrer le fichier xls*
- fermer et rouvrir le document et travailler votre VBA la magie!
*NOTE: assurez-vous que vous avez changé le mot de passe en une nouvelle valeur, sinon la prochaine fois que vous ouvrez le tableur Excel signalera des erreurs (erreur inattendue), puis lorsque vous accédez à la liste des modules VBA vous verrez maintenant les noms des modules source mais vous recevrez une autre erreur lorsque vous essayez d'ouvrir des formulaires/code/etc. Pour y remédier, retournez aux propriétés du projet VBA et définissez le mot de passe à une nouvelle valeur. Sauvegarder et rouvrir le document Excel et tu devrais être prêt à partir!
j'ai construit sur la réponse fantastique de đփc Thanh Nguyփn pour permettre à cette méthode de fonctionner avec des versions 64 bits D'Excel. J'exécute Excel 2010 64-Bit sur Windows 64-Bit 7.
- ouvrir le fichier(s) qui contient vos projets VBA verrouillés.
-
créer un nouveau fichier xlsm et stocker 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
-
coller ce code dans Module2 et l'exécuter
Sub unprotected() If Hook Then MsgBox "VBA Project is unprotected!", vbInformation, "*****" End If End Sub
DISCLAIMER cela a fonctionné pour moi et je l'ai documenté ici dans l'espoir qu'il aidera quelqu'un. je n'ai pas entièrement testé . Assurez-vous de sauvegarder tous les fichiers avant de procéder à cette option.
Colin Pickard a une excellente réponse, mais il y a une 'attention' avec cela. Il y a des cas (je n'ai pas encore trouvé la cause) où la longueur totale du "CMG=........GC=...."entrée dans le fichier est différente à partir d'un fichier excel à l'autre. Dans certains cas, cette entrée sera 137 octets, et dans d'autres, il sera 143 octets. La longueur de 137 octets est l'Impair, et si cela se produit lorsque vous créez votre fichier avec le mot de passe '1234', il suffit de créer un autre fichier, et il devrait passez à 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. Norme. le format de fichier xlsx est en fait A.fichier zip contenant de nombreux sous-dossiers avec le formatage, la mise en page, le contenu, etc., stockés sous forme de données xml. Pour un Excel non protégé 2007, vous pouvez simplement changer le .extension xlsx .zip, puis ouvrir le fichier zip et regarder à travers toutes les données xml. C'est très simple.
cependant, lorsque vous protégez par mot de passe un fichier Excel 2007, la totalité .zip.( XLSX) est en fait crypté en utilisant le cryptage RSA. Il n'est plus possible de changer l'extension en .zip et parcourir le contenu du fichier.
pour un type de fichier .xlsm
ou .dotm
vous devez le faire d'une manière légèrement différente.
- changer l'extension du fichier
.xlsm
en.zip
. - ouvrir le .fichier zip (avec WinZip ou WinRar etc) et allez dans le dossier xl.
- extraire le fichier
vbaProject.bin
et l'ouvrir dans un éditeur Hex (j'utilise HxD , son complètement libre et léger.) - Rechercher
DPB
et remplacer parDPx
et enregistrez le fichier. - remplacer l'ancien fichier
vbaProject.bin
par ce nouveau fichier on dans le fichier zippé. - modifier l'extension du fichier retour à
.xlsm
. - ouvrir cahier d'exercices passer les messages d'avertissement.
- ouvrir Visual Basic inside Excel.
- allez à Outils > Propriétés VBAProject > onglet Protection.
- mettez un nouveau mot de passe et sauvegardez le fichier
.xlsm
. - fermez et ouvrez et votre nouveau mot de passe fonctionnera.
il vaut la peine de souligner que si vous avez un fichier Excel 2007 (xlsm), alors vous pouvez simplement le sauvegarder comme un fichier Excel 2003 (xls) et utiliser les méthodes décrites dans d'autres réponses.
avez - vous essayé simplement de les ouvrir OpenOffice.org Je ne sais pas.
j'ai eu un problème similaire il y a quelque temps et j'ai découvert Qu'Excel et Calc ne comprenaient pas le cryptage de l'autre, et donc permis un accès direct à presque tout.
c'était il y a longtemps, donc si ce n'était pas juste un coup de chance de ma part, ça aurait aussi pu être corrigé.
Pour Excel à partir de 2007 vous avez besoin de changer votre extension de fichier .zip Dans l'archive il y a un sous-dossier xl, vous y trouverez vbaProject.bac. Suivez l'étape ci-dessus avec vbaProject.bin enregistrer dans l'archive. Modifier votre extension et voilà! (c'est-à-dire suivre les étapes ci-dessus)
Colin Pickard est en grande partie correct, mais ne confondez pas la protection "password to open" pour l'ensemble du fichier avec la protection VBA password, qui est complètement différente de la première et est la même pour Office 2003 et 2007 (pour Office 2007, renommer le fichier en .fermez et cherchez le vbaProject.bin dans le zip). Et que techniquement la bonne façon d'éditer le fichier est d'utiliser un visualiseur de documents composé OLE comme CFX pour ouvrir le flux correct. Bien sûr, si vous êtes juste en remplaçant les octets, l'ancien éditeur binaire simple peut fonctionner.
BTW, si vous vous interrogez sur le format exact de ces champs, ils l'ont documenté maintenant:
http://msdn.microsoft.com/en-us/library/dd926151%28v=office.12%29.aspx
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', garnissez vos chaînes hexadécimales de zéros pour atteindre la bonne longueur.
p.ex.
CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"
dans le fichier des mots de passe inconnus, devrait être défini à
CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000"
pour préserver la longueur du fichier.
j'ai aussi eu ce travail avec. XLA (format 97/2003) les fichiers dans office 2007.
VBA project Passwords on Access, Excel, Powerpoint, or Word documents ( 2007, 2010, 2013 or 2016
versions avec extensions .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM
) peut être facilement supprimé .
il s'agit simplement de changer l'extension du nom de fichier en .ZIP
, de décompresser le fichier, et d'utiliser n'importe quel éditeur Hex de base (comme XVI32 ) pour "casser" le mot de passe existant, ce qui" confond " le Bureau de sorte qu'il invite à un nouveau mot de passe la prochaine fois que le fichier est ouvert.
un résumé des étapes:
- renommer le fichier de sorte qu'il ait une extension
.ZIP
. - ouvrez le
ZIP
et allez dans le dossierXL
. - extraire
vbaProject.bin
et l'ouvrir avec un éditeur hexadécimal - "Rechercher & Remplacer" à "remplacer tout" changement
DPB
àDPX
. - Save modifications, replacer le fichier
.bin
dans le zip, le retourner dans son extension normale et ouvrir le fichier comme d'habitude. - ALT+F11 pour entrer dans L'éditeur VB et droit-cliquez dans L'Explorateur de projet pour choisir
VBA Project Properties
. - sur l'onglet
Protection
, définissez un nouveau mot de passe. - cliquez sur
OK
, fermez le fichier, ré-ouvrez-le, appuyez sur ALT+F11. - entrez le nouveau mot de passe que vous avez défini.
à ce point vous pouvez supprimer le mot de passe complètement si vous choisissez.
des instructions Complètes avec une étape par étape vidéo que j'ai faite "le chemin du retour lorsque" sont sur YouTube ici .
il est un peu choquant que cette solution ait été disponible depuis des années, et Microsoft n'a pas réglé le problème.
La morale de l'histoire?
Microsoft Office Projet VBA les mots de passe sont de ne pas être invoquée de sécurité de tout "1519160920 des" informations sensibles . Si la sécurité est importante, utilisez un logiciel de cryptage tiers.
si le fichier est un fichier zip valide (les premiers octets sont 50 4B
-- utilisé dans des formats comme .xlsm
), alors décompressez le fichier et recherchez le sous-Fichier xl/vbaProject.bin
. Il s'agit d'un fichier CFB tout comme les fichiers .xls
. Suivez les instructions pour le format XLS (appliqué au sous-fichier) et ensuite juste zip le contenu.
Pour le format XLS, vous pouvez suivre certains des autres méthodes dans ce post. Je préfère personnellement chercher le DPB=
bloquer et remplacer le texte
CMG="..."
DPB="..."
GC="..."
avec des espaces vides. Cela permet d'éviter les problèmes liés à la taille des contenants de la BFC.
Tom-j'ai fait une erreur d'écolier d'abord comme je n'ai pas regardé la taille octet et à la place j'ai copié et collé à partir du "CMG" mis en place à l'entrée suivante. Il s'agissait de deux tailles de texte différentes entre les deux fichiers, cependant, et j'ai perdu le projet VBA tout comme Stewbob averti.
en utilisant HxD, il y a un compteur qui suit la quantité de fichier que vous sélectionnez. Copie à partir de CMG jusqu'à ce que le compteur lit 8F (hex pour 143) et de même lors du collage dans le fichier verrouillé-I il a terminé avec deux fois le nombre de "..."à la fin de la pâte, qui semblait étrange et presque contre nature, mais cela a fonctionné.
Je ne sais pas si c'est crucial, mais je me suis assuré de fermer à la fois l'éditeur hex et excel avant de rouvrir le fichier dans Excel. J'ai ensuite dû passer par les menus pour ouvrir L'éditeur VB, entrer les propriétés VBProject et entrer le "nouveau" mot de passe pour déverrouiller le code.
j'espère que cela aidera.
ElcomSoft makes Advanced Office Password Breaker et Advanced Office Password Recovery produits qui peuvent s'appliquer dans ce cas, aussi longtemps que le document a été créé dans Office 2007 ou avant.
j'ai essayé quelques solutions ci-dessus et aucun d'entre eux travaille pour moi (excel 2007 fichier xlsm). Puis j'ai trouvé une autre solution qui récupère le mot de passe, pas seulement le craquer.
insérez ce code dans le module, lancez-le et donnez-lui du temps. Il récupérera votre mot de passe par la 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
mon outil, VbaDiff , lit VBA directement à partir du fichier, de sorte que vous pouvez l'utiliser pour récupérer le code VBA protégé à partir de la plupart des documents de bureau sans recourir à un éditeur hexadécimal.
la protection est une simple comparaison de texte dans Excel. Load Excel dans votre débogueur préféré ( Ollydbg étant mon outil de choix), trouver le code qui fait la comparaison et le corriger pour toujours retourner true, cela devrait vous permettre d'accéder aux macros.
l'extension de votre fichier excel change en xml. Et de l'ouvrir dans le bloc-notes. texte de mot de passe trouver dans le fichier xml.
vous voyez comme en dessous de la ligne;
Sheets("Sheet1").Unprotect Password:="blabla"
(désolé pour mon mauvais anglais)
pour Excel 2016 64-bit sur une machine Windows 10, j'ai utilisé un éditeur hex pour pouvoir changer le mot de passe d'un XLA protégé (Je ne l'ai pas testé pour d'autres extensions). astuce: créez une sauvegarde avant de faire cela.
Les étapes que j'ai pris:
- Ouvrir La vba dans l'éditeur hex (par exemple XVI)
- recherche sur ce DPB
- changer DPB à quelque chose d'autre, comme DPX
- arrêtez!
- rouvrez le .xla, un message d'erreur apparaîtra, continue.
- vous pouvez maintenant changer le mot de passe du .xla en ouvrant les propriétés et allez à l'onglet mot de passe.
j'espère que cela a aidé certains d'entre vous!
Si vous travaillez dans Java
vous pouvez essayer VBAMacroExtractor
. Après avoir extrait les scripts VBA de .xlsm
j'ai trouvé le mot de passe en clair.