Skip to content

Instantly share code, notes, and snippets.

@Thesharing
Created March 15, 2018 07:57
Show Gist options
  • Save Thesharing/715a1d59af81eac53c7086fb291ee83b to your computer and use it in GitHub Desktop.
Save Thesharing/715a1d59af81eac53c7086fb291ee83b to your computer and use it in GitHub Desktop.
Break passwords of encrypted excel files.
Sub PasswordBreaker()
    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)
    ActiveWorkbook.Sheets(1).Select
    Range("a1").FormulaR1C1 = 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
Public Sub PasswordBreaker()
    Const DBLSPACE As String = vbNewLine & vbNewLine
    Const HEADER As String = "Password Breaker"
    Const ALLCLEAR As String = "Password cleared. Please use 'Save As...' to save."
    Const MSGNOPWORDS As String = "This workbook is not encrypted."
    Const MSGTAKETIME As String = "It may take a long time to break passwords. Press 'OK' to start."
    Const MSGPWORDFOUND As String = "Password is: " & "$$" & _
    "If there are other passwords, it will search for next one and break it."
    Const MSGONLYONE As String = "Make sure there is only one password?"
    Dim w1 As Worksheet, w2 As Worksheet
    Dim i As Integer, j As Integer, k As Integer, l As Integer
    Dim m As Integer, n As Integer, i1 As Integer, i2 As Integer
    Dim i3 As Integer, i4 As Integer, i5 As Integer, i6 As Integer
    Dim PWord1 As String
    Dim ShTag As Boolean, WinTag As Boolean
    Application.ScreenUpdating = False
    With ActiveWorkbook
        WinTag = .ProtectStructure Or .ProtectWindows
    End With
    ShTag = False
    For Each w1 In Worksheets
        ShTag = ShTag Or w1.ProtectContents
        Next w1
        If Not ShTag And Not WinTag Then
            MsgBox MSGNOPWORDS, vbInformation, HEADER
            Exit Sub
        End If
        MsgBox MSGTAKETIME, vbInformation, HEADER
        If Not WinTag Then
        Else
            On Error Resume Next
            Do 'dummy do loop
                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
                                With ActiveWorkbook
                                    .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 .ProtectStructure = False And _
                                    .ProtectWindows = False Then
                                    PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
                                    Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
                                    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
                                    MsgBox Application.Substitute(MSGPWORDFOUND, _
                                    "$$", PWord1), vbInformation, HEADER
                                    Exit Do 'Bypass all for...nexts
                                End If
                            End With
                            Next: Next: Next: Next: Next: Next
                            Next: Next: Next: Next: Next: Next
                        Loop Until True
                        On Error GoTo 0
                    End If
                    
                    If WinTag And Not ShTag Then
                        MsgBox MSGONLYONE, vbInformation, HEADER
                        Exit Sub
                    End If
                    On Error Resume Next
                    
                    For Each w1 In Worksheets
                    'Attempt clearance with PWord1
                        w1.Unprotect PWord1
                        Next w1
                        On Error GoTo 0
                        ShTag = False
                        For Each w1 In Worksheets
                        'Checks for all clear ShTag triggered to 1 if not.
                            ShTag = ShTag Or w1.ProtectContents
                            Next w1
                            If ShTag Then
                                For Each w1 In Worksheets
                                    With w1
                                        If .ProtectContents Then
                                            On Error Resume Next
                                            Do 'Dummy do loop
                                                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
                                                                .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 Not .ProtectContents Then
                                                                    PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
                                                                    Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
                                                                    Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
                                                                    MsgBox Application.Substitute(MSGPWORDFOUND, _
                                                                    "$$", PWord1), vbInformation, HEADER
                                                                    'leverage finding Pword by trying on other sheets
                                                                    For Each w2 In Worksheets
                                                                        w2.Unprotect PWord1
                                                                        Next w2
                                                                        Exit Do 'Bypass all for...nexts
                                                                    End If
                                                                    Next: Next: Next: Next: Next: Next
                                                                    Next: Next: Next: Next: Next: Next
                                                                Loop Until True
                                                                On Error GoTo 0
                                                            End If
                                                        End With
                                                        Next w1
                                                    End If
                                                    MsgBox ALLCLEAR, vbInformation, HEADER
                                                End Sub
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment