zoukankan      html  css  js  c++  java
  • vba工程密码清除

    EXCEL vba工程密码破解

    方法一:
    这种方法实际是避开VBA工程密码验证,即骗vba编辑器,该密码输入成功,请求放行。
    不管他是破解还是欺骗 能达到我们的目的角开就行
    ______________________________________________________
    1.新建一个工作簿,打开,按ALT+F11,进入vba代码编辑器窗口:
    2.新建一个模块,“插入”--“模块”把以下代码复制进模块并保存

    ption Explicit
    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()
        '若已经hook,则恢复原API开头的6字节,也就是恢复原来函数的功能
        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
       
        'VBE6.dll调用DialogBoxParamA显示VB6INTL.dll资源中的第4070号对话框(就是输入密码的窗口)
        '若DialogBoxParamA返回值非0,则VBE会认为密码正确,所以我们要hook DialogBoxParamA函数
        pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")
       
        '标准api hook过程之一: 修改内存属性,使其可写
        If VirtualProtect(ByVal pFunc, 6, &H40, OriginProtect) <> 0 Then
            '标准api hook过程之二: 判断是否已经hook,看看API的第一个字节是否为&H68,
            '若是则说明已经Hook
            MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, 6
            If TmpBytes(0) <> &H68 Then
                '标准api hook过程之三: 保存原函数开头字节,这里是6个字节,以备后面恢复
                MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 6
                '用AddressOf获取MyDialogBoxParam的地址
                '因为语法不允许写成p = AddressOf MyDialogBoxParam,这里我们写一个函数
                'GetPtr,作用仅仅是返回AddressOf MyDialogBoxParam的值,从而实现将
                'MyDialogBoxParam的地址付给p的目的
                p = GetPtr(AddressOf MyDialogBoxParam)
                
                '标准api hook过程之四: 组装API入口的新代码
                'HookBytes 组成如下汇编
                'push MyDialogBoxParam的地址
                'ret
                '作用是跳转到MyDialogBoxParam函数
                HookBytes(0) = &H68
                MoveMemory ByVal VarPtr(HookBytes(1)), ByVal VarPtr(p), 4
                HookBytes(5) = &HC3
                
                '标准api hook过程之五: 用HookBytes的内容改写API前6个字节
                MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 6
                '设置hook成功标志
                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
            '有程序调用DialogBoxParamA装入4070号对话框,这里我们直接返回1,让
            'VBE以为密码正确了
            MyDialogBoxParam = 1
        Else
            '有程序调用DialogBoxParamA,但装入的不是4070号对话框,这里我们调用
            'RecoverBytes函数恢复原来函数的功能,在进行原来的函数
            RecoverBytes
            MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
                               hWndParent, lpDialogFunc, dwInitParam)
            '原来的函数执行完毕,再次hook
            Hook
        End If
    End Function
    View Code

    3.右击sheet1工作表,“查看代码”复制以下代码进去并保存:

    sub 破解()
    if hook then
    msgbox "破解成功"
    end if
    end sub
    
    
    sub 恢复()
    RecoverBytes
    msgbox "恢复成功"
    end sub

    4.到此,一个vba破解程序完成了,回到该工作簿窗口,文件-打开 打开需要破解vba工程密码的工作簿.
    5.运行"call 破解" 稍后你再双击刚才要解密的VBA工程窗体.是不是如入无人之境啊,工程保护密码形同虚设啊?
    6.破解完成后,请右键刚破解的VBA工程,在"查看工程时需要密码"的地方复选框取消选择,OK.完成.
    7.完成后别忘了执行"call 恢复",恢复密码保护(恢复程序的密码保护,已被破解的文件不收影响. (请勿用于非法途径)

    已验证,破解成功

    方法二:

    新建一个Excel工作簿,Alt+F11 打开VBA编辑器,新建一个模块 ,复制以下代码,注意如提示变量未定义,则把Option Explicit行删除即可,经测试已经通过.
     
    '移除VBA编码保护
    Sub MoveProtect()
        Dim FileName As String
        FileName = Application.GetOpenFilename("Excel文件(*.xls & *.xla),*.xls;*.xla", , "VBA破解")
        If FileName = CStr(False) Then
           Exit Sub
        Else
           VBAPassword FileName, False
        End If
    End Sub
     
    '设置VBA编码保护
    Sub SetProtect()
        Dim FileName As String
        FileName = Application.GetOpenFilename("Excel文件(*.xls & *.xla),*.xls;*.xla", , "VBA破解")
        If FileName = CStr(False) Then
           Exit Sub
        Else
           VBAPassword FileName, True
        End If
    End Sub
     
    Private Function VBAPassword(FileName As String, Optional Protect As Boolean = False)
          If Dir(FileName) = "" Then
             Exit Function
          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 Function
          End If
          If Protect = False Then
             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, "提示"
          Else
             Dim MMs As String * 5
             MMs = "DPB="""
             Put #1, CMGs, MMs
             MsgBox "对文件特殊加密成功......", 32, "提示"
          End If
          Close #1
    End Function

     

  • 相关阅读:
    解决中文环境下zabbix监控图形注释乱码
    SSIS CDC(Change Data Capture)组件在数据库中启用报错。 The error returned was 14234: 'The specified '@server' is invalid
    Tableau 群集部署
    访问Tableau自带的PostgreSQL数据库
    [译]Stairway to Integration Services Level 18 – 部署和执行
    [译]Stairway to Integration Services Level 16 – Flexible Source Locations (多文件导入)
    [译]Stairway to Integration Services Level 15 – SSIS 参数回顾
    [译]Stairway to Integration Services Level 14
    [译]Stairway to Integration Services Level 13
    [译]Stairway to Integration Services Level 12
  • 原文地址:https://www.cnblogs.com/Summer6/p/11245383.html
Copyright © 2011-2022 走看看