Excel工作表保护的密码破解与清除

转自腾讯云社区

Posted by 浅唱 on January 28, 2024

网上下载来的 Excel 经常会有工作表保护,也就是无法修改,妄图做任何修改的时候你就会看见这句话:

您试图更改的单元格或图表位于受保护的工作表中。若要进行更改,请取消工作表保护。您可能需要输入密码。

那么这篇文章可以简单的帮你解决这个问题…因为 Excel 中内置了 Visual Basic,所以我们写个宏暴力破解密码就可以了。。。

  1. 当然是先打开有保护密码的 Excel 文件

  2. 新建一个宏(不同版本的 office 宏所在的位置不一样,一般都在”菜单—视图” 中)
    然后我们点击”录制宏”,名字随便写,然后再次点击,会发现录制宏的位置已经变成了“停止录制”,点击“停止录制”

  3. 在停止录制后我们点击“查看宏”,找到我们刚才新建的宏,比如我新建的名为“asd”,选中后点击”编辑”

  4. 然后在弹出的框中我们可以看到我们新建的空宏”asd”
  5. 把这个框内的所有内容全部删除,将下面的所有代码复制进去

  6. 关闭 Visual Basic,回到我们的 Excel,当然这里不需要保存,直接右上角叉掉即可

  7. 然后我们回到最初的位置,点击“查看宏”,就会发现刚才我们新建的空宏已经不见了,取而代之的是一个名为”Password_cracking”的宏
  8. 选中这个宏,点击执行,就可以破解当前这份 Excel 中的工作保护密码了

当然在执行完这个宏之后,当前打开的 Excel 中的密码已经被清除,你可以选择直接保存这份 Excel,这样的话你的 Excel 就不再有密码了,也可以选择记下破解出来的密码,然后关闭这个 Excel 重新打开一次,输入密码解除保护

  Public Sub Password_cracking()
  Const DBLSPACE As String = vbNewLine & vbNewLine
  Const AUTHORS As String = DBLSPACE & vbNewLine & _
  "                      Author - GhostCN_Z "
  Const HEADER As String = "Password_cracking"
  Const VERSION As String = DBLSPACE & "                      Version 1.0"
  Const REPBACK As String = DBLSPACE & ""
  Const ZHENGLI As String = DBLSPACE & ""
  Const ALLCLEAR As String = DBLSPACE & "All password is clear" & DBLSPACE & "Please remember to save"
  Const MSGNOPWORDS1 As String = "No password!"
  Const MSGNOPWORDS2 As String = "No password!"
  Const MSGTAKETIME As String = "This will take some time , please wait for a while" & DBLSPACE & "Press next to start"
  Const MSGPWORDFOUND1 As String = "Password is : " & DBLSPACE & "$$" & DBLSPACE & _
  "If the file worksheet has a different password, it will search for the next set of passwords and release"
  Const MSGPWORDFOUND2 As String = "Password is : " & DBLSPACE & "$$" & DBLSPACE & _
  "If the file worksheet has a different password, it will search for the next set of passwords and release"
  Const MSGONLYONE As String = ""
  Dim w1 As Worksheet, w2 As Worksheet
  Dim i As Integer, j As Integer, k As Integer, l As Integer
  Dim m As Integer, n As Integer, i1 As Integer, i2 As Integer
  Dim i3 As Integer, i4 As Integer, i5 As Integer, i6 As Integer
  Dim PWord1 As String
  Dim ShTag As Boolean, WinTag As Boolean
  Application.ScreenUpdating = False
  With ActiveWorkbook
  WinTag = .ProtectStructure Or .ProtectWindows
  End With
  ShTag = False
  For Each w1 In Worksheets
  ShTag = ShTag Or w1.ProtectContents
  Next w1
  If Not ShTag And Not WinTag Then
  MsgBox MSGNOPWORDS1, vbInformation, HEADER
  Exit Sub
  End If
  MsgBox MSGTAKETIME, vbInformation, HEADER
  If Not WinTag Then
  Else
  On Error Resume Next
  Do 'dummy do loop
  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
  With ActiveWorkbook
  .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 .ProtectStructure = False And _
  .ProtectWindows = False Then
  PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
  Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
  Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
  MsgBox Application.Substitute(MSGPWORDFOUND1, _
  "$$", PWord1), vbInformation, HEADER
  Exit Do 'Bypass all for...nexts
  End If
  End With
  Next: Next: Next: Next: Next: Next
  Next: Next: Next: Next: Next: Next
  Loop Until True
  On Error GoTo 0
  End If
  If WinTag And Not ShTag Then
  MsgBox MSGONLYONE, vbInformation, HEADER
  Exit Sub
  End If
  On Error Resume Next
  For Each w1 In Worksheets
  'Attempt clearance with PWord1
  w1.Unprotect PWord1
  Next w1
  On Error GoTo 0
  ShTag = False
  For Each w1 In Worksheets
  'Checks for all clear ShTag triggered to 1 if not.
  ShTag = ShTag Or w1.ProtectContents
  Next w1
  If ShTag Then
  For Each w1 In Worksheets
  With w1
  If .ProtectContents Then
  On Error Resume Next
  Do 'Dummy do loop
  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
  .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 Not .ProtectContents Then
  PWord1 = Chr(i) & Chr(j) & Chr(k) & Chr(l) & _
  Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
  Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
  MsgBox Application.Substitute(MSGPWORDFOUND2, _
  "$$", PWord1), vbInformation, HEADER
  'leverage finding Pword by trying on other sheets
  For Each w2 In Worksheets
  w2.Unprotect PWord1
  Next w2
  Exit Do 'Bypass all for...nexts
  End If
  Next: Next: Next: Next: Next: Next
  Next: Next: Next: Next: Next: Next
  Loop Until True
  On Error GoTo 0
  End If
  End With
  Next w1
  End If
  MsgBox ALLCLEAR & AUTHORS & VERSION & REPBACK & ZHENGLI, vbInformation, HEADER
  End Sub

参考文章:https://cloud.tencent.com/developer/article/1609180