使用 VBA 的 Excel 2013 及更高版本中受保护工作表的密码破解程序

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/37334365/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-08 10:26:04  来源:igfitidea点击:

Password Cracker of Protected Sheet in Excel 2013 and Later using VBA

excelvbaexcel-vba

提问by Meedee

Anybody knows if there are other ways to crack a password of a protected sheet in excel? I have been using these codes ever since but now, it doesn't seem to work anymore. The file just says "Not Responding" every time I run the code. I'm using MS Office 2013.

有人知道是否有其他方法可以破解excel中受保护工作表的密码?从那以后我一直在使用这些代码,但现在,它似乎不再起作用了。每次我运行代码时,该文件只是说“无响应”。我正在使用 MS Office 2013。

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

回答by gtwebb

Excel has updated their sheet protection security in Excel 2013 and newer so this macro won't work anymore, see here.

Excel 已在 Excel 2013 及更高版本中更新了其工作表保护安全性,因此此宏将不再起作用,请参见此处

From the link it sounds like if you save the file as an xls file (Excel 1997-2003) it is forced to drop the newer security as it wasn't compatible with the file type. You could then run your macro.

从链接看来,如果您将文件另存为 xls 文件(Excel 1997-2003),它会被迫放弃较新的安全性,因为它与文件类型不兼容。然后你可以运行你的宏。

Saving as an older file version may make certain parts of the workbook not work.

保存为较旧的文件版本可能会使工作簿的某些部分无法工作。

回答by Meedee

I'm not sure how this works but I was able to Unprotect the sheet. I did a "save as" and changed the Type to: "Excel 97-2003". When I opened the file & unprotect the sheet, it did not ask for a password anymore. :) And my workbook still works fine.

我不确定这是如何工作的,但我能够取消保护工作表。我做了一个“另存为”并将类型更改为:“Excel 97-2003”。当我打开文件并取消保护工作表时,它不再要求输入密码。:) 我的工作簿仍然可以正常工作。

回答by Kawi42

Since a recent update, Excel has an issue with a high try rate to command Unprotect. A few slow-down makes the code run again: Put something like this right before the Unprotect line, i.e. into the most inner loop:

自最近的更新以来,Excel 有一个问题,即命令取消保护的尝试率很高。一些减速使代码再次运行:在 Unprotect 行之前放置类似这样的东西,即进入最内部的循环:

Debug.Print Chr(i) & Chr(j) & Chr(k) _
      & Chr(l) & Chr(m) & Chr(i1) _
      & Chr(i2) & Chr(i3) & Chr(i4) _
      & Chr(i5) & Chr(i6) & Chr(n)
DoEvents

With this (speed-) modification, the initial mentioned approach works also with Excel 2013 and Excel 2016.

通过这种(速度)修改,最初提到的方法也适用于 Excel 2013 和 Excel 2016。

回答by YBNormal

Thanks Kawi, that works perfectly.

谢谢 Kawi,它完美地工作。

Here is the full code with Kawi's modification:

这是 Kawi 修改后的完整代码:

Sub PasswordBreaker()
'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
Debug.Print Chr(i) & Chr(j) & Chr(k) _
      & Chr(l) & Chr(m) & Chr(i1) _
      & Chr(i2) & Chr(i3) & Chr(i4) _
      & Chr(i5) & Chr(i6) & Chr(n)
DoEvents
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