it-swarm.com.de

Gibt es eine Möglichkeit, das Kennwort in einem Excel VBA-Projekt zu knacken?

Ich wurde gebeten, einige Excel 2003-Makros zu aktualisieren, aber die VBA-Projekte sind passwortgeschützt, und es scheint, dass es an Dokumentation mangelt ... niemand kennt die Passwörter.

Gibt es eine Möglichkeit, das Kennwort in einem VBA-Projekt zu entfernen oder zu knacken?

454
Jonathan Sayce

Sie können diesen direkten VBA Ansatz ausprobieren, der keine HEX-Bearbeitung erfordert. Es funktioniert für alle Dateien (* .xls, * .xlsm, * .xlam ...).

Getestet und arbeitet an:

Excel 2007
Excel 2010
Excel 2013 - 32-Bit-Version
Excel 2016 - 32-Bit-Version

Suchen Sie nach einer 64-Bit-Version? Siehe diese Antwort

Wie es funktioniert

Ich werde mein Bestes geben, um zu erklären, wie es funktioniert - bitte entschuldigen Sie mein Englisch.

  1. Der VBE ruft eine Systemfunktion auf, um das Kennwortdialogfeld zu erstellen.
  2. Wenn der Benutzer das richtige Passwort eingibt und auf OK klickt, gibt diese Funktion 1 zurück. Wenn der Benutzer das falsche Passwort eingibt oder auf Abbrechen klickt, gibt diese Funktion 0 zurück.
  3. Nach dem Schließen des Dialogfelds überprüft der VBE den zurückgegebenen Wert der Systemfunktion
  4. wenn dieser Wert 1 ist, "glaubt" die VBE, dass das Kennwort richtig ist, und daher wird das gesperrte VBA-Projekt geöffnet.
  5. Der folgende Code tauscht den Speicher der ursprünglichen Funktion, die zum Anzeigen des Kennwortdialogs verwendet wurde, mit einer benutzerdefinierten Funktion aus, die beim Aufrufen immer 1 zurückgibt.

Verwenden Sie den Code

Bitte sichern Sie zuerst Ihre Dateien!

  1. Öffnen Sie die Datei (en), die Ihre gesperrten VBA-Projekte enthalten
  2. Erstellen Sie eine neue xlsm-Datei und speichern Sie diesen Code 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. Fügen Sie diesen Code unter dem obigen Code in Module1 ein und führen Sie ihn aus

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub
    
  4. Kommen Sie zu Ihren VBA-Projekten zurück und genießen Sie.

641

Ja, solange Sie eine Tabelle im .xls -Format verwenden (die Standardeinstellung für Excel bis 2003). Ab Excel 2007 ist der Standardwert .xlsx, ein ziemlich sicheres Format, und diese Methode funktioniert nicht.

Wie Treb sagt, ist es ein einfacher Vergleich. Eine Methode besteht darin, den Kennworteintrag in der Datei einfach mit einem Hex-Editor auszutauschen (siehe Hex-Editoren für Windows ). Schritt für Schritt Beispiel:

  1. Erstellen Sie eine neue einfache Excel-Datei.
  2. Legen Sie im VBA-Teil ein einfaches Kennwort fest (z. B. - 1234).
  3. Speichern Sie die Datei und beenden Sie sie. Überprüfen Sie dann die Dateigröße - siehe Stewbobs gotcha
  4. Öffnen Sie die soeben erstellte Datei mit einem Hex-Editor.
  5. Kopieren Sie die Zeilen, die mit den folgenden Schlüsseln beginnen:

    CMG=....
    DPB=...
    GC=...
    
  6. ERSTE SICHERUNG der Excel-Datei, für die Sie das VBA-Kennwort nicht kennen, öffnen Sie sie mit Ihrem Hex-Editor und fügen Sie die oben kopierten Zeilen aus dem Dummy ein Datei.

  7. Speichern Sie die Excel-Datei und beenden Sie sie.
  8. Öffnen Sie nun die Excel-Datei, in der Sie den VBA-Code sehen möchten. Das Kennwort für den VBA-Code lautet einfach 1234 (wie im hier gezeigten Beispiel).

