Взлом пароля листа с помощью 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-->
- хэш-функция Excel сопоставляет большое пространство возможных паролей с небольшим пространством возможных хэшей.
- поскольку алгоритм хэширования генерирует такие маленькие хэши, 15 биты, количество возможных хэшей составляет 2^15 = 32768 хэшей.
- 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) файлы делают следующие шаги:
- создать новый .файл xlsm.
- в части VBA установите простой пароль (например, "макрос").
- сохраните файл и выйдите.
- изменить расширение файла с '.zip-архив, откройте его любой программой архиватором.
- найти файл: 'виде vbaproject.bin '(в папке' xl').
- извлечь его из архива.
- открыть файл, который был извлечен с HEX-редактором.
найдите и скопируйте значение из параметра DPB (значение в кавычках), пример: DPB= "282A84CBA1CBA1345FCCB154E20721DE77F7D2378D0EAC90427A22021A46E9CE6F17188A". (Это значение, сгенерированное для пароля' macro'. Вы можете использовать это значение DPB, чтобы пропустить шаги 1-8)
выполните шаги 4-7 для файл с неизвестный пароль (файл, который вы хотите разблокировать).
-
измените значение DBP в этом файле на значение, скопированное на шаге 8.
Если скопированное значение короче, чем в зашифрованном файле, вы должны заполнить отсутствующие символы 0 (ноль). Если значение больше - это не проблема (вставьте его как есть).
сохранить ' vbaProject.bin ' файл и выход из hex редактор.
- заменить существующий ' vbaProject.bin ' файл с измененным.
- изменить расширение с '.zip' back to '.файл xlsm'
- теперь откройте файл excel, в котором вам нужно увидеть код VBA. Пароль для кода VBA будет просто макрос (как в Примере, который я показываю здесь).