Is er een manier om het wachtwoord op een Excel VBA-project te kraken?

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.

  1. De VBE roept een systeemfunctie aan om het wachtwoorddialoogvenster te maken.
  2. 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.
  3. Nadat het dialoogvenster is gesloten, controleert de VBE de geretourneerde waarde van de systeemfunctie
  4. als deze waarde 1 is, zal de VBE “denken” dat het wachtwoord juist is, vandaar dat het vergrendelde VBA-project wordt geopend.
  5. 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!

  1. Open de bestanden die uw vergrendelde VBA-projecten bevatten
  2. 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
    
  3. 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
    
  4. 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:

  1. Maak een nieuw eenvoudig Excel-bestand.
  2. Stel in het VBA-gedeelte een eenvoudig wachtwoord in (zeg – 1234).
  3. Sla het bestand op en sluit af. Controleer vervolgens de bestandsgrootte – zie Stewbob’s probleem
  4. Open het bestand dat je zojuist hebt gemaakt met een hex-editor.
  5. Kopieer de regels die beginnen met de volgende toetsen:

    CMG=....
    DPB=...
    GC=...
    
  6. 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.

  7. Sla het Excel-bestand op en sluit af.
  8. 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.

  1. Open de bestanden die uw vergrendelde VBA-projecten bevatten.
  2. 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
    
  3. 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.

  1. Maak een back-up van het xls-bestand
  2. Open het bestand in een HEX-editor en zoek het DPB=...gedeelte
  3. Verander de DPB=...string in DPx=...
  4. Open het xls-bestand in Excel
  5. Open de VBA-editor (ALT+ F11)
  6. 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)
  7. U kunt het wachtwoord overschrijven, dus verander het in iets dat u zich kunt herinneren
  8. Bewaar het xls-bestand*
  9. 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 .xlsmof .dotmbestandstype moet je het op een iets andere manier doen.

  1. Verander de extensie van het bestand .xlsmin .ZIP.
  2. Open het .zip-bestand (met WinZip of WinRar enz.) en ga naar de xl-map.
  3. Pak het bestand vbaProject.binuit en open het in een Hex Editor (ik gebruik HxD, het is helemaal gratis en lichtgewicht.)
  4. Zoek naar DPBen vervang door DPXen sla het bestand op.
  5. Vervang het oude bestand vbaProject.bindoor dit nieuwe bestand in het gecomprimeerde bestand.
  6. Verander de bestandsextensie terug naar .xlsm.
  7. Open werkmap en sla de waarschuwingsberichten over.
  8. Open Visual Basic in Excel.
  9. Ga naar Extra > VBAProjecteigenschappen > Tabblad Beveiliging.
  10. Voer een nieuw wachtwoord in en sla het bestand .xlsmop.
  11. 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

  1. Open de bestanden die uw vergrendelde VBA-projecten bevatten.
  2. 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
    
  3. 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 .ZIPheeft.
  • open de ZIPen ga naar de map XL.
  • extraheer vbaProject.binen open het met een Hex Editor
  • “Zoeken en vervangen” naar “alles vervangen” en DPBwijzigen in DPX.
  • Sla de wijzigingen op, plaats het bestand .binterug 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 Propertieste kiezen.
  • Stel op het tabblad Protectioneen 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:

  1. Open de vba in de hex-editor (bijvoorbeeld XVI)
  2. Zoeken op deze DPB
  3. Verander DPB in iets anders, zoals DPX
  4. Bewaar het!
  5. Heropen de .xla, er zal een foutmelding verschijnen, ga gewoon verder.
  6. 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.

  1. Voeg een .zip toe aan het einde van de Excel-bestandsnaam en druk op enter

  2. Zodra het bestand is gewijzigd in een ZIP-bestand, opent u het door erop te dubbelklikken

  3. Binnenin zou je een map zien met de naam xl zoals hieronder

  4. Binnen xl vind je een bestand met de naam vbaProject.bin, kopieer/plak het op het bureaublad

  5. Ga naar de online hexadecimale editor HexEd.it

  6. Zoek naar de volgende teksten
    DPB=…
    en verander ze in
    DPx=…

  7. Sla het bestand op en sluit HexEd.it

  8. Kopieer/plak het bijgewerkte bestand van uw bureaublad in het ZIP-bestand (u zou het moeten overschrijven)

  9. Verwijder de .zip-extensie aan het einde van de bestandsnaam en voeg de Excel-extensie opnieuw toe.

  10. Open het bestand in Excel – u kunt een aantal foutmeldingen ontvangen, klik er gewoon doorheen.

==== EXTRA STAPPEN OVER HET AANVAARD ANTWOORD =====

  1. Open het Visual Basic-venster (meestal ALT+F11 als ik het me goed herinner) en open de VBAProject-eigenschappen (menu Extra).
  2. 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).
  3. Sla de werkmap op en sluit en open vervolgens opnieuw.
  4. 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.
  5. 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 Javawerkt, kun je VBAMacroExtractor. Na het extraheren van VBA-scripts uit .xlsmheb ik hun wachtwoord in platte tekst gevonden.

Other episodes