Jon*_*yce 465 passwords excel vba
我被要求更新一些Excel 2003宏,但VBA项目受密码保护,似乎缺少文档......没有人知道密码.
有没有办法删除或破解VBA项目的密码?
Đức*_*yễn 663
您可以尝试这种VBA不需要HEX编辑的直接方法.它适用于任何文件(*.xls,*.xlsm,*.xlam ...).
经过测试并继续工作
Excel 2007
Excel 2010
Excel 2013 - 32位版本.
Excel 2016 - 32位版本.
寻找64位版本?请参阅/sf/answers/2170398751/
这个怎么运作
我会尽力解释它是如何运作的 - 请原谅我的英语.
使用代码
请先备份你的文件!
创建一个新的xlsm文件并将此代码存储在Module1中
code credited to Siwtom (nick name), a Vietnamese developer
Option Explicit
Private Const PAGE_EXECUTE_READWRITE = &H40
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Long, Source As Long, ByVal Length As Long)
Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _
ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long
Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _
ByVal lpProcName As String) As Long
Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, _
ByVal pTemplateName As Long, ByVal hWndParent As Long, _
ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
Dim HookBytes(0 To 5) As Byte
Dim OriginBytes(0 To 5) As Byte
Dim pFunc As Long
Dim Flag As Boolean
Private Function GetPtr(ByVal Value As Long) As Long
GetPtr = Value
End Function
Public Sub RecoverBytes()
If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
End Sub
Public Function Hook() As Boolean
Dim TmpBytes(0 To 5) As Byte
Dim p As Long
Dim OriginProtect As Long
Hook = False
pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
If TmpBytes(0) <> &H68 Then
MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
p = GetPtr(AddressOf MyDialogBoxParam)
HookBytes(0) = &H68
MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
HookBytes(5) = &HC3
MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
Flag = True
Hook = True
End If
End If
End Function
Private Function MyDialogBoxParam(ByVal hInstance As Long, _
ByVal pTemplateName As Long, ByVal hWndParent As Long, _
ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer
If pTemplateName = 4070 Then
MyDialogBoxParam = 1
Else
RecoverBytes
MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
hWndParent, lpDialogFunc, dwInitParam)
Hook
End If
End Function
Run Code Online (Sandbox Code Playgroud)将此代码粘贴到Module1中的上述代码下并运行它
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
Run Code Online (Sandbox Code Playgroud)回到你的VBA项目并享受.
Col*_*ard 214
是的,只要您使用.xls格式电子表格(Excel的默认值为2003).对于Excel 2007及更高版本,默认值为.xlsx,这是一种相当安全的格式,此方法不起作用.
正如Treb所说,这是一个简单的比较.一种方法是使用十六进制编辑器简单地替换文件中的密码条目(请参阅Windows的Hex编辑器).一步一步的例子:
复制以下列键开头的行:
CMG=....
DPB=...
GC=...
Run Code Online (Sandbox Code Playgroud)首先备份您不知道VBA密码的excel文件,然后使用十六进制编辑器打开它,并从虚拟文件中粘贴上面复制的行.
如果您需要使用Excel 2007年或2010年的工作,也有一些其他的答案在下面这可能帮助,特别是这些:1,2,3.
编辑 2015年2月:对于另一种看起来非常有前途的方法,请看ĐứcThanhNguyễn的这个新答案.
Pie*_*ter 164
还有另一种(稍微容易一些)解决方案,没有尺寸问题.我今天使用这种方法(在2003 XLS文件上,使用Excel 2007)并且成功了.
DPB=...部件DPB=...字符串更改为DPx=...*注意:确保您已将密码更改为新值,否则下次打开电子表格时Excel将报告错误(意外错误),然后当您访问VBA模块列表时,您将看到名称源模块,但在尝试打开表单/代码/等时收到另一个错误.要解决此问题,请返回VBA项目属性并将密码设置为新值.保存并重新打开Excel文档,你应该好好去!
kay*_*e99 158
我建立在ĐứcThanhNguyễn的奇妙答案上,允许这种方法与64位版本的Excel一起使用.我在64位Windows 7上运行Excel 2010 64位.
创建一个新的xlsm文件并将此代码存储在Module1中
Option Explicit
Private Const PAGE_EXECUTE_READWRITE = &H40
Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr)
Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _
ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr
Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr
Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _
ByVal lpProcName As String) As LongPtr
Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _
ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
Dim HookBytes(0 To 5) As Byte
Dim OriginBytes(0 To 5) As Byte
Dim pFunc As LongPtr
Dim Flag As Boolean
Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
GetPtr = Value
End Function
Public Sub RecoverBytes()
If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6
End Sub
Public Function Hook() As Boolean
Dim TmpBytes(0 To 5) As Byte
Dim p As LongPtr
Dim OriginProtect As LongPtr
Hook = False
pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
If VirtualProtect(ByVal pFunc, 6, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
If TmpBytes(0) <> &H68 Then
MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
p = GetPtr(AddressOf MyDialogBoxParam)
HookBytes(0) = &H68
MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
HookBytes(5) = &HC3
MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
Flag = True
Hook = True
End If
End If
End Function
Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _
ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
If pTemplateName = 4070 Then
MyDialogBoxParam = 1
Else
RecoverBytes
MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
hWndParent, lpDialogFunc, dwInitParam)
Hook
End If
End Function
Run Code Online (Sandbox Code Playgroud)将此代码粘贴到Module2中并运行它
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
Run Code Online (Sandbox Code Playgroud)免责声明这对我有用,我在这里记录了它,希望能帮助别人.我还没有完全测试过它.在继续此选项之前,请务必保存所有打开的文件.
Ste*_*bob 64
科林皮卡德有一个很好的答案,但有一个"小心"这个.有些实例(我还没有弄清楚原因)文件中"CMG = ........ GC = ...."条目的总长度不同于一个excel文件到下一个.在某些情况下,此条目将为137个字节,而在其他情况下,它将为143个字节.137字节长度是奇数,如果在使用'1234'密码创建文件时发生这种情况,只需创建另一个文件,它应跳转到143字节长度.
如果您尝试将错误的字节数粘贴到文件中,则在尝试使用Excel打开文件时将丢失VBA项目.
编辑
这对Excel 2007/2010文件无效.标准的.xlsx文件格式实际上是一个.zip文件,其中包含许多子文件夹,其格式,布局,内容等存储为xml数据.对于不受保护的Excel 2007文件,您只需将.xlsx扩展名更改为.zip,然后打开zip文件并查看所有xml数据.这非常简单.
但是,当您使用密码保护Excel 2007文件时,整个.zip(.xlsx)文件实际上使用RSA加密进行加密.无法再将扩展名更改为.zip并浏览文件内容.
Mat*_*att 58
对于文件类型.xlsm或.dotm文件类型,您需要采用稍微不同的方式.
.xlsm文件的扩展名更改为.zip.vbaProject.bin文件并在十六进制编辑器中打开它(我使用HxD,它完全免费且轻量级.)DPB并替换DPx并保存文件.vbaProject.bin压缩文件中的这个新文件替换旧文件..xlsm..xlsm文件.小智 34
值得指出的是,如果您有一个Excel 2007(xlsm)文件,那么您只需将其保存为Excel 2003(xls)文件并使用其他答案中列出的方法.
VeP*_*ePe 22
轮到我了,这是建立在kaybee99的优秀答案之上的,这个答案建立在ĐứcThanhNguyễn的精彩答案之上,允许这种方法适用于x86和amd64版本的Office.
更改内容的概述,我们避免限制为32位地址的push/ret并将其替换为mov/jmp reg.
经过测试并继续工作
Word/Excel 2016 - 32位版本.
Word/Excel 2016 - 64位版本.
这个怎么运作
创建一个与上面相同类型的新文件,并将此代码存储在Module1中
Option Explicit
Private Const PAGE_EXECUTE_READWRITE = &H40
Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As LongPtr, Source As LongPtr, ByVal Length As LongPtr)
Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LongPtr, _
ByVal dwSize As LongPtr, ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr) As LongPtr
Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LongPtr
Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LongPtr, _
ByVal lpProcName As String) As LongPtr
Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LongPtr, _
ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
Dim HookBytes(0 To 11) As Byte
Dim OriginBytes(0 To 11) As Byte
Dim pFunc As LongPtr
Dim Flag As Boolean
Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
GetPtr = Value
End Function
Public Sub RecoverBytes()
If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 12
End Sub
Public Function Hook() As Boolean
Dim TmpBytes(0 To 11) As Byte
Dim p As LongPtr, osi As Byte
Dim OriginProtect As LongPtr
Hook = False
#If Win64 Then
osi = 1
#Else
osi = 0
#End If
pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
If VirtualProtect(ByVal pFunc, 12, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then
MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, osi+1
If TmpBytes(osi) <> &HB8 Then
MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 12
p = GetPtr(AddressOf MyDialogBoxParam)
If osi Then HookBytes(0) = &H48
HookBytes(osi) = &HB8
osi = osi + 1
MoveMemory ByVal VarPtr(HookBytes(osi)), ByVal VarPtr(p), 4 * osi
HookBytes(osi + 4 * osi) = &HFF
HookBytes(osi + 4 * osi + 1) = &HE0
MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 12
Flag = True
Hook = True
End If
End If
End Function
Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _
ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer
If pTemplateName = 4070 Then
MyDialogBoxParam = 1
Else
RecoverBytes
MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
hWndParent, lpDialogFunc, dwInitParam)
Hook
End If
End Function
Run Code Online (Sandbox Code Playgroud)将此代码粘贴到Module2中并运行它
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
Run Code Online (Sandbox Code Playgroud)小智 16
您是否尝试过在OpenOffice.org中打开它们?
我前段时间遇到类似的问题,发现Excel和Calc不了解彼此的加密,因此允许直接访问几乎所有内容.
这是不久前的,所以如果这不仅仅是我的侥幸,它也可能已被修补.
Spa*_*gen 13
如果
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格式)文件.
小智 13
对于Excel 2007以上版本,您需要将文件扩展名更改为.zip在存档中有一个子文件夹xl,在那里您可以找到vbaProject.bin.按照上面的步骤使用vbaProject.bin然后将其保存回存档.修改你的扩展名并vo!(含义如下)
ash*_*awg 10
可以轻松删除 Access,Excel,Powerpoint或Word文档(2007, 2010, 2013 or 2016带扩展名的版本.ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM)上的VBA项目密码.
只需将文件扩展名更改为.ZIP,解压缩文件,并使用任何基本的十六进制编辑器(如XVI32)来"破解"现有密码,这会"混淆"Office,以便下次文件提示时提示输入新密码打开.
.ZIP扩展名.ZIP并转到该XL文件夹.vbaProject.bin使用十六进制编辑器提取并打开它DPB为DPX..bin文件放回zip中,将其恢复为正常扩展名并正常打开文件.VBA Project Properties.Protection选项卡上,设置新密码.OK,关闭文件,重新打开,按ALT + F11.此时,如果您愿意,可以完全删除密码.
完整的说明了一步一步的视频我做了"遥想当年"都在YouTube上这里.
令人震惊的是,这种解决方法已存在多年,微软尚未解决这个问题.
这个故事的主旨?
出于任何敏感信息的安全性,不得依赖 Microsoft Office VBA项目密码.如果安全性很重要,请使用第三方加密软件.
Colin Pickard大多是正确的,但不要将整个文件的"密码打开"保护与VBA密码保护混淆,这与前者完全不同,对于Office 2003和2007也是如此(对于Office 2007,重命名)将文件转换为.zip并在zip中查找vbaProject.bin.从技术上讲,编辑文件的正确方法是使用像CFX这样的OLE复合文档查看器来打开正确的流.当然,如果你只是替换字节,普通的旧二进制编辑器可能会工作.
顺便说一句,如果你想知道这些字段的确切格式,他们现在已经记录了:
http://msdn.microsoft.com/en-us/library/dd926151%28v=office.12%29.aspx
如果文件是有效的zip文件(前几个字节是50 4B- 以类似的格式使用.xlsm),则解压缩文件并查找子文件xl/vbaProject.bin.这是一个CFB文件,就像.xls文件一样.按照XLS格式的说明(应用于子文件),然后压缩内容.
对于XLS格式,您可以按照本文中的一些其他方法进行操作.我个人更喜欢搜索DPB=块并替换文本
CMG="..."
DPB="..."
GC="..."
Run Code Online (Sandbox Code Playgroud)
有空格.这避免了CFB容器尺寸问题.
小智 6
汤姆 - 我最初犯了一个小学生错误,因为我没有观察字节大小,而是从“CMG”设置复制并粘贴到后续条目。不过,这两个文件之间存在两种不同的文本大小,正如 Stewbob 警告的那样,我丢失了 VBA 项目。
使用 HxD,有一个计数器跟踪您选择的文件数量。从 CMG 开始复制,直到计数器读取 8F(十六进制表示 143),同样在粘贴到锁定文件时 - 我最终在粘贴末尾得到了两倍数量的“...”,这看起来有点奇怪,感觉几乎不自然,但它有效。
我不知道这是否重要,但我确保在 Excel 中重新打开文件之前关闭了十六进制编辑器和 Excel。然后,我必须通过菜单打开 VB 编辑器,进入 VBProject Properties 并输入“新”密码来解锁代码。
我希望这有帮助。
我尝试了上面的一些解决方案,但都没有一个适合我(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
Run Code Online (Sandbox Code Playgroud)
小智 6
接受的答案在 Windows 10 上的 Excel 2019 中不起作用。找到了我们需要采取的额外步骤来查看锁定的宏。我总结一下步骤。
将 .zip 添加到 Excel 文件名末尾,然后按 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