我被要求更新一些Excel 2003的宏,但是这些VBA项目都被密码保护了,并且似乎缺少文档...没有人知道密码。
有没有一种方法可以删除或破解VBA项目的密码?
我被要求更新一些Excel 2003的宏,但是这些VBA项目都被密码保护了,并且似乎缺少文档...没有人知道密码。
有没有一种方法可以删除或破解VBA项目的密码?
如果你在“已知密码”文件中的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格式)文件。
我尝试了上面的一些解决方案,但是它们都不适用于我(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
ActiveWorkbook
替换为 ActiveDocument
,在 Word 上也能很好地工作! - MS BerendsColin 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
50 4B
,用于格式如.xlsm
),则解压该文件并查找子文件xl/vbaProject.bin
。这是一个CFB文件,就像.xls
文件一样。按照XLS格式的说明(应用于子文件)操作,然后只需压缩内容即可。DPB=
块并替换文本。CMG="..."
DPB="..."
GC="..."
加入空格。这可以避免CFB容器大小问题。
使用HxD时,有一个计数器跟踪您选择的文件大小。从CMG开始复制,直到计数器读取8F(十六进制为143),然后在粘贴到锁定文件时进行相同的操作-最终我在粘贴结束时得到了两倍数量的“...”,看起来有点奇怪,感觉几乎不自然,但它确实有效。
我不知道是否关键,但我确保在重新打开Excel文件之前关闭了十六进制编辑器和Excel。然后,我必须通过菜单进入VBEditor,进入VBProject属性,并输入“新”密码以解锁代码。
希望这可以帮助你。
在Excel文件名末尾添加.zip并按Enter键
一旦文件已更改为ZIP文件,双击打开它
里面会看到一个名为xl的文件夹,如下所示
在xl内,您会找到一个名为vbaProject.bin的文件,请将其复制/粘贴到桌面上
前往在线十六进制编辑器HexEd.it
搜索以下文本 DPB=... 并将它们更改为 DPx=...
保存文件并关闭HexEd.it
将更新后的文件从桌面复制/粘贴到ZIP文件内(您需要覆盖它)
删除文件名末尾的.zip扩展名,再次添加Excel扩展名。
在Excel中打开该文件-您可能会收到几个错误通知,请单击通过。
==== 接受的答案之上的额外步骤 =====
- 打开Visual Basic窗口(通常是ALT+F11,如果我记得正确的话),然后打开VBAProject属性(工具菜单)。
- 单击保护选项卡,将密码更改为短且易于记忆的内容(在下一步中我们将删除它而不是移除它)。
- 保存工作簿,然后关闭并重新打开。
- 再次打开Visual Basic窗口并输入刚刚输入的密码。重复上一个步骤,但这次您可以删除密码。
- 保存工作簿,现在您已删除了密码。
额外步骤来自以下网站 https://confluence.jaytaala.com/display/TKB/Remove+Excel+VBA+password
oledump.py
示例: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
中。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"
}
我的工具VbaDiff可以直接从文件中读取VBA,因此您可以使用它从大多数Office文档中恢复受保护的VBA代码,而不必使用十六进制编辑器。