如何撤消破解VBA密码的修复程序



我使用了Đức Thanh Nguyễn提供的修复程序来解决密码问题,有没有办法破解Excel VBA项目的密码? .不幸的是,这使我的机器处于所有新Excel文件的VBA不再受保护的状态!这是他的代码:

在模块 1 中:

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

在模块 2 中:

Sub unprotected()
    If Hook Then
        MsgBox "VBA Project is unprotected!", vbInformation, "*****"
    End If
End Sub

我试图在MyDialogBoxParam例程中注释掉If语句的第一句,使每次传递都经过RecoverBytes步骤和随后的两个步骤。没有运气。谁能帮忙???谢谢!

事实证明,我的验证在这里是有缺陷的。我正在创建一个全新的启用宏的Excel文件,并测试代码中的密码是否成立。事实证明,如果您将密码放在完全没有添加代码的启用宏的 Excel 文件上(也许根本没有对 Excel 文件进行任何更改,我不确定(,密码和保护将不会坚持。您必须在代码中添加一些内容,然后才能保留密码和保护标志。叹息。。。

感谢所有伸出援手的人!

重新启动计算机应该可以解决问题
(通常应该是"任何"无法解释的问题的第一个故障排除步骤。


另外,下次,使用此方法破解Office密码...

最新更新