注: 本文轉載賈斯汀表哥的簡書文章,頁面上的連結要是不生效,請閱讀原文。
本文介紹在 Excel 的多個文件版本中破解各類密碼,包含文件的查看、只讀密碼,工作表、工作簿的保護密碼,以及 VBA 工程密碼。內容非常全面,建議你收藏。文件作者加密碼是防止數據被查看,修改,所以,文件密碼破解僅供於學習參考,請尊重作者版權,不要斷人財路。
下面的有些操作不易撤銷,為了防止文件被破壞,破解密碼前建議備份原文件。
文章目錄,簡書不支持頁內跳轉,請自行翻頁。
文件查看、只讀密碼
工作表、工作簿保護密碼破解
後綴為 .xls 的文件
後綴為 .xlsx 或 .xlsm 的文件
VBA 工程密碼破解
後綴為 .xls 的文件
後綴為 .xlsm 的文件
Excel 文件的查看、只讀密碼目前只能採用暴力破解,就是用成千上萬個密碼一個一個去試。非常消耗資源,取決於你密碼的長度和複雜程度,有時也未必能破解成功。目前我還沒有找到比較好的免費工具去破解此類密碼,有一定及時推薦。在這裡我介紹兩個網站可以破解此類密碼,付費的。
http://www.password-online.com/index.php
http://www.decryptum.com/
上傳文件前請檢查文件是否含比較私密的內容。
此密碼主要用於防止數據表的表格、格式、內容、公式等被修改刪除。當工作表的單元格被保護時,試圖編輯或刪除那些單元格時你會收到提示 「試圖更改的單元格或圖表在受保護的工作表中」 告訴你編輯失敗。工作簿被保護時,則不能新增、刪除工作表。此類密碼的破解方法因文件的後綴而異:
用 Excel 打開工作簿,然後按 Alt + F11 進入 「開發工具」 界面,如下圖:
在左邊欄的工程欄(Project)中選定節點 「ThisWorkbook」,雙擊左鍵,然後把下面的代碼複製到右邊的代碼編輯框中
Public Sub 工作表保護密碼破解() Const DBLSPACE As String = vbNewLine & vbNewLine Const AUTHORS As String = DBLSPACE & vbNewLine & _ "作者:McCormick JE McGimpsey " Const HEADER As String = "工作表保護密碼破解" Const VERSION As String = DBLSPACE & "版本 Version 1.1.1" Const REPBACK As String = DBLSPACE & "" Const ZHENGLI As String = DBLSPACE & "" Const ALLCLEAR As String = DBLSPACE & "該工作簿中的工作表密碼保護已全部解除!!" & DBLSPACE & "請記得另保存" _ & DBLSPACE & "注意:不要用在不當地方,要尊重他人的勞動成果!" Const MSGNOPWORDS1 As String = "該文件工作表中沒有加密" Const MSGNOPWORDS2 As String = "該文件工作表中沒有加密2" Const MSGTAKETIME As String = "解密需花費一定時間,請耐心等候!" & DBLSPACE & "按確定開始破解!" Const MSGPWORDFOUND1 As String = "密碼重新組合為:" & DBLSPACE & "$$" & DBLSPACE & _ "如果該文件工作表有不同密碼,將搜索下一組密碼並修改清除" Const MSGPWORDFOUND2 As String = "密碼重新組合為:" & DBLSPACE & "$$" & DBLSPACE & _ "如果該文件工作表有不同密碼,將搜索下一組密碼並解除" 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 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 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 w1.Unprotect PWord1 Next w1 On Error GoTo 0 ShTag = False For Each w1 In Worksheets 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 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 For Each w2 In Worksheets w2.Unprotect PWord1 Next w2 Exit Do 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, HEADEREnd Sub
完成後如下圖:
然後點擊上圖的小三角按鈕(如藍色圓圈標註)執行代碼破解密碼。如果 Excel 提示宏被禁用而導致代碼無法運行時,先在文件菜單中保存文件,然後關閉 Excel。重新打開 Excel 並啟用宏,按 Alt + F11 回到此界面再點擊小三角按鈕重新進行密碼破解。
破解期間會出現兩次提示的對話框,都選擇 「確認」。密碼破解完畢之後會出現如下窗口:
這說明工作表或工作簿的保護密碼已被成功清除。最後按 Alt + F11 回到 「開發工具」 界面,刪除 「ThisWorkbook」 節點中的代碼,保存工作表。
在這裡以 .xlsx 文件為例講解,首先把文件的後綴從 .xlsx 修改成 .rar 或 .zip,然後使用壓縮軟體,例如 WinRar, 7-Zip 打開壓縮文件。
工作表被鎖定:進入文件夾 xl\worksheets,找到被鎖定的工作表,例如 sheet1,如下圖:
選中此文件 「sheet1.xml」 ,右擊,選擇記事本編輯。在記事本中查找字符串 <sheetProtection,找到後刪除從 <sheetProtection 到 /> 的內容,如下圖藍色標記:
工作簿被鎖定:進入文件夾 xl,找到文件 「workbook.xml」。選定右擊,選擇記事本編輯,在記事本中查找字符串 <workbookProtection,找到後刪除從<workbookProtection到/>的內容,如下圖藍色標記:
刪除完成後在記事本中選擇 「文件」 -- 「保存」 選項保存此文件。在記事本保存完成後壓縮軟體會提示你此文件已更改,是否更新?然後選擇 「是」。
關閉壓縮軟體,把文件後綴從 .zip 或 .rar 修改回 .xlsx。用 Excel 打開 .xlsx 文件,此時你可以發現工作表或者工作簿的保護密碼已被清除。
VBA 工程密碼也就是宏的保護密碼,它的破解也因文件的後綴而異:
打開 Excel,新建一個文檔,按 Alt + F11 進入 「開發工具」 界面,如下圖:
在左邊欄的工程欄(Project)中選定節點 「ThisWorkbook」,雙擊左鍵,然後把下面的代碼複製到右邊的代碼編輯框中
Private Sub VBAPassword() Filename = Application.GetOpenFilename("Excel文件(*.xls & *.xla & *.xlt),*.xls;*.xla;*.xlt", , "VBA破解") If Dir(Filename) = "" Then MsgBox "沒找到相關文件,清重新設置。" Exit Sub Else FileCopy Filename, Filename & ".bak" End If Dim GetData As String * 5 Open Filename For Binary As #1 Dim CMGs As Long Dim DPBo As Long For i = 1 To LOF(1) Get #1, i, GetData If GetData = "CMG=""" Then CMGs = i If GetData = "[Host" Then DPBo = i - 2: Exit For Next If CMGs = 0 Then MsgBox "請先對VBA編碼設置一個保護密碼...", 32, "提示" Exit Sub End If Dim St As String * 2 Dim s20 As String * 1 Get #1, CMGs - 2, St Get #1, DPBo + 16, s20 For i = CMGs To DPBo Step 2 Put #1, i, St Next If (DPBo - CMGs) Mod 2 <> 0 Then Put #1, DPBo + 1, s20 End If MsgBox "文件解密成功.", 32, "提示" Close #1End Sub
完成後如下圖:
點擊上圖的小三角按鈕(如藍色圓圈標註)執行代碼。在系統彈出的 「文件選擇對話框」 中選擇你要破解密碼的 Excel 文件,選中後點擊 「打開」。一會 Excel 提示 「文件解密成功」,這代表選定文件的 VBA 工程密碼已被清除。
把文件的後綴從 .xlsm 修改成 .rar 或者 .zip,然後用壓縮軟體解壓這個壓縮文件。打開解壓後的文件,在文件夾 xl 中找到文件 vbaProject.bin,如下圖:
用二進位文件編輯軟體,例如 XVI32 (可直接下載使用,免安裝) 打開 vbaProject.bin 文件,然後在其中查找 DPB,如下圖:
把 DPB 替換成 DPx, 如下:
保存文件,重新壓縮,把文件的後綴重新修改回 .xlsm。用 Excel 打開文檔,期間出現的任何提示都點擊 「是」 或 「確認」 忽略它。
按 Alt + F11 進入 「開發工具」 界面,在 Tools -> VBAProject Properties 的 Protection 欄重新設置一個新的 VBA 工程密碼,然後保存文件,關閉 Excel。
重新打開之後先前的提示不會再出現,用新密碼也可以成功打開 VBA 工程。VBA 工程密碼重設成功!
如想對 VBA 工程進行加密建議你用代碼混淆的辦法,見我的另一篇文章:我的 VBA 代碼混淆器,加密你的宏作品
歡迎評論,如果你喜歡這篇文章, 請記得點讚哦,謝謝!
本文為作者原創文章,未經作者允許不得轉載。