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


486

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

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


Können Sie als .xls anstelle einer .xla speichern, wie die Beispiele in Ihrem Link nahe legen? Ich bin mir nicht sicher, ob dies einen Unterschied machen würde.
B Hart

4
gut bis bekannt: xlsb ist robust gegen Tricks zum Knacken von Passwörtern
Qbik

20
@ Fandango68 Diese Frage wurde vor Jahren auf Meta diskutiert . TLDR: Viele (die meisten?) Fragen zu SO könnten von schlechten Schauspielern missbraucht werden, aber wenn es keine eindeutigen Beweise für Fehlverhalten gibt, gehen wir von Treu und Glauben aus. Es gibt viele rechtmäßige und ethische Gründe, ein VBA-Passwort zu knacken. Darüber hinaus trägt die Erörterung von Schwachstellen der aktuellen Systeme letztendlich zu einer besseren Sicherheit in der Zukunft bei und hält die Menschen davon ab, sich jetzt blind auf unsichere Systeme zu verlassen.
jmbpiano

Antworten:


700

Sie können diesen direkten VBAAnsatz ausprobieren, für den keine HEX-Bearbeitung erforderlich ist. 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. Die VBE ruft eine Systemfunktion auf, um das Kennwortdialogfeld zu erstellen.
  2. Wenn der Benutzer das richtige Kennwort eingibt und auf OK klickt, gibt diese Funktion 1 zurück. Wenn der Benutzer das falsche Kennwort 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, "denkt" die VBE, dass das Kennwort richtig ist, daher wird das gesperrte VBA-Projekt geöffnet.
  5. Der folgende Code tauscht den Speicher der ursprünglichen Funktion zum Anzeigen des Kennwortdialogs gegen eine benutzerdefinierte Funktion aus, die beim Aufruf immer 1 zurückgibt.

Den Code verwenden

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 Modul1

    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 den obigen Code in Modul 1 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 zurück zu Ihren VBA-Projekten und genießen Sie.


4
@ Chris du hast absolut recht. Weil die Windows-API-Funktionen in diesem Code für Win 32 definiert sind.
Thc Thanh Nguyễn

8
Eine Erklärung wäre schön, wie das funktioniert.
Dennis G

20
Jetzt bleibt nur noch die Frage (nachdem ich gesehen habe, dass diese beeindruckende Methode perfekt funktioniert), wie zum Teufel ich mein VBA-Projekt stärker schützen kann, um zu verhindern, dass andere diesen Hack darauf
anwenden

6
Dieser Code funktioniert perfekt beim Entsperren des VBA-Codes, obwohl er mich jedes Mal, wenn ich ihn verwendet habe, daran hindert, das Projekt mit einem anderen Kennwort erneut zu schützen. Hat jemand anderes dieses Problem gehabt?
Matthew Bond

2
Ich fand, dass es das VBA-Projekt in der Excel-Datei beschädigt, also musste ich alle Module / Klassen exportieren, dann die Datei als xlsx (kein Makro) speichern, dann die Datei schließen (dummes Excel), dann wieder öffnen Module importieren und Code aus Klassendateien kopieren. Zu diesem Zeitpunkt konnte ich die Datei als xlsm mit meinem eigenen Kennwort für das VBA-Projekt speichern.
BH

217

Ja, solange Sie eine .xlsFormat-Tabelle verwenden (die Standardeinstellung für Excel bis 2003). Ab Excel 2007 ist die Standardeinstellung .xlsxein 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 gerade erstellte Datei mit einem Hex-Editor.
  5. Kopieren Sie die Zeilen beginnend mit den folgenden Tasten:

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

  7. Speichern Sie die Excel-Datei und beenden Sie.
  8. Öffnen Sie nun die Excel-Datei, in der der VBA-Code angezeigt werden soll. Das Kennwort für den VBA-Code lautet einfach 1234 (wie in dem hier gezeigten Beispiel).

Wenn Sie mit Excel 2007 oder 2010 arbeiten müssen, gibt es unten einige andere Antworten, die hilfreich sein können, insbesondere diese: 1 , 2 , 3 .

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


Was ist, wenn es keine Zeilen gibt, die mit CMG = ... beginnen?
Systemovich

1
In der leeren Excel-Datei oder in der gesperrten? Überprüfen Sie die Dateigröße der leeren Datei. Wenn es sich um die gesperrte Datei handelt, stellen Sie sicher, dass Ihre Sicherung sicher ist, und ändern Sie dann nur die beiden anderen Zeilen. Sind Sie sicher, dass es sich um eine verschlüsselte Datei handelt?
Colin Pickard

