用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和Bstring用作特定工作簿中的工作表的密码?

Excel工作表密码保护通过将input密码转换为散列并存储起来。 哈希是一种单向algorithm,它可以逐步处理这些比特,沿途丢失一些信息,但是会生成原始数据的指纹。 由于数据丢失,不可能通过反转哈希来获取原始密码,但是如果某人键入密码,则可以对其进行散列并与存储的散列进行比较。 这(通常)使得它比将密码存储为string进行比较更安全。

到目前为止,我所遇到的最好的描述是如何强制Excel哈希algorithm工作是在页面@mehow链接,张贴由托本克莱恩。 他的回答可以概括为:

  1. Excel哈希函数将可能密码的大空间映射到可能哈希的小空间。
  2. 由于哈希algorithm产生如此小的哈希,15位,可能的哈希数是2 ^ 15 = 32768哈希。
  3. 在应用计算能力时,32768是很less的事情。 Klein派生出一个涵盖所有可能哈希的input密码的子集。

基于Excel的散列函数的描述 ,下面的代码生成与Excel相同的散列,您可以使用它来testingKlein的函数。

 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保护密码更改为“macros”,包括.xlsm(2007+版本)在内的所有excel文件。 你可以通过浏览他的代码来看看它是如何工作的。

这里是男人的博客(信贷在哪里): 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. 创build一个新的.xlsm文件。
  2. 在VBA部分,设置一个简单的密码(例如“macros”)。
  3. 保存该文件并退出。
  4. 将文件扩展名更改为“.zip”,由任何存档程序打开。
  5. find文件:'vbaProject.bin'(在'xl'文件夹中)。
  6. 从档案中提取它。
  7. 用hex编辑器打开刚刚提取的文件。
  8. 查找并复制参数DPB(引号中的值)的值,例如:DPB =“282A84CBA1CBA1345FCCB154E20721DE77F7D2378D0EAC90427A22021A46E9CE6F17188A”。 (为“macros”密码生成此值,可以使用此DPB值跳过步骤1-8)

  9. 对步骤4-7中的密码未知的文件(要解锁的文件)执行。

  10. 在第8步中复制的值中更改此文件中的DBP值。

    如果复制值比encryption文件中的短,则应使用0(零)填充缺less的字符。 如果价值更长 – 这不是问题(按原样粘贴)。

  11. 保存'vbaProject.bin'文件并退出hex编辑器。

  12. 用已修改的文件replace现有的“vbaProject.bin”文件。
  13. 将“.zip”的扩展名更改回“.xlsm”
  14. 现在,打开你需要查看VBA代码的excel文件。VBA代码的密码就是macros(就像我在这里展示的例子)。