Wenn Sie mit Excel 2007 oder 2010 arbeiten müssen, finden Sie nachfolgend einige andere Antworten, die möglicherweise hilfreich sind, insbesondere diese: 1 , 2 , .

EDIT Feb 2015: Für eine andere Methode, die sehr vielversprechend aussieht, schauen Sie sich diese neue Antwort) an von Đức Thanh Nguyễn.

209
Colin Pickard

Es gibt eine andere (etwas einfachere) Lösung ohne die Größenprobleme. Ich habe diesen Ansatz heute verwendet (für eine 2003 XLS-Datei mit Excel 2007) und war erfolgreich.

  1. Sichern Sie die XLS-Datei
  2. Öffnen Sie die Datei in einem HEX-Editor und suchen Sie den Teil DPB=...
  3. Ändern Sie die Zeichenfolge DPB=... in DPx=...
  4. Öffnen Sie die XLS-Datei in Excel
  5. Öffnen Sie den VBA-Editor (ALT + F11)
  6. the magic: Excel entdeckt einen ungültigen Schlüssel (DPx) und fragt, ob Sie das Projekt weiter laden möchten (den Schutz im Grunde ignorieren)
  7. Sie können das Passwort überschreiben, also ändern Sie es in etwas, an das Sie sich erinnern können
  8. Speichern Sie die XLS-Datei *
  9. Schließen Sie das Dokument, öffnen Sie es erneut und arbeiten Sie mit Ihrer VBA-Magie!

* HINWEIS: Stellen Sie sicher, dass Sie das Kennwort auf einen neuen Wert geändert haben. Andernfalls werden beim nächsten Öffnen der Excel-Tabelle Fehler (unerwarteter Fehler) gemeldet. Wenn Sie dann auf die Liste der VBA-Module zugreifen, werden die Namen der angezeigt Quellmodule erhalten aber eine andere Fehlermeldung, wenn Sie versuchen, Formulare/Code/etc zu öffnen. Um dies zu beheben, kehren Sie zu den VBA-Projekteigenschaften zurück und setzen Sie das Kennwort auf einen neuen Wert. Speichern Sie das Excel-Dokument und öffnen Sie es erneut.

162
Pieter

Ich habe auf der fantastischen Antwort von Đức Thanh Nguyễn aufgebaut, damit diese Methode mit 64-Bit-Versionen von Excel funktioniert. Ich verwende Excel 2010 64-Bit unter 64-Bit-Windows 7.

  1. Öffnen Sie die Datei (en), die Ihre gesperrten VBA-Projekte enthalten.
  2. Erstellen Sie eine neue xlsm-Datei und speichern Sie diesen Code 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. Fügen Sie diesen Code in Module2 ein und führen Sie ihn aus

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

DISCLAIMER Das hat bei mir funktioniert und ich habe es hier in der Hoffnung dokumentiert, dass es jemandem hilft. Ich habe es nicht vollständig getestet . Bitte stellen Sie sicher, dass alle geöffneten Dateien gespeichert sind, bevor Sie mit dieser Option fortfahren.

151
kaybee99

Colin Pickard hat eine exzellente Antwort, aber es gibt einen, der aufpasst. Es gibt Fälle (ich habe die Ursache noch nicht herausgefunden), in denen sich die Gesamtlänge des Eintrags "CMG = ........ GC = ...." in der Datei von einer Excel-Datei zur anderen unterscheidet Nächster. In einigen Fällen beträgt dieser Eintrag 137 Byte, in anderen 143 Byte. Die Länge von 137 Byte ist ungerade. Wenn dies passiert, wenn Sie Ihre Datei mit dem Kennwort '1234' erstellen, erstellen Sie einfach eine andere Datei und sie sollte auf die Länge von 143 Byte springen.

Wenn Sie versuchen, die falsche Anzahl von Bytes in die Datei einzufügen, verlieren Sie Ihr VBA-Projekt, wenn Sie versuchen, die Datei mit Excel zu öffnen.

EDIT

Dies gilt nicht für Excel 2007/2010-Dateien. Das Standard-XLSX-Dateiformat ist eine ZIP-Datei, die zahlreiche Unterordner mit Formatierung, Layout, Inhalt usw. enthält, die als XML-Daten gespeichert sind. Für eine ungeschützte Excel 2007-Datei können Sie einfach die Erweiterung .xlsx in .Zip ändern, dann die Zip-Datei öffnen und alle XML-Daten durchsuchen. Es ist sehr einfach.

