Ik ben gevraagd om enkele Excel 2003-macro’s bij te werken, maar de VBA-projecten zijn beveiligd met een wachtwoord, en het lijkt erop dat er een gebrek aan documentatie is… niemand kent de wachtwoorden.
Is er een manier om het wachtwoord van een VBA-project te verwijderen of te kraken?
Antwoord 1, autoriteit 100%
Je kunt deze directe VBA
-aanpak proberen, waarvoor geen HEX-bewerking nodig is. Het werkt voor alle bestanden (*.xls, *.xlsm, *.xlam …).
Getest en werkt op:
Excel 2007
Excel 2010
Excel 2013 – 32-bits versie
Excel 2016 – 32-bits versie
Op zoek naar een 64-bits versie? Zie dit antwoord
Hoe het werkt
Ik zal mijn best doen om uit te leggen hoe het werkt – excuseer mijn Engels.
- De VBE roept een systeemfunctie aan om het wachtwoorddialoogvenster te maken.
- Als de gebruiker het juiste wachtwoord invoert en op OK klikt, retourneert deze functie 1. Als de gebruiker het verkeerde wachtwoord invoert of op Annuleren klikt, retourneert deze functie 0.
- Nadat het dialoogvenster is gesloten, controleert de VBE de geretourneerde waarde van de systeemfunctie
- als deze waarde 1 is, zal de VBE “denken” dat het wachtwoord juist is, vandaar dat het vergrendelde VBA-project wordt geopend.
- De onderstaande code verwisselt het geheugen van de oorspronkelijke functie die werd gebruikt om het wachtwoordvenster weer te geven met een door de gebruiker gedefinieerde functie die altijd 1 zal retourneren wanneer deze wordt aangeroepen.
De code gebruiken
Maak eerst een back-up van uw bestanden!
- Open de bestanden die uw vergrendelde VBA-projecten bevatten
-
Maak een nieuw xlsm-bestand en sla deze code op in 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
-
Plak deze code onder de bovenstaande code in Module1en voer het uit
Sub unprotected() If Hook Then MsgBox "VBA Project is unprotected!", vbInformation, "*****" End If End Sub
-
Kom terug naar je VBA-projecten en geniet ervan.
Antwoord 2, autoriteit 30%
Ja, dat is zo, zolang u een spreadsheet in .xls
-indeling gebruikt (de standaard voor Excel tot 2003). Voor Excel 2007 en later is de standaard .xlsx
, wat een redelijk veilige indeling is, en deze methode zal niet werken.
Zoals Treb zegt, het is een simpele vergelijking. Eén methode is om de wachtwoordinvoer in het bestand eenvoudig om te wisselen met een hex-editor (zie Hex-editors voor Windows). Stap voor stap voorbeeld:
- Maak een nieuw eenvoudig Excel-bestand.
- Stel in het VBA-gedeelte een eenvoudig wachtwoord in (zeg – 1234).
- Sla het bestand op en sluit af. Controleer vervolgens de bestandsgrootte – zie Stewbob’s probleem
- Open het bestand dat je zojuist hebt gemaakt met een hex-editor.
-
Kopieer de regels die beginnen met de volgende toetsen:
CMG=.... DPB=... GC=...
-
EERSTE BACK-UPhet Excel-bestand waarvan u het VBA-wachtwoord niet weet, open het vervolgens met uw hex-editor en plak de hierboven gekopieerde regels uit het dummy-bestand.
- Sla het Excel-bestand op en sluit af.
- Open nu het Excel-bestand waarin u de VBA-code moet zien. Het wachtwoord voor de VBA-code
zal gewoon 1234 zijn (zoals in het voorbeeld dat ik hier laat zien).
Als u met Excel 2007 of 2010 moet werken, vindt u hieronder enkele andere antwoorden die kunnen helpen, met name deze: 1, 2, 3.
EDITfebruari 2015: voor een andere methode die er veelbelovend uitziet, bekijk dit nieuwe antwoord door Đức Thanh Nguyễn.
Antwoord 3, autoriteit 25%
Ik heb voortgebouwd op het fantastische antwoord van Đức Thanh Nguyễn om deze methode te laten werken met 64-bits versies van Excel. Ik gebruik Excel 2010 64-bit op 64-bit Windows 7.
- Open de bestanden die uw vergrendelde VBA-projecten bevatten.
-
Maak een nieuw xlsm-bestand en sla deze code op in 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
-
Plak deze code in Module2en voer het uit
Sub unprotected() If Hook Then MsgBox "VBA Project is unprotected!", vbInformation, "*****" End If End Sub
DISCLAIMERDit werkte voor mij en ik heb het hier gedocumenteerd in de hoop dat het iemand zal helpen. Ik heb het niet volledig getest. Zorg ervoor dat u alle geopende bestanden opslaat voordat u doorgaat met deze optie.
Antwoord 4, autoriteit 23%
Er is een andere (iets makkelijkere) oplossing, zonder de problemen met de afmetingen. Ik gebruikte deze aanpak vandaag (op een 2003 XLS-bestand, met Excel 2007) en was succesvol.
- Maak een back-up van het xls-bestand
- Open het bestand in een HEX-editor en zoek het
DPB=...
gedeelte - Verander de
DPB=...
string inDPx=...
- Open het xls-bestand in Excel
- Open de VBA-editor (ALT+ F11)
- de magie:
Excel ontdekt een ongeldige sleutel (DPx) en vraagt of u door wilt gaan met het laden van het project (in feite de bescherming negerend) - U kunt het wachtwoord overschrijven, dus verander het in iets dat u zich kunt herinneren
- Bewaar het xls-bestand*
- Sluit en heropen het document en werk aan je VBA-magie!
*OPMERKING: Zorg ervoor dat u het wachtwoord hebt gewijzigd in een nieuwe waarde, anders zal Excel de volgende keer dat u de spreadsheet opent fouten rapporteren (onverwachte fout), wanneer u de lijst met VBA-modules opent, ziet u nu de namen van de bronmodules, maar krijgen een andere foutmelding bij het openen van formulieren/code/etc. Om dit te verhelpen, gaat u terug naar de VBA-projecteigenschappen en stelt u het wachtwoord in op een nieuwe waarde. Sla het Excel-document op en open het opnieuw en u bent klaar om aan de slag te gaan!
Antwoord 5, autoriteit 11%
Voor een .xlsm
of .dotm
bestandstype moet je het op een iets andere manier doen.
- Verander de extensie van het bestand
.xlsm
in.ZIP
. - Open het .zip-bestand (met WinZip of WinRar enz.) en ga naar de xl-map.
- Pak het bestand
vbaProject.bin
uit en open het in een Hex Editor (ik gebruik HxD, het is helemaal gratis en lichtgewicht.) - Zoek naar
DPB
en vervang doorDPX
en sla het bestand op. - Vervang het oude bestand
vbaProject.bin
door dit nieuwe bestand in het gecomprimeerde bestand. - Verander de bestandsextensie terug naar
.xlsm
. - Open werkmap en sla de waarschuwingsberichten over.
- Open Visual Basic in Excel.
- Ga naar Extra > VBAProjecteigenschappen > Tabblad Beveiliging.
- Voer een nieuw wachtwoord in en sla het bestand
.xlsm
op. - Sluit en open opnieuw en je nieuwe wachtwoord werkt.
Antwoord 6, autoriteit 9%
Colin Pickard heeft een uitstekend antwoord, maar er is één ‘pas op’ hiermee. Er zijn gevallen (ik heb de oorzaak nog niet ontdekt) waar de totale lengte van de “CMG=……..GC=….”-invoer in het bestand verschilt van het ene Excel-bestand tot het De volgende. In sommige gevallen zal deze invoer 137 bytes zijn en in andere gevallen 143 bytes. De lengte van 137 bytes is een vreemde eend in de bijt, en als dit gebeurt wanneer u uw bestand aanmaakt met het ‘1234’-wachtwoord, maakt u gewoon een ander bestand aan, en het zou naar de lengte van 143 bytes moeten springen.
Als je het verkeerde aantal bytes in het bestand probeert te plakken, verlies je je VBA-project wanneer je het bestand probeert te openen met Excel.
BEWERKEN
Dit is niet geldig voor Excel 2007/2010-bestanden. Het standaard .xlsx-bestandsformaat is eigenlijk een .zip-bestand met talrijke submappen met de opmaak, lay-out, inhoud, enz., opgeslagen als xml-gegevens. Voor een onbeschermd Excel 2007-bestand kunt u de extensie .xlsx wijzigen in .zip, vervolgens het zipbestand openen en alle xml-gegevens bekijken. Het is heel eenvoudig.
Als u echter een Excel 2007-bestand met een wachtwoord beveiligt, wordt het volledige .zip-bestand (.xlsx) feitelijk versleuteld met RSA-versleuteling. Het is niet langer mogelijk om de extensie te wijzigen in .zip en door de bestandsinhoud te bladeren.
Antwoord 7, autoriteit 7%
Op mijn beurt is dit gebaseerd op het uitstekende antwoord van kaybee99 dat is gebaseerd op het fantastische antwoord van Đức Thanh Nguyễn om deze methode te laten werken met zowel x86- als amd64-versies van Office.
Een overzicht van wat er is veranderd, we vermijden push/ret dat beperkt is tot 32-bits adressen en vervangen het door mov/jmp reg.
Getest en werkt op
Word/Excel 2016 – 32-bits versie.
Word/Excel 2016 – 64-bits versie.
hoe het werkt
- Open de bestanden die uw vergrendelde VBA-projecten bevatten.
-
Maak een nieuw bestand met hetzelfde type als hierboven en sla deze code op in 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 11) As Byte Dim OriginBytes(0 To 11) 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)), 12 End Sub Public Function Hook() As Boolean Dim TmpBytes(0 To 11) As Byte Dim p As LongPtr, osi As Byte Dim OriginProtect As LongPtr Hook = False #If Win64 Then osi = 1 #Else osi = 0 #End If pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA") If VirtualProtect(ByVal pFunc, 12, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, osi+1 If TmpBytes(osi) <> &HB8 Then MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 12 p = GetPtr(AddressOf MyDialogBoxParam) If osi Then HookBytes(0) = &H48 HookBytes(osi) = &HB8 osi = osi + 1 MoveMemory ByVal VarPtr(HookBytes(osi)), ByVal VarPtr(p), 4 * osi HookBytes(osi + 4 * osi) = &HFF HookBytes(osi + 4 * osi + 1) = &HE0 MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 12 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
-
Plak deze code in Module2en voer het uit
Sub unprotected() If Hook Then MsgBox "VBA Project is unprotected!", vbInformation, "*****" End If End Sub
Antwoord 8, autoriteit 5%
Het is de moeite waard om erop te wijzen dat als je een Excel 2007 (xlsm)-bestand hebt, je het eenvoudig kunt opslaan als een Excel 2003 (xls)-bestand en de methoden kunt gebruiken die in andere antwoorden worden beschreven.
Antwoord 9, autoriteit 2%
Heb je geprobeerd ze eenvoudig te openen in OpenOffice.org?
Ik had enige tijd geleden een soortgelijk probleem en ontdekte dat Excel en Calc elkaars codering niet begrepen, en dus directe toegang tot zowat alles toestonden.
Dit is een tijdje geleden, dus als dat niet alleen maar een toevalstreffer van mijn kant was, is het misschien ook gepatcht.
Antwoord 10, autoriteit 2%
In het geval dat uw blokkering van
CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX"
in je ‘bekende wachtwoord’-bestand korter is dan het bestaande blok in het ‘onbekende wachtwoord’-bestand, vul je hexadecimale tekenreeksen in met nullen om de juiste lengte te bereiken.
bijv.
CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"
in het onbekende wachtwoordbestand, moet worden ingesteld op
CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000"
om de bestandslengte te behouden.
Ik heb dit ook gehad met .XLA-bestanden (97/2003-indeling) in Office 2007.
Antwoord 11, autoriteit 2%
Voor Excel 2007 en later moet u uw bestandsextensie wijzigen in .zip
In het archief is een submap xl, daarin vind je vbaProject.bin.
Volg de bovenstaande stap met vbaProject.bin en sla het vervolgens op in het archief.
Wijzig uw extensie terug en voilà! (wat betekent dat je de bovenstaande stappen volgt)
Antwoord 12, autoriteit 2%
VBA-projectwachtwoorden voor Access-, Excel-, Powerpoint- of Word-documenten (2007, 2010, 2013 or 2016
-versies met extensies .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM
) kan gemakkelijk worden verwijderd.
Het is gewoon een kwestie van de bestandsnaamextensie wijzigen in .ZIP
, het bestand uitpakken en een eenvoudige Hex-editor gebruiken (zoals XVI32) om het bestaande wachtwoord te “breken”, wat Office “in de war brengt”, zodat het de volgende keer dat het bestand wordt geopend om een nieuw wachtwoord wordt gevraagd.
Een samenvatting van de stappen:
- hernoem het bestand zodat het de extensie
.ZIP
heeft. - open de
ZIP
en ga naar de mapXL
. - extraheer
vbaProject.bin
en open het met een Hex Editor - “Zoeken en vervangen” naar “alles vervangen” en
DPB
wijzigen inDPX
. - Sla de wijzigingen op, plaats het bestand
.bin
terug in de zip, zet het terug naar de normale extensie en open het bestand zoals normaal. - ALT+F11 om de VB-editor te openen en klik met de rechtermuisknop in de Projectverkenner om
VBA Project Properties
te kiezen. - Stel op het tabblad
Protection
een nieuw wachtwoord in. - Klik op
OK
, sluit het bestand, open het opnieuw en druk op ALT+F11. - Voer het nieuwe wachtwoord in dat je hebt ingesteld.
Op dit punt kunt u het wachtwoord volledig verwijderen als u daarvoor kiest.
Volledige instructiesmet een stapsgewijze video die ik “lang geleden”heb gemaakt, staat op YouTube hier.
Het is nogal schokkend dat deze oplossing al jaren bestaat en dat Microsoft het probleem niet heeft opgelost.
De moraal van het verhaal?
Microsoft Office VBA-projectwachtwoorden mogen niet worden gebruiktvoor de beveiliging van elkegevoelige informatie. Als beveiliging belangrijk is, gebruik dan coderingssoftware van derden.
Antwoord 13
Colin Pickard heeft grotendeels gelijk, maar verwar de “wachtwoord om te openen”-beveiliging voor het hele bestand niet met de VBA-wachtwoordbeveiliging, die volledig verschilt van de eerste en hetzelfde is voor Office 2003 en 2007 (voor Office 2007, hernoem het bestand naar .zip en zoek naar de vbaProject.bin in de zip). En dat technisch gezien de juiste manier om het bestand te bewerken is om een OLE samengestelde documentviewer zoals CFX te gebruiken om de juiste stream te openen. Natuurlijk, als je alleen bytes vervangt, kan de gewone oude binaire editor werken.
Trouwens, als je je afvraagt over het exacte formaat van deze velden, ze hebben het nu gedocumenteerd:
http://msdn.microsoft.com/en-us /library/dd926151%28v=office.12%29.aspx
Antwoord 14
Ik heb enkele van de bovenstaande oplossingen geprobeerd en geen van hen werkt voor mij (excel 2007 xlsm-bestand). Toen vond ik een andere oplossing die zelfs het wachtwoord ophaalt, niet alleen om het te kraken.
Voeg deze code in de module in, voer het uit en geef het wat tijd. Het zal je wachtwoord met brute kracht herstellen.
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
Antwoord 15
Als het bestand een geldig zip-bestand is (de eerste paar bytes zijn 50 4B
— gebruikt in formaten zoals .xlsm
), pak het bestand dan uit en zoek naar het subbestand xl/vbaProject.bin
. Dit is een CFB-bestand, net als de .xls
-bestanden. Volg de instructies voor het XLS-formaat (toegepast op het subbestand) en zip vervolgens de inhoud.
Voor het XLS-formaat kun je enkele van de andere methoden in dit bericht volgen. Persoonlijk zoek ik liever naar het DPB=
blok en vervang ik de tekst
CMG="..."
DPB="..."
GC="..."
met spaties. Dit voorkomt problemen met de grootte van de CFB-container.
Antwoord 16
ElcomSoftmaakt Advanced Office Password Breakeren Advanced Office Password Recovery producten die op dit geval van toepassing kunnen zijn, zolang het document is gemaakt in Office 2007 of eerder.
Antwoord 17
Tom – Ik heb aanvankelijk een schooljongensfout gemaakt omdat ik niet naar de bytegrootte keek en in plaats daarvan kopieerde en plakte van de “CMG”-instelling naar de volgende invoer. Dit waren echter twee verschillende tekstgroottes tussen de twee bestanden en ik verloor het VBA-project, precies zoals Stewbob waarschuwde.
Met HxD is er een teller die bijhoudt hoeveel bestanden je selecteert. Kopieer vanaf CMG totdat de teller 8F (hex voor 143) aangeeft en ook bij het plakken in het vergrendelde bestand – ik eindigde met tweemaal het aantal “…” aan het einde van de pasta, die er op de een of andere manier vreemd uitzag en bijna voelde onnatuurlijk, maar het werkte.
Ik weet niet of het cruciaal is, maar ik heb ervoor gezorgd dat ik zowel de hex-editor als Excel heb afgesloten voordat ik het bestand opnieuw in Excel heb geopend. Vervolgens moest ik door de menu’s gaan om de VB Editor te openen, naar VBProject Properties en het ‘nieuwe’ wachtwoord invoeren om de code te ontgrendelen.
Ik hoop dat dit helpt.
Antwoord 18
Mijn tool, VbaDiff, leest VBA rechtstreeks uit het bestand, zodat je het kunt gebruiken om beveiligde VBA-code te herstellen van de meeste kantoordocumenten zonder toevlucht te nemen tot een hex-editor.
Antwoord 19
De beveiliging is een eenvoudige tekstvergelijking in Excel.
Laad Excel in je favoriete debugger (Ollydbgis mijn favoriete tool), zoek de code die de vergelijking doet en repareer het om altijd true terug te geven, dit zou je toegang moeten geven tot de macro’s.
Antwoord 20
Voor Excel 2016 64-bit op een Windows 10-machine heb ik een hex-editor gebruikt om het wachtwoord van een beveiligde xla te kunnen wijzigen (heb dit niet getest voor andere extensies).
Tip:maak een back-up voordat je dit doet.
De stappen die ik heb genomen:
- Open de vba in de hex-editor (bijvoorbeeld XVI)
- Zoeken op deze DPB
- Verander DPB in iets anders, zoals DPX
- Bewaar het!
- Heropen de .xla, er zal een foutmelding verschijnen, ga gewoon verder.
- U kunt nu het wachtwoord van de .xla wijzigen door de eigenschappen te openen en naar het wachtwoordtabblad te gaan.
Ik hoop dat dit sommigen van jullie heeft geholpen!
Antwoord 21
Het geaccepteerde antwoord werkte niet in Excel 2019 op Windows 10. We hebben de extra stappen ontdekt die we moeten nemen om de vergrendelde macro te zien. Ik vat de stappen samen.
-
Voeg een .zip toe aan het einde van de Excel-bestandsnaam en druk op enter
-
Zodra het bestand is gewijzigd in een ZIP-bestand, opent u het door erop te dubbelklikken
-
Binnenin zou je een map zien met de naam xl zoals hieronder
-
Binnen xl vind je een bestand met de naam vbaProject.bin, kopieer/plak het op het bureaublad
-
Ga naar de online hexadecimale editor HexEd.it
-
Zoek naar de volgende teksten
DPB=…
en verander ze in
DPx=… -
Sla het bestand op en sluit HexEd.it
-
Kopieer/plak het bijgewerkte bestand van uw bureaublad in het ZIP-bestand (u zou het moeten overschrijven)
-
Verwijder de .zip-extensie aan het einde van de bestandsnaam en voeg de Excel-extensie opnieuw toe.
-
Open het bestand in Excel – u kunt een aantal foutmeldingen ontvangen, klik er gewoon doorheen.
==== EXTRA STAPPEN OVER HET AANVAARD ANTWOORD =====
- Open het Visual Basic-venster (meestal ALT+F11 als ik het me goed herinner) en open de VBAProject-eigenschappen (menu Extra).
- Klik op het tabblad Beveiliging en wijzig (niet verwijderen in dit stadium) het wachtwoord in iets kort en gemakkelijk te onthouden (we zullen
verwijderen in de volgende stap).- Sla de werkmap op en sluit en open vervolgens opnieuw.
- Open opnieuw het Visual Basic-venster en voer het wachtwoord in dat u zojuist hebt ingevoerd. Herhaal de vorige stap, maar deze keer kunt u verwijderen (verwijderen)
het wachtwoord.- Sla de werkmap op en je hebt nu het wachtwoord verwijderd.
Extra stappen worden genomen vanaf de volgende site
https://confluence.jaytaala.com/display/TKB/Remove+ Excel+VBA+wachtwoord
Antwoord 22
de extensie van uw Excel-bestand verandert in xml.
En open het in Kladblok.
wachtwoordtekst zoeken in xml-bestand.
je ziet zoals onderstaande regel;
Sheets("Sheet1").Unprotect Password:="blabla"
(sorry voor mijn slechte Engels)
Antwoord 23
Als je in Java
werkt, kun je VBAMacroExtractor
. Na het extraheren van VBA-scripts uit .xlsm
heb ik hun wachtwoord in platte tekst gevonden.