Как работает защита паролей Excel

Этот код плавает по сети уже несколько лет - он, по-видимому, может предоставить пароль для дешифрования таблицы Excel, которой вы не знаете пароль.

http://www.theofficeexperts.com/VBASamples/Excel02.htm

Мне интересно, как это работает, но я, похоже, не в состоянии это решить. Я предполагаю, что он зашифрован под определенным значением, которое можно получить несколькими способами (несколько мест в сети говорят, что он даст вам оригинальный пароль или другой, который будет работать) вроде как открытый ключ - вы можете иметь 100 открытых ключей, которые работают с одним частным.

Мне кажется, что он создает целочисленные переменные и заполняет их определенным числом, прежде чем превращать это число в соответствующие символы. Разве это не всегда будет одинаково? Если да, существует ли "главный пароль" для защиты Excel?

Спасибо всем!

EDIT: Я заметил, что For n = 32 до 126 в приведенном выше примере кода. Перекрестные ссылки с таблицей ASCII, которая, кажется, все символы от места до тильды. Является ли это своего рода атакой по словарю, которую я не понимаю из-за синтаксиса?

Ответ 1

Это маленький мир, поскольку код указывает, что я разместил этот код на другом форуме около 10 лет назад, увидев его где-то в другом месте - я думаю, что John Walkenbach's старый веб-сайт

Важно отметить, что эта защита кода применяется только к защите рабочего листа - не к открытию файла Excel или паролям VBA.

  • Один из примеров этой полной записи - здесь (снимок экрана ниже)
  • googling excel sheet protection "test" and "zzyw" дает другие ссылки, такие как от Tom Urtis

enter image description here

Ответ 2

Увлекательный - раньше я знал фрагмент кода, но не объяснение, которое написал бреттдж. Как объяснили другие, это поиск грубой силы для хеш-коллизий. Фактически, похоже, это было сделано методом проб и ошибок, так как оно делает гораздо больше работы, чем необходимо (сгенерировано 194560 комбинаций, но есть только 32768 хэш-значений).

Короткий алгоритм хеширования Excel (как описано в http://chicago.sourceforge.net/devel/docs/excel/encrypt.html):

  • Возьмите код ascii каждого символа passwort.
  • Относитесь к нему как к 16-битовому номеру. Сдвиньте его биты влево, в зависимости от положения символа (1 бит для первого символа, 2 для второго и т.д.).
  • XOR все символы вместе, давая 16-битный подписанный int >= 0.
  • XOR, которые приводят к длине пароля и магическому числу.

Зная это, можно приступить к поиску грубой силы следующим образом:

  • Самый старший бит всегда равен нулю, поэтому для тестирования требуется 15 бит.
  • Разделите их на три счетчика, каждый из которых покрывает 5 бит. Таким образом, каждый счетчик может представлять печатный ascii char.
  • Установите ascii-представление этих счетчиков в строку паролей, чтобы они не влияли друг на друга.

Самый простой способ - использовать 11-значный пароль и поместить счетчики в позиции 1, 6 и 11. Переключение бит на шаге 2 выравнивает бит счетчика в правильном направлении: первый счетчик ( "x" ) сдвинутый 1 бит, второй ( "y" ) - 6 бит, третий ( "z" ) - 11 бит. В поразрядном представлении хеша счетчики влияют на следующие биты:

bit: 76543210 76543210
cnt: -zzzzyyy yyxxxxxz

Операции XOR можно игнорировать, поскольку аргумент XOR постоянно постоянный. По этой же причине можно добавить постоянное смещение (например, 64). Также не имеет значения, какой символ используется для других байтов пароля (2-5, 7-10).

Повторяя все возможные комбинации x, y, z, вы в конечном итоге найдете пароль, который дает то же самое значение хэш-функции, что и исходное.

Public Sub demo()
    ' http://stackoverflow.com/questions/12852095/how-does-excels-worksheet-password-protection-work
    Dim x As Integer, y as Integer, z as Integer
    Dim part1 As String, part12 As String
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Worksheets(1)

    sh.Protect "$ome_Insanely_Long_and_c0mplex_password! [(which i$ imp*ssible t0 re-member)]"

    For x = 64 To 95
        ' pad with dots, so that x, y and z affect nonoverlapping bits of the hash.
        part1 = Chr(x) + "...."
        For y = 64 To 95
            part12 = part1 + Chr(y) + "...."
            For z = 64 To 95
                On Error Resume Next
                    sh.Unprotect part12 + Chr(z)
                    If Err.Number = 0 Then
                        Debug.Print "Password: '" & part12 + Chr(z) & "'"
                        Exit Sub
                    End If
                On Error GoTo 0
            Next
        Next
    Next
End Sub

Ответ 3

Просто догадаться, но мне кажется, что тесты Excel проверяются, если пароль действителен, запустив его через какую-то хэш-функцию, которая производит довольно небольшой диапазон результатов и сравнивает ее с сохраненным хешированным значением.

Предположительно, эта функция выполняет тестирование всех этих значений, пока не найдет тот, который работает. Судя по используемым значениям, хеш-функция производит 2 ^ 11 * (126-31) разные значения, все из которых могут быть получены значениями, генерируемыми в этом коде.

Мой анализ предполагает, что эта процедура работает. Я не тестировал его.

Ответ 4

Код выполняет поиск грубой силы с использованием паролей шифрования AAAAAAAAAAA (SPACE) через BBBBBBBBBBB (~), где (SPACE) является символом пробела (CHR (32)) и (~), конечно, является символом 126. Когда пароль что он отображает пароль в окне сообщения.

Конечно, это означает, что он проверяет только пароли длиной 12 символов и состоят только из прописных букв A (ASCII 65) и B (ASCII 66), за которыми следует один из печатаемых символов ASCII. @mkingston правильно, что он тестирует 2 ^ 11 * (126-31) разные значения. Но нет хеш-функции. Я не думаю, что это приведет к взлому многих электронных таблиц. Вам было бы лучше использовать Одна из этих программ из AccessData.

Подробнее о ActiveSheet.Protect и ActiveSheet.Unprotect см. http://msdn.microsoft.com/en-us/library/office/aa191957(v=office.10).aspx.

Ответ 5

Sub FindPassword()
    '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