6
Der Excel 2007-Kennwortschutz (und das Dateiformat) unterscheiden sich grundlegend von Excel 2003. Ich habe einige Einzelheiten dazu in meine Antwort unten aufgenommen. Meiner Meinung nach ist die kennwortgeschützte Option für eine Excel 2007-Datei das erste Mal in der Microsoft Office-Geschichte, dass eine einigermaßen sichere Datei erstellt wurde.
Stewbob

1
Ich konnte kein vba-Passwort für eine neue Excel 2016-Datei festlegen. Könnte jemand einfach den HEX teilen, um ihn durch 1234 zu ersetzen? Oder kann es von Maschine zu Maschine wechseln?
Mescalito

1
Dieser Ansatz funktionierte für mich bei einer XLSM-Datei. Ich habe es als .xls gespeichert, dies getan und es dann wieder in .xlsm konvertiert. Es ist zu beachten, dass Sie die Länge der Datei sicher erhöhen können, wenn die neue CMG...Zeichenfolge länger als die ursprüngliche ist.
Drew Chapin

173

Ich habe auf der fantastischen Antwort von Thc 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 Modul1

    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 Modul 2 ein und führen Sie ihn aus

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

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


1
Ich bin nicht sicher warum, aber wenn ich dies unter Excel für 365 MSP 64-Bit Excel abstürze, werden die Dateien geschlossen und beim Neustart ist das Kennwort immer noch vorhanden.
Eborbad

Dies ist in Excel nicht mehr möglich, da die Optionen im Kontextmenü abgeblendet sind und Sie das Modul nicht erstellen können.
thanos.a

170

Es gibt eine andere (etwas einfachere) Lösung ohne Größenprobleme. Ich habe diesen Ansatz heute verwendet (in einer 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 das DPB=...Teil
  3. Ändern Sie die DPB=...Zeichenfolge inDPx=...
  4. Öffnen Sie die XLS-Datei in Excel
  5. Öffne den VBA-Editor ( ALT+ F11)
  6. Die Magie: Excel entdeckt einen ungültigen Schlüssel (DPx) und fragt, ob Sie das Projekt weiter laden möchten (ohne den Schutz zu beachten).
  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 an Ihrer VBA-Magie!

* HINWEIS: Stellen Sie sicher, dass Sie das Kennwort in einen neuen Wert geändert haben. Andernfalls werden beim nächsten Öffnen der Tabelle in Excel Fehler gemeldet (unerwarteter Fehler). Wenn Sie dann auf die Liste der VBA-Module zugreifen, werden die Namen der angezeigt Quellmodule erhalten jedoch einen weiteren Fehler beim Versuch, 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.


3
Leider hat dies bei Excel für Mac 2011 v14.2.5 nicht funktioniert. Ich hatte die Möglichkeit, die Datei zu reparieren, das Passwort nicht zurückzusetzen, und der Effekt war, dass alle VBA-Skripte verloren gingen.
Joe Carroll

Perfekte Lösung - Ich habe dies mit einer 2003-Datei mit HxD Hex Editor gemacht
Chris W

4
Ich habe es gerade versucht (.xls, Excel 2007) und es hat nicht funktioniert. Ergebnis ist: Die Module sind sichtbar, Code scheint zwar zu funktionieren, aber beim Öffnen eines Moduls wird ein unerwarteter Fehler angezeigt (40230) .
KekuSemau

2
Gleicher Fehler hier (Excel 2010) - aber dann wurde mir klar, dass ich das "Ein neues Passwort festlegen und speichern / erneut öffnen" (Schritte 7-9) von Pieter übersprungen hatte.
Owen B

+1 Diese Methode hat auch bei unserer schlecht entwickelten Access-Datei (.mdb) funktioniert! Jetzt können wir das Ding besser machen, danke dafür!
Er Gabriel Doronila

65

Colin Pickard hat eine ausgezeichnete Antwort, aber es gibt eine "Vorsicht". 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 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 weitere 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.

BEARBEITEN

Dies gilt nicht für Excel 2007/2010-Dateien. Das Standard-XLSX-Dateiformat ist eine ZIP-Datei, die zahlreiche Unterordner enthält, deren Formatierung, Layout, Inhalt usw. als XML-Daten gespeichert sind. Für eine ungeschützte Excel 2007-Datei können Sie einfach die XLSX-Erweiterung 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) tatsächlich mit RSA-Verschlüsselung verschlüsselt. Es ist nicht mehr möglich, die Erweiterung in .zip zu ändern und den Dateiinhalt zu durchsuchen.


Dann müssen Sie Standard-Zip-Hacking-Tools verwenden. Es ist kein Problem mehr, wie ich eine Excel-Datei sichern kann.
Anonymer Typ

3
@Anonymous Typ: Ich denke, ein Zip-Cracking-Tool hilft nicht. Soweit ich Stewbob verstehe, werden nicht die Dateieinträge in der Zip-Datei verschlüsselt, sondern die gesamte Zip-Datei selbst, die den Header und das zentrale Verzeichnis enthalten sollte.
Treb

2
Nur neugierig: Wie könnte es RSA sein, wenn ich nur ein Passwort (symmetrisch) eingebe?
Kizzx2

Wie wäre es, wenn die Datei, in die Sie gelangen möchten, die kürzeren Schlüssel hat? Erstellen Sie einfach so lange vba-Dokumente, bis Sie eine mit 137 erhalten?
Nur

1
Sind Sie sicher, dass die gesamte Zip-Datei verschlüsselt ist, wenn Sie das VBA-Projekt sperren? Ich kann immer noch die Zip-Datei öffnen und die Dateistruktur sehen ... Und der Unterordner xl \ enthält die Datei vbaProject.bin, die den bekannten Hashing-Block "CMG = ... GC =" enthält.
Nigel Heffernan

63

Für einen .xlsmoder .dotmDateityp müssen Sie dies auf eine etwas andere Weise tun.

  1. Ändern Sie die Erweiterung der .xlsmDatei in.zip .
  2. Öffnen Sie die ZIP-Datei (mit WinZip oder WinRar usw.) und wechseln Sie in den Ordner xl.
  3. Extrahieren Sie die vbaProject.binDatei und öffnen Sie sie in einem Hex-Editor (ich verwende HxD , es ist völlig kostenlos und leicht.)
  4. Suchen DPBund ersetzen Sie DPxdie Datei und speichern Sie sie.
  5. Ersetzen Sie die alte vbaProject.binDatei durch diese neue in der komprimierten Datei.
  6. Ändern Sie die Dateierweiterung wieder in .xlsm.
  7. Öffnen Sie die Arbeitsmappe und überspringen Sie die Warnmeldungen.
  8. Öffnen Sie Visual Basic in Excel.
  9. Gehen Sie zu Extras> VBAProject-Eigenschaften> Registerkarte Schutz.
  10. Geben Sie ein neues Passwort ein und speichern Sie die .xlsmDatei.
  11. Schließen und erneut öffnen und Ihr neues Passwort funktioniert.

8
Arbeitete in Excel 2016, Windows 10 64bit. (XLSM-Dateien)
LimaNightHawk

3
Arbeitete in Word 2016, Windows 10 64bit (Dotm-Dateien)
NBajanca

7
Tolle Lösung, hat bei mir in Excel 2013 64 Bit funktioniert. Sie können das Ändern von Dateierweiterungen überspringen, .zipwenn Sie 7-Zip installiert haben. In diesem Fall können Sie einfach mit der rechten Maustaste auf die .xlsmDatei klicken und "7-Zip -> Archiv öffnen"
nkatsar

funktioniert mit Word 2013, win7x64. (Es ist sehr traurig, so leicht ausgetrickst zu werden, dass der Code etwas sicher ist).
Berry Tsakala

1
@ThierryMichel Kombination aus früheren Lösungen und Versuch und Irrtum!
Matt

35

Wenn Sie eine Excel 2007-Datei (xlsm) haben, können Sie diese einfach als Excel 2003-Datei (xlsm) speichern und die in anderen Antworten beschriebenen Methoden verwenden.


4
das ist nicht wahr, ich habe mit Dateien gearbeitet, für die eine Konvertierung von xlsm nach xls / xla unmöglich war, Excel 2007 und 2010 stürzten jedes Mal ab, ich habe verschiedene Instanzen aus einer Fehlermeldung ausprobiert - Kod wyjątku: c0000005 Przesunięcie wyjątku: 005d211d
Qbik

4
JA, du kannst es schaffen. Ich habe es oft gemacht. Wenn es etwas auf Blättern gibt, das notwendig ist und was nicht auf die ältere Version übertragen wird, mache ich das: 1.Konvertiere .xlsm in .xls 2.knacke den Code von .xls 3.konvertiere .xlsm in .xlsx 4.Setze den Code von Modulen in .xls in. xlsx und speichern Sie das als .xlsm
ZygD

Es funktioniert nach der Konvertierung von xlsm in xls wie in der Antwort.
Purus

32

Wenn ich an der Reihe bin, basiert dies auf der hervorragenden Antwort von kaybee99, die auf der fantastischen Antwort von Thc Thanh Nguyễn basiert, 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 arbeitet daran

