别再问了,解锁VBA密码的代码限时保存

VBA说

共 4118字,需浏览 9分钟

 · 2021-06-19

别再问了,收藏一次,包你好用




几乎每过一阵子,就有人来问:如何解锁VBA?





其实只要借助百度大法,10s就能轻松找到解锁的代码。






可自己找到了可能又不会使用,或者频繁出错。今天就放2段包你好用的VBA解锁源代码。收好了,看具体操作。








第一种方法:





任意打开一个工作簿,把下面的代码放到这个工作簿的模块中。








Sub VBAPassword1() '你要解保护的Excel文件路径    Filename = Application.GetOpenFilename("Excel文件(*.xls & *.xla & *.xlt),*.xls;*.xla;*.xlt", , "VBA破解")    If Dir(Filename) = "" Then        MsgBox "没找到相关文件,清重新设置。"        Exit Sub    Else        FileCopy Filename, Filename & ".bak" '备份文件。    End If    Dim GetData As String * 5    Open Filename For Binary As #1        Dim CMGs As Long        Dim DPBo As Long        For i = 1 To LOF(1)            Get #1, i, GetData            If GetData = "CMG=""" Then CMGs = i            If GetData = "[Host" Then DPBo = i - 2: Exit For        Next        If CMGs = 0 Then            MsgBox "请先对VBA编码设置一个保护密码...", 32, "提示"            Exit Sub        End If        Dim St As String * 2        Dim s20 As String * 1        '取得一个0D0A十六进制字串        Get #1, CMGs - 2, St        '取得一个20十六制字串        Get #1, DPBo + 16, s20        '替换加密部份机码        For i = CMGs To DPBo Step 2            Put #1, i, St        Next        '加入不配对符号        If (DPBo - CMGs) Mod 2 <> 0 Then            Put #1, DPBo + 1, s20        End If        MsgBox "文件解密成功......", 32, "提示"    Close #1End Sub



把需要破解的文件,另存为xls格式,记得是xls格式





运行上面的解锁代码,选中咱们刚才另存的xls文件,就能破解。









这个时候就有几种特殊情况,有可能这个文件一打开就显示过期无法使用,或者直接弹出一个界面,不登录就无法另存怎么办啊。





这种其实也有办法,VBA一个很大的缺点就是,禁用宏之后,代码的限制就都废了。




这个时候我们禁用一下宏,再打开刚才的文件,就能另存啦。










第二种方法:


如果以上的方法都不好使,还有一种方法,可以解决。


同时打开VBA有密码的文件和一个空白的工作簿,把下面的代码放入空白的工作簿模块。





Option ExplicitPrivate 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 ByteDim OriginBytes(0 To 5) As ByteDim pFunc As LongDim Flag As BooleanPrivate Function GetPtr(ByVal Value As Long) As Long GetPtr = ValueEnd FunctionPublic Sub RecoverBytes() If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 6End SubPublic 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, &H40, 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 IfEnd FunctionPrivate 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 IfEnd FunctionSub Crack() If Hook Then MsgBox "破解成功"End Sub





运行Crack这个宏,立马就可破解。









第二种方法的原理是绕过VBA加密验证,实际上代码还是没有被清除。




两种解锁VBA的方法介绍完了,你学废了吗?




推荐阅读:(点击下方标题即可跳转)




浏览 63
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报