有没有一种方法可以破解Excel VBA项目的密码?

577

我被要求更新一些Excel 2003的宏,但是这些VBA项目都被密码保护了,并且似乎缺少文档...没有人知道密码。

有没有一种方法可以删除或破解VBA项目的密码?


你能否将文件另存为 .xls 格式,而不是像你链接中的示例那样保存为 .xla 格式?不确定这是否会有所不同。 - B Hart
4
好的了解:xlsb对密码破解技巧具有强大的抵抗能力。 - Qbik
34
@Fandango68 这个问题在数年前的 meta 上已经讨论过了(https://meta.stackexchange.com/q/137086)。简而言之:SO上的很多(大多数?)问题都有可能被不良分子滥用,但除非有明确的不良行为证据,我们会假定其善意。破解VBA密码存在着合法和道德层面的原因。此外,讨论当前系统的弱点最终有助于提高未来的安全性并防止人们盲目地依赖不安全的系统。 - jmbpiano
3
对于那些偶然看到这篇文章的人,请注意你可以在 OpenOffice 中打开这个 Excel 文件,它会在不需要输入密码的情况下打开所有内容。 - Aditya Singh
25个回答

16

如果你在“已知密码”文件中的CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX"这一块长度比“未知密码”文件中现有的块短,那么请使用尾随零填充十六进制字符串来达到正确的长度。

例如:

CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"

在“未知密码”文件中,应该设置为

CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000"以保持文件长度。

我在Office 2007中也已经用过这种方法处理.XLA (97/2003格式)文件。


1
这个方法是可行的,但是我最近发现(如上所述)你也可以在GC="..."块的最后一个闭引号之后添加空字符,直到达到相同的长度。 - tobriand
当“未知密码”比现有块长时,你该怎么做? - Noam Brand

13
对于Excel 2007及以上版本,您需要将文件扩展名更改为.zip。 在存档中有一个名为xl的子文件夹,在其中您将找到vbaProject.bin。 按上述步骤对vbaProject.bin进行操作,然后将其保存回存档中。 恢复您的文件扩展名,完成!(意思是按照上述步骤操作)

1
我可以确认这也适用于使用Excel 2010的.xlam文件。+1! - Gimelist

12

我尝试了上面的一些解决方案,但是它们都不适用于我(Excel 2007 xlsm 文件)。然后我找到了另一个解决方案,甚至可以检索密码,而不仅仅是破解它。

将此代码插入模块中,运行它,并给它一些时间。它将通过暴力破解恢复您的密码。

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

1
不错!我认为你得到了一个踩票,因为你的解决方案是解锁工作表而不是VBA模块。尽管如此,我还是觉得很有帮助 - 所以谢谢! - PBD10017
1
我在我的个人工作簿中有这个。作者引用了Bob McCormick作为原始作者,后来由Norman Harker和JE McGimpsey在2002年进行了修改。 - Charles Byrne
ActiveWorkbook 替换为 ActiveDocument,在 Word 上也能很好地工作! - MS Berends

10

Colin Pickard大部分是正确的,但不要将“打开密码”保护整个文件与VBA密码保护混淆,后者与前者完全不同,并且对于Office 2003和2007是相同的(对于Office 2007,请将文件重命名为.zip并在其中寻找vbaProject.bin)。从技术上讲,编辑文件的正确方法是使用OLE复合文档查看器,例如CFX来打开正确的流。当然,如果只是替换字节,则普通的二进制编辑器可能有效。

顺便说一句,如果你想了解这些字段的确切格式,它们现在已经有记录了:

http://msdn.microsoft.com/en-us/library/dd926151%28v=office.12%29.aspx


2
以下链接提供了XSLM格式文件的详细信息。http://gbanik.blogspot.co.uk/2010/08/understanding-excel-file-internals.html 这个解决方案与Yuhong Bao上面概述的解决方案相同,但阅读起来很有趣,并包括屏幕截图。 - JohnLBevan

7
如果文件是有效的zip文件(前几个字节为50 4B,用于格式如.xlsm),则解压该文件并查找子文件xl/vbaProject.bin。这是一个CFB文件,就像.xls文件一样。按照XLS格式的说明(应用于子文件)操作,然后只需压缩内容即可。
对于XLS格式,您可以按照本帖中的其他方法进行操作。我个人更喜欢搜索DPB=块并替换文本。
CMG="..."
DPB="..."
GC="..."

加入空格。这可以避免CFB容器大小问题。


6

使用HxD时,有一个计数器跟踪您选择的文件大小。从CMG开始复制,直到计数器读取8F(十六进制为143),然后在粘贴到锁定文件时进行相同的操作-最终我在粘贴结束时得到了两倍数量的“...”,看起来有点奇怪,感觉几乎不自然,但它确实有效。

我不知道是否关键,但我确保在重新打开Excel文件之前关闭了十六进制编辑器和Excel。然后,我必须通过菜单进入VBEditor,进入VBProject属性,并输入“新”密码以解锁代码。

希望这可以帮助你。


谢谢,这是唯一有效的方法! - Matt Wanchap

6
ElcomSoft生产的Advanced Office Password Breaker和Advanced Office Password Recovery产品可以用于此案件,前提是该文档是在Office 2007或更早版本中创建的。

6
接受的答案在Windows 10上的Excel 2019中无法运行。发现了我们需要执行的额外步骤才能查看加锁宏。我总结了以下步骤。
  1. 在Excel文件名末尾添加.zip并按Enter键

  2. 一旦文件已更改为ZIP文件,双击打开它

  3. 里面会看到一个名为xl的文件夹,如下所示

  4. 在xl内,您会找到一个名为vbaProject.bin的文件,请将其复制/粘贴到桌面上

  5. 前往在线十六进制编辑器HexEd.it

  6. 搜索以下文本 DPB=... 并将它们更改为 DPx=...

  7. 保存文件并关闭HexEd.it

  8. 将更新后的文件从桌面复制/粘贴到ZIP文件内(您需要覆盖它)

  9. 删除文件名末尾的.zip扩展名,再次添加Excel扩展名。

  10. 在Excel中打开该文件-您可能会收到几个错误通知,请单击通过。

==== 接受的答案之上的额外步骤 =====

  1. 打开Visual Basic窗口(通常是ALT+F11,如果我记得正确的话),然后打开VBAProject属性(工具菜单)。
  2. 单击保护选项卡,将密码更改为短且易于记忆的内容(在下一步中我们将删除它而不是移除它)。
  3. 保存工作簿,然后关闭并重新打开。
  4. 再次打开Visual Basic窗口并输入刚刚输入的密码。重复上一个步骤,但这次您可以删除密码。
  5. 保存工作簿,现在您已删除了密码。

额外步骤来自以下网站 https://confluence.jaytaala.com/display/TKB/Remove+Excel+VBA+password


4
事实上,大多数带宏的Office文档的代码文件并未加密,密码只是用于防止使用Office程序打开项目。这意味着,如其他答案所建议的那样,你通常可以使用Office替代品来访问和编辑文件。
但是,如果你只需要访问代码,你可以使用oledump.py之类的工具来提取宏代码。这对于恶意软件分析以及从文件中获取大部分代码以避免忘记密码时不必从头开始编写很有用。
此外,许多Excel文件在打开文件时动态设置密码。这意味着,如果你能够读取代码,你通常可以在明文中找到密码或将其解密。 oledump.py示例:
列出Office文档中所有“流”(嵌入式二进制或代码文件)。
python oledump.py -v yourExcelFile.xlsm

输出:

A: xl/vbaProject.bin
 A1:      2000 'PROJECT'
 A2:      1500 'PROJECTwm'
 A3: M    1224 'VBA/Module1'
 A4: M   18694 'VBA/Module2'
 A5: M   11877 'VBA/Module3'
...

带有M标记的流是宏,即未加密的VBA代码。

提取流

python oledump.py -s A3 -v yourExcelFile.xlsm > Module1.vba

这将输出包含在 A3 流中的代码到 Module1.vba 中。
我通常将其与循环结合使用以提取所有文件到一个文件夹。这个快速的 PowerShell 脚本将提取大多数文件中的所有流:
New-Item -ItemType Directory "Output"

# just hardcode the highest stream outputted by oledump.py -v
$max = 5 
for ($i = 1; $i -le $max; $i++) {
    python oledump.py -s "A$i" -v yourExcelFile.xlsm > ".\Output\A$i"
}

请注意,这将仅提取可读的文件。

4

我的工具VbaDiff可以直接从文件中读取VBA,因此您可以使用它从大多数Office文档中恢复受保护的VBA代码,而不必使用十六进制编辑器。


我已经测试了这个工具,它的表现非常好,但是免费版本只能检索前53行。为了恢复我的文件,我不得不按照安迪的指示解锁密码。然后我在两个窗格中使用VbaDiff打开了我的xlsm文件,然后点击了我的代码所在的工作表。我通过复制粘贴将其放入了我恢复但vba为空的Excel文件中。 - thanos.a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接