Взлом пароля листа с помощью VBA

Я нашел этот код VBA для разблокировки листов, не зная пароля:

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

мой вопрос: какой эксплойт он использует для работы?

другими словами, как эта сгенерированная строка A и B может использоваться в качестве пароля к листу внутри конкретной книги ?

3 ответов


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

на лучшее описание на сегодняшний день я столкнулся с о том, как грубое принуждение работает алгоритм хэширования Excel, находится на странице @mehow links to, опубликованной Torben Klein. Его ответ можно резюмировать так:--2-->

  1. хэш-функция Excel сопоставляет большое пространство возможных паролей с небольшим пространством возможных хэшей.
  2. поскольку алгоритм хэширования генерирует такие маленькие хэши, 15 биты, количество возможных хэшей составляет 2^15 = 32768 хэшей.
  3. 32768-это крошечное количество вещей, которые нужно попробовать, когда применяется вычислительная мощность. Клейн получает подмножество входных паролей, которые охватывают все возможные хэши.

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

Option Explicit
'mdlExcelHash

Public Function getExcelPasswordHash(Pass As String)
    Dim PassBytes() As Byte
    PassBytes = StrConv(Pass, vbFromUnicode)
    Dim cchPassword As Long
    cchPassword = UBound(PassBytes) + 1
    Dim wPasswordHash As Long
    If cchPassword = 0 Then
        getExcelPasswordHash = wPasswordHash
        Exit Function
    End If

    Dim pch As Long
    pch = cchPassword - 1
    While pch >= 0
        wPasswordHash = wPasswordHash Xor PassBytes(pch)
        wPasswordHash = RotateLeft_15bit(wPasswordHash, 1)
        pch = pch - 1
    Wend

    wPasswordHash = wPasswordHash Xor cchPassword
    wPasswordHash = wPasswordHash Xor &HCE4B&
    getExcelPasswordHash = wPasswordHash
End Function

Private Function RotateLeft_15bit(num As Long, Count As Long) As Long
    Dim outLong As Long
    Dim i As Long
    outLong = num
    For i = 0 To Count - 1
        outLong = ((outLong \ 2 ^ 14) And &H1) Or ((outLong * 2) And &H7FFF) 'Rotates left around 15 bits, kind of a signed rotateleft
    Next
    RotateLeft_15bit = outLong
End Function

Function breakIT()
   Dim pass, bin As String: Dim dec As Integer
   On Error Resume Next
   For dec = 0 To 2047
     bin = WorksheetFunction.Dec2Bin(dec)
     For char_last = 32 To 126
        pass = Right("0000000000" & bin, 11)
        pass = Replace(pass, "0", "A"): pass = Replace(pass, "1", "B")
        pass = pass & Chr(char_last)
        ActiveSheet.Unprotect pass
        If Not ActiveSheet.ProtectContents Then 
           MsgBox "Sheet unprotected! Optimal pass: " & pass: On Error GoTo 0: Exit function
        EndIf 
     Next
   Next
End Function


Sub Worksheet_pass_break()
If ActiveSheet.ProtectContents = True Then
    breakIT
Else
    Select Case MsgBox("Sheet not protected. Do you want to protect it now for testing?", vbYesNo, "Not protected")
     Case vbYes
        random_text = ""
        Randomize
        For i = 1 To 10: random_text = random_text & Chr(Int((94 * Rnd) + 32)): Next i
        ActiveSheet.Protect "#TEST_Pass#_123456" & random_text
        breakIT
    Case vbNo
        Exit Sub
    End Select
End If
End Sub

кто-то сделал рабочий код vba, который изменяет пароль защиты vba на "макрос" для всех файлов excel, в том числе .файл xlsm (2007+ версии). Вы можете увидеть, как это работает, просматривая его код.

вот блог парня (кредиты, где он должен):http://lbeliarl.blogspot.com/2014/03/excel-removing-password-from-vba.html

вот файл, который делает работу: https://docs.google.com/file/d/0B6sFi5sSqEKbLUIwUTVhY3lWZE0/edit

вставлено из предыдущего сообщения из его блога:

Для Excel 2007/2010 (.xlsm) файлы делают следующие шаги:

  1. создать новый .файл xlsm.
  2. в части VBA установите простой пароль (например, "макрос").
  3. сохраните файл и выйдите.
  4. изменить расширение файла с '.zip-архив, откройте его любой программой архиватором.
  5. найти файл: 'виде vbaproject.bin '(в папке' xl').
  6. извлечь его из архива.
  7. открыть файл, который был извлечен с HEX-редактором.
  8. найдите и скопируйте значение из параметра DPB (значение в кавычках), пример: DPB= "282A84CBA1CBA1345FCCB154E20721DE77F7D2378D0EAC90427A22021A46E9CE6F17188A". (Это значение, сгенерированное для пароля' macro'. Вы можете использовать это значение DPB, чтобы пропустить шаги 1-8)

  9. выполните шаги 4-7 для файл с неизвестный пароль (файл, который вы хотите разблокировать).

  10. измените значение DBP в этом файле на значение, скопированное на шаге 8.

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

  11. сохранить ' vbaProject.bin ' файл и выход из hex редактор.

  12. заменить существующий ' vbaProject.bin ' файл с измененным.
  13. изменить расширение с '.zip' back to '.файл xlsm'
  14. теперь откройте файл excel, в котором вам нужно увидеть код VBA. Пароль для кода VBA будет просто макрос (как в Примере, который я показываю здесь).