Excelowy ice-breaker Excel 2013

Poniższy fragment kodu jest bardzo dziwny. Natknąłem się na niego gdzieś w sieci. Kod wydaje się z jakiegoś powodu łamać zabezpieczone hasłem skoroszyty Excela. Odblokowuje je przy pomocy mniej lub bardziej losowego hasła, z pewnością innego niż użyte do zablokowania skoroszytu. Kod sam w sobie jest napisany dość topornie, jednak... działa. Generuje sekwencję haseł o długości 12 znaków. Pierwsze 11 znaków to A lub B, ostatni to znak ASCII o numerze od 32 do 126. Wygląda na to, że kod wykorzystuje jakiś bug Excela 2013, bo odblokowuje skoroszyty hasłem, którym nie zostały zablokowane. Największa ilość prób jaką udało mi się uzyskać to ok. 40 000 co zajmuje na moim sprzęcie 20 sekund.

I najlepsze na koniec – czas potrzebny na odblokowanie arkusza nie zależy od długości hasła, którym został zabezpieczony. Poniższy kod można wkleić do nowo utworzonego modułu w zabezpieczonym pliku. Wystarczy odpalić suba (F5) i efekt murowany.

Sub PasswordBreaker()

'Breaks worksheet password protection.
Dim save_trials As Boolean: save_trials = 1
If save_trials = True Then Open "C:\out.txt" For Output As #1

Dim phrase As String
Dim counter As Integer: counter = 0
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

            phrase = Chr(i) & Chr(j) & Chr(k) & _
            Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
            Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
            ActiveSheet.Unprotect phrase

            counter = counter + 1
            If save_trials = True Then Write #1, CStr(counter) + ”; ” + phrase;
            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) + " Found during trial number: " + CStr(counter)
            If save_trials = True Then Close #1
            Exit Sub
            End If

Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next

End Sub