Word / Excel 2016 - 32-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 Modul1

    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 Modul 2 ein und führen Sie ihn aus

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

3
Perfekt! Arbeiten Sie mit Windows Server 2016, Excel 2016 32 Bit
Zin Min

Dies funktionierte mit einer XLSM-Datei in Excel Office 365. Vielen Dank!
Ryan James

Funktioniert noch im Jahr 2019, Office 365 64-Bit-Builds, tolle Jungs!
XavierAM

Vielen Dank für den aktualisierten Code, ich hatte Abstürze mit der vorherigen Version (64-Bit), aber alles gut mit Ihrer Version
emjaySX


17

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 daher direkten Zugriff auf nahezu alles ermöglichten.

Dies ist eine Weile her, und wenn das nicht nur ein Zufall von meiner Seite war, wurde es möglicherweise auch gepatcht.


15

Für den Fall, dass Ihr Block von CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX" in Ihrer Datei "Bekanntes Passwort" kürzer ist als der vorhandene Block in der Datei "Unbekanntes Passwort", 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"

sollte in der unbekannten Passwortdatei auf gesetzt sein

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

Ich habe dies auch mit .XLA-Dateien (97/2003 Format) in Office 2007 arbeiten lassen.


1
Dies funktioniert, aber wie ich kürzlich festgestellt habe (siehe oben), können Sie nach dem endgültigen Abschluss-Anführungszeichen im GC = "..." - Block einfach Nullzeichen hinzufügen, bis Sie die gleiche Länge erreicht haben.
tobriand

13

Ab Excel 2007 müssen Sie Ihre Dateierweiterung in .zip ändern. Im Archiv befindet sich ein Unterordner xl. Dort finden Sie vbaProject.bin. Befolgen Sie den obigen Schritt mit vbaProject.bin und speichern Sie es wieder im Archiv. Ändern Sie Ihre Erweiterung und voilà zurück! (dh folgen Sie den obigen Schritten)


1
Ich kann bestätigen, dass dies auch für .xlam-Dateien mit Excel 2010 funktioniert. +1!
Gimelist

12

VBA-Projektkennwörter für Access-, Excel-, Powerpoint- oder Word-Dokumente ( 2007, 2010, 2013 or 2016Versionen mit Erweiterungen .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM) können problemlos entfernt werden .

Es geht einfach darum, die Dateinamenerweiterung in zu .ZIPändern, die Datei zu entpacken und einen einfachen Hex-Editor (wie XVI32) zu verwenden ) zu verwenden, um das vorhandene Kennwort zu "brechen", wodurch Office "verwirrt" wird und beim nächsten nach einem neuen Kennwort wird geöffnet.

Eine Zusammenfassung der Schritte:

  • Benennen Sie die Datei so um, dass sie eine hat .ZIP Erweiterung hat.
  • öffne das ZIPund gehe zumXL Ordner.
  • extrahieren vbaProject.binund öffnen Sie es mit einem Hex-Editor
  • "Suchen & Ersetzen", um "alle zu ersetzen", wechselt DPBzu DPX.
  • Speichern Sie die Änderungen, platzieren Sie die .binDatei wieder in der Zip-Datei, kehren Sie zur normalen 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 Projektexplorer, um eine Auswahl zu treffen VBA Project Properties.
  • ProtectionLegen Sie auf der Registerkarte 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.

Zu diesem Zeitpunkt können Sie das Kennwort bei Bedarf vollständig entfernen.

Eine vollständige Anleitung mit Schritt- für -Schritt - Video habe ich „Weg zurück , wenn“ sind auf YouTube hier .

Es ist schockierend, dass es diese Problemumgehung seit Jahren gibt und Microsoft das Problem nicht behoben hat.


Die Moral der Geschichte?

Microsoft Office VBA - Projekt Passwörter sind nicht darauf verlassen , werden für Sicherheit jeder sensible Informationen . Wenn Sicherheit wichtig ist, verwenden Sie Verschlüsselungssoftware von Drittanbietern.


9

Colin Pickard ist größtenteils korrekt, aber verwechseln Sie den Schutz zum Öffnen des Kennworts für die gesamte Datei nicht mit dem VBA-Kennwortschutz, der sich vollständig vom vorherigen unterscheidet und für Office 2003 und 2007 identisch ist (für Office 2007 umbenennen) die Datei in .zip und suchen Sie nach der Datei vbaProject.bin in der Zip). Technisch gesehen besteht die richtige Methode zum Bearbeiten der Datei darin, einen zusammengesetzten OLE-Dokument-Viewer wie CFX zu verwenden, um den richtigen Stream zu öffnen. Wenn Sie nur Bytes ersetzen, funktioniert der einfache alte Binäreditor natürlich.

