如何撤消破坏VBA密码的修复?

如何撤消破坏VBA密码的修复?,vba,excel,Vba,Excel,我使用提供的修复程序解决了上的密码问题。不幸的是,这使我的机器处于一种状态,所有新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,

我使用提供的修复程序解决了上的密码问题。不幸的是,这使我的机器处于一种状态,所有新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

我试图注释掉
MyDialogBoxParam
例程中
If
语句的第一个子句,使每个过程都经过
RecoverBytes
步骤和随后的两个步骤。不走运。有人能帮忙吗???谢谢

重新启动计算机应该可以解决问题
(一般来说,对于“任何”无法解释的问题,应首先进行故障排除。)



另外,下一次,使用破解办公室密码…

结果证明我的验证存在缺陷。我正在创建一个全新的启用宏的Excel文件,并测试代码中的密码是否有效。事实证明,如果将密码放在启用宏的Excel文件上,而该文件中完全没有添加任何代码(可能根本没有更改Excel文件,对此我不确定),密码和保护将不会生效。在保留密码和启用保护标志之前,必须在代码中添加一些内容。叹息


谢谢大家的帮助

我想你应该再次向这里的每个人强调你的道德观。。。不要运行您不理解的代码。。。尤其是那些正在越狱的程序。@dwirony-好吧,我会在我的答案中加上:)(讽刺地/意外地,链接指向了我的另一个明显的“道德”。@jeffreyweir但这并不是未知代码,这是一种运行代码的实践,你不知道它做什么或如何做。底线是你需要做出判断。OP做出了一个有效的判断:该代码得到了500多人的支持。他不应该因此而被否决。@jeffreyweir显然,OP与其他时候相比有更大的问题,那就是不具有选择性-技能水平会产生巨大的差异,而你公开提出其他建议是鲁莽的,尤其是在一个经验水平不一的论坛上。如果一篇关于格式化我的硬盘的帖子有500个投票,我是否应该运行代码,因为我认为它会改变我硬盘的格式?每天有成千上万的电工用电工作,这是否意味着对我来说也是安全的?绝对不是。如果我自己一直触电,我应该停止接触我不懂的电线吗?也许是个好主意。@Chuck-只是想确认一下,您通过重新启动解决了问题的原始问题,对吗?@ashleedawg不,没有。我一夜之间关机,更新了Windows,但今天早上仍在进行。
Sub unprotected()
    If Hook Then
        MsgBox "VBA Project is unprotected!", vbInformation, "*****"
    End If
End Sub