Wenn Sie jedoch eine Excel 2007-Datei mit einem Kennwort schützen, wird die gesamte ZIP-Datei (XLSX) mithilfe der RSA-Verschlüsselung verschlüsselt. Es ist nicht mehr möglich, die Erweiterung in .Zip zu ändern und den Dateiinhalt zu durchsuchen.

63
Stewbob

Für einen Dateityp .xlsm oder .dotm müssen Sie etwas anders vorgehen.

  1. Ändern Sie die Erweiterung der Datei .xlsm in .Zip.
  2. Öffnen Sie die ZIP-Datei (mit WinZip oder WinRar usw.) und wechseln Sie in den Ordner xl.
  3. Extrahiere die vbaProject.bin -Datei und öffne sie in einem Hex-Editor (ich verwende HxD , es ist völlig kostenlos und leicht.)
  4. Suchen Sie nach DPB und ersetzen Sie diese durch DPx und speichern Sie die Datei.
  5. Ersetzen Sie die alte vbaProject.bin -Datei durch diese neue in der komprimierten Datei.
  6. Ändern Sie die Dateierweiterung wieder in .xlsm.
  7. Öffnen Sie die Arbeitsmappe, und blättern Sie durch die Warnmeldungen.
  8. Öffnen Sie Visual Basic in Excel.
  9. Wechseln Sie zu Extras> VBAProject-Eigenschaften> Registerkarte Schutz.
  10. Geben Sie ein neues Passwort ein und speichern Sie die Datei .xlsm.
  11. Schließen Sie und öffnen Sie erneut und Ihr neues Passwort wird funktionieren.
55
Matt

Es ist erwähnenswert, dass Sie eine Excel 2007 (xlsm) -Datei einfach als Excel 2003 (xls) -Datei speichern und die in anderen Antworten beschriebenen Methoden anwenden können.

34
Andy

Haben Sie versucht, sie einfach in OpenOffice.org zu öffnen?

Ich hatte vor einiger Zeit ein ähnliches Problem und stellte fest, dass Excel und Calc die Verschlüsselung des anderen nicht verstanden und so direkten Zugriff auf nahezu alles ermöglichten.

Dies ist eine Weile her, und wenn das nicht nur ein Zufall von meiner Seite war, könnte es auch geflickt worden sein.

16
greg

Ab Excel 2007 müssen Sie die Dateierweiterung in .Zip ändern. Im Archiv befindet sich ein Unterordner xl, in dem sich die Datei vbaProject.bin befindet. Befolgen Sie den obigen Schritt mit vbaProject.bin und speichern Sie es dann wieder im Archiv. Ändern Sie zurück Ihre Erweiterung und voilà! (was bedeutet, folgen Sie den obigen Schritten)

13
user3761175

Mit meinem Zug baut dies auf der hervorragenden Antwort von kaybee99 auf, die auf der fantastischen Antwort von Đức Thanh Nguyễn aufbaut, damit diese Methode sowohl mit x86- als auch mit AMD64-Versionen von Office funktioniert.

Um einen Überblick über die Änderungen zu erhalten, vermeiden wir Push/Ret, das auf 32-Bit-Adressen beschränkt ist, und ersetzen es durch mov/jmp reg.

Getestet und funktioniert

Word/Excel 2016 - 2-Bit-Version.
Word/Excel 2016 - 64-Bit-Version.

wie es funktioniert

  1. Öffnen Sie die Datei (en), die Ihre gesperrten VBA-Projekte enthalten.
  2. Erstellen Sie eine neue Datei mit demselben Typ wie oben und speichern Sie diesen Code 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. Fügen Sie diesen Code in Module2 ein und führen Sie ihn aus

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

Für den Fall, dass Ihr Block von CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX" in Ihrer "bekannten Passwort" -Datei kürzer ist als der vorhandene Block in der "unbekannten Passwort" -Datei, füllen Sie Ihre Hex-Zeichenfolgen mit nachgestellten Nullen auf, um die richtige Länge zu erreichen.

z.B.

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

in der unbekannten Passwortdatei sollte auf gesetzt sein

CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000", um die Dateilänge beizubehalten.

Ich hatte auch diese Arbeit mit XLA-Dateien (97/2003-Format) in Office 2007.

11
Spangen

VBA-Projektkennwörter in Access-, Excel-, PowerPoint- oder Word-Dokumenten (2007, 2010, 2013 or 2016 Versionen mit den Erweiterungen .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM) können leicht entfernt werden .

Es geht einfach darum, die Dateinamenerweiterung in .Zip zu ändern, die Datei zu entpacken und mit einem einfachen Hex-Editor (wie XVI32 ) das vorhandene Kennwort zu "knacken", was Office "verwirrt" Daher werden Sie beim nächsten Öffnen der Datei zur Eingabe eines neuen Kennworts aufgefordert.

Eine Zusammenfassung der Schritte:

  • benennen Sie die Datei so um, dass sie die Erweiterung .Zip hat.
  • öffne das Zip und gehe zum XL Ordner.
  • extrahiere vbaProject.bin und öffne es mit einem Hex Editor
  • "Suchen & Ersetzen", um "alle zu ersetzen" und DPB in DPX zu ändern.
  • Speichern Sie die Änderungen, legen Sie die Datei .bin wieder in die Zip-Datei, setzen Sie sie auf die normale Erweiterung zurück und öffnen Sie die Datei wie gewohnt.
  • ALT + F11, um den VB -Editor aufzurufen, und klicken Sie mit der rechten Maustaste in den Projekt-Explorer, um VBA Project Properties auszuwählen.
  • Legen Sie auf der Registerkarte Protection ein neues Kennwort fest.
  • Klicken Sie auf OK, schließen Sie die Datei, öffnen Sie sie erneut und drücken Sie ALT + F11.
  • Geben Sie das neue Passwort ein, das Sie festgelegt haben.

An dieser Stelle können Sie das Passwort ganz entfernen, wenn Sie möchten.

Vollständige Anweisungen mit einem Schritt-für-Schritt-Video, das ich "vor langer Zeit" gemacht habe - YouTube hier .

Es ist irgendwie schockierend, dass diese Problemumgehung schon seit Jahren verfügbar ist und Microsoft das Problem nicht behoben hat.


Die Moral der Geschichte?

Microsoft Office VBA-Projektkennwörter sind nicht als für die Sicherheit von Alle vertraulichen Informationen . Wenn Sicherheit wichtig ist, verwenden Sie Verschlüsselungssoftware von Drittanbietern.

10
ashleedawg

Colin Pickard ist größtenteils korrekt, aber verwechseln Sie den "Kennwort-zu-Öffnen" -Schutz für die gesamte Datei nicht mit dem VBA-Kennwortschutz, der sich vollständig von dem vorherigen unterscheidet und für Office 2003 und 2007 identisch ist (für Office 2007 Umbenennen) die Datei nach .Zip und suche die Datei vbaProject.bin in der Zip). Und technisch gesehen ist die richtige Art, die Datei zu bearbeiten, die Verwendung eines OLE zusammengesetzten Dokumentbetrachters wie CFX, um den richtigen Stream zu öffnen. Wenn Sie nur Bytes ersetzen, funktioniert möglicherweise der einfache alte Binäreditor.

Übrigens, wenn Sie sich über das genaue Format dieser Felder wundern, haben sie es jetzt dokumentiert:

http://msdn.Microsoft.com/en-us/library/dd926151%28v=office.12%29.aspx

9
Yuhong Bao

Wenn die Datei eine gültige Zip-Datei ist (die ersten Bytes sind 50 4B - verwendet in Formaten wie .xlsm), entpacken Sie die Datei und suchen Sie nach der Subdatei xl/vbaProject.bin. Dies ist eine CFB-Datei, genau wie die .xls -Dateien. Befolgen Sie die Anweisungen für das XLS-Format (auf die Unterdatei angewendet) und komprimieren Sie dann den Inhalt.

Für das XLS-Format können Sie einige der anderen Methoden in diesem Beitrag befolgen. Ich persönlich bevorzuge es, nach dem Block DPB= zu suchen und den Text zu ersetzen

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

mit Leerzeichen. Dies vermeidet CFB-Containergrößenprobleme.