Ü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


2
Der folgende Link enthält Details zu den Dateien im XSLM-Format. gbanik.blogspot.co.uk/2010/08/… Die Lösung ist die gleiche wie die von Yuhong Bao oben beschriebene, bietet jedoch eine interessante Lektüre und enthält Screenshots.
JohnLBevan

7

Wenn es sich bei der Datei um eine gültige Zip-Datei handelt (die ersten Bytes werden 50 4Bin Formaten wie verwendet .xlsm), entpacken Sie die Datei und suchen Sie nach der Subdatei xl/vbaProject.bin. Dies ist eine CFB-Datei wie die.xls Dateien. Befolgen Sie die Anweisungen für das XLS-Format (angewendet auf die Subdatei) und komprimieren Sie dann einfach 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 DPB=Block zu suchen und den Text zu ersetzen

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

mit Leerzeichen. Dies vermeidet Probleme mit der CFB-Containergröße.


7

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

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

1
Nett! Ich denke, Sie haben eine Gegenstimme erhalten, weil Ihre Lösung eher das Arbeitsblatt als das VBA-Modul freischaltet. Trotzdem fand ich es hilfreich - also danke!
PBD10017

1
Ich habe dieses es mein persönliches Arbeitsbuch. Die Autoren zitierten Bob McCormick als Originalautor, der später von Norman Harker und JE McGimpsey 2002 modifiziert wurde.
Charles Byrne

5

ElcomSoft stellt Advanced Office Password Breaker- und Advanced Office Password Recovery- Produkte her, die für diesen Fall gelten können, sofern das Dokument in Office 2007 oder früher erstellt wurde.


4

Tom - Ich habe anfangs einen Schuljungenfehler gemacht, da ich die Bytegröße nicht beobachtet habe und stattdessen von der "CMG" -Einstellung bis zum nachfolgenden Eintrag kopiert und eingefügt habe. Dies waren jedoch zwei unterschiedliche Textgrößen zwischen den beiden Dateien, und ich verlor das VBA-Projekt, genau wie Stewbob es warnte.

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 (hex für 143) anzeigt, und ebenso beim Einfügen in die gesperrte Datei - ich hatte am Ende der Paste die doppelte Anzahl von "...", was irgendwie seltsam aussah und sich fast anfühlte unnatürlich, aber es hat funktioniert.

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

Ich hoffe das hilft.


4

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.


Ich habe dieses Tool getestet und funktioniert sehr gut, aber die kostenlose Version ruft die ersten 53 Zeilen ab. Um meine Datei wiederherzustellen, musste ich Andys Anweisungen folgen, um das Passwort zu entsperren. Dann habe ich mein xlsm mit VbaDiff in beiden Fenstern geöffnet und dann mit meinem Code auf das Blatt geklickt. Ich habe es mit Copy-Paste bekommen und es in meine wiederhergestellte, aber vba-leere Excel-Datei gelegt.
thanos.a

2

Der Schutz ist ein einfacher Textvergleich in Excel. Laden Sie Excel in Ihren bevorzugten Debugger ( Ollydbg ist mein bevorzugtes Tool), suchen Sie den Code, der den Vergleich durchführt, und korrigieren Sie ihn so, dass immer true zurückgegeben wird. Dadurch sollten Sie auf die Makros zugreifen können.


1

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: Erstellen Sie zuvor ein Backup.

Die Schritte, die ich unternommen habe:

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

Ich hoffe das hat einigen von euch geholfen!


Ich habe erfolgreich eine alte XLS-Datei unter Windows 10 in der neuesten Version von Excel 365 geöffnet, während die Top-Antwort leider nicht mehr funktioniert. Ich habe HxD heruntergeladen und den letzten Buchstaben wie empfohlen geändert und die Fehler übersprungen. Alles gut jetzt, danke!
Starnes Student

0

Die Erweiterung Ihrer Excel-Datei wird in XML geändert. Und öffnen Sie es im Notizblock. Passwort Text in XML-Datei finden.

Sie sehen wie unter der Linie;

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

(Entschuldigung für mein schlechtes Englisch)


Können Sie erklären, wie Ihre Antwort besser ist als die sehr guten, die Sie bereits erhalten haben?
Noel Widmer

Meine Lösung hat keinen Code. also sehr kompakte Lösung anders als.
Developer33

1
Diese von Ihnen bereitgestellte Lösung funktioniert 2019 nicht.
Daniel L. VanDenBosch

Es funktioniert auch nicht für mich in Office 365
thanos.a

0

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.