7
SheetJS

Ich habe einige der oben genannten Lösungen ausprobiert und keine davon funktioniert für mich (Excel 2007 xlsm-Datei). Dann fand ich eine andere Lösung, die sogar Passwort abruft, nicht nur knacken.

Fügen Sie diesen Code in das Modul ein, führen Sie ihn aus und geben Sie ihm etwas Zeit. Es wird Ihr Passwort mit brutaler Gewalt wiederherstellen.

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
5
Luboš Suk

ElcomSoft macht Advanced Office Password Breaker und Erweiterte Office-Kennwortwiederherstellung Produkte, die in diesem Fall möglicherweise zutreffen, sofern das Dokument in Office 2007 oder früher erstellt wurde.

5
Charles Duffy

Tom - Ich habe anfangs einen Schülerfehler gemacht, da ich die Bytegröße nicht beachtet und stattdessen von der "CMG" -Einstellung kopiert und in den nachfolgenden Eintrag eingefügt habe. Dies waren jedoch zwei unterschiedliche Textgrößen zwischen den beiden Dateien, und ich habe das VBA-Projekt verloren, genau wie Stewbob es gewarnt hatte.

Bei Verwendung von HxD gibt es einen Zähler, der nachverfolgt, wie viele Dateien Sie auswählen. Kopieren Sie ab CMG, bis der Zähler 8F (hexadezimal für 143) anzeigt, und ebenso beim Einfügen in die gesperrte Datei. Am Ende der Paste wurde die doppelte Zahl von "..." angezeigt, die irgendwie seltsam aussah und sich fast anfühlte unnatürlich, aber es hat funktioniert.

Ich weiß nicht, ob es von entscheidender Bedeutung ist, aber ich habe sichergestellt, dass sowohl der Hex-Editor als auch Excel heruntergefahren wurden, bevor ich die Datei in Excel erneut öffne. Ich musste dann durch die Menüs gehen, um den Editor VB in den Eigenschaften von VBProject zu öffnen, und das 'neue' Passwort eingeben, um den Code zu entsperren.

Ich hoffe das hilft.

4
Scoob

Mein Tool VbaDiff liest VBA direkt aus der Datei, sodass Sie damit geschützten VBA-Code aus den meisten Office-Dokumenten wiederherstellen können, ohne auf einen Hex-Editor zurückgreifen zu müssen.

3
Chris Spicer

Der Schutz ist ein einfacher Textvergleich in Excel. Laden Sie Excel in Ihren bevorzugten Debugger ( Ollydbg ist mein Werkzeug der Wahl), suchen Sie den Code, der den Vergleich durchführt, und korrigieren Sie ihn, um immer true zurückzugeben. Auf diese Weise sollten Sie auf die Makros zugreifen können.

2
Treb

Für Excel 2016 64-Bit auf einem Windows 10-Computer habe ich einen Hex-Editor verwendet, um das Kennwort eines geschützten xla ändern zu können (habe dies nicht für andere Erweiterungen getestet). Tipp: erstelle vorher ein Backup.

Die Schritte, die ich unternahm:

  1. Öffne die VBA im Hex Editor (zum Beispiel XVI)
  2. Suche auf dieser DPB
  3. Ändern Sie DPB in etwas anderes, z. B. DPX
  4. Speichern Sie es!
  5. Öffnen Sie die XLA-Datei erneut. Es wird eine Fehlermeldung angezeigt. Fahren Sie einfach fort.
  6. Sie können jetzt das Passwort der .xla ändern, indem Sie die Eigenschaften öffnen und zur Registerkarte Passwort wechseln.

Ich hoffe das hat einigen von euch geholfen!

0
Edwin van der V

die Erweiterung Ihrer Excel-Datei wird in xml geändert. Und öffne es im Editor. Passwort Text in XML-Datei zu finden.

sie sehen wie unter der Linie;

Sheets("Sheet1").Unprotect Password:="blabla"

(Entschuldigung für mein schlechtes Englisch)

0
Developer33

Wenn Sie in Java arbeiten, können Sie VBAMacroExtractor versuchen. Nach dem Extrahieren von VBA-Skripten aus .xlsm habe ich dort ein Passwort im Klartext gefunden.

0
Grez