VBA-Passwort mit VBA-Skripten entschlüsseln

Glen Alfaro 18 April 2022
VBA-Passwort mit VBA-Skripten entschlüsseln

Das Bearbeiten oder Überarbeiten von VBA-Skripten ist unerlässlich, um die Funktionalität zu verbessern und auf dem neuesten Stand zu halten. Es kommt jedoch die Zeit, dass die VBA, die Sie bearbeiten müssen, ein Passwort hat und Sie keine Ahnung haben, was Sie dagegen tun sollen.

Dieser Artikel zeigt, wie Sie ein vergessenes oder unbekanntes VBA-Skriptkennwort mithilfe von VBA-Codes entsperren können.

Die Logik in einer Nussschale von VBA Password

  1. Der Code ruft eine Systemfunktion auf, um ein Dialogfeld für die Passworteingabe zu erstellen.
  2. Die Funktion gibt 1 zurück, wenn das Passwort korrekt ist. Gibt 0 zurück, wenn nicht.
  3. Nachdem der Passwortdialog geschlossen wurde, erwartet das System den Rückgabewert.
  4. Wenn der Rückgabewert 1 ist, wird dies vom System als korrektes Passwort bestätigt. Dadurch wird das VBA-Projekt entsperrt.

Der folgende Code zeigt, wie der Speicher der Funktion Password Checker ausgetauscht wird, einer benutzerdefinierten Funktion, die bei jedem Aufruf 1 zurückgibt.

Option Explicit

Private Const PAGE_EXECUTE_READWRITE = &H40

Private Declare PtrSafe Function VirtualProtect Lib "kernel32" (lpAddress As LPtr, _
ByVal dwSize As LPtr, ByVal flNewProtect As LPtr, lpflOldProtect As LPtr) As LPtr

Private Declare PtrSafe Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As LPtr

Private Declare PtrSafe Function GetProcAddress Lib "kernel32" (ByVal hModule As LPtr, _
ByVal lpProcName As String) As LPtr

Private Declare PtrSafe Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As LPtr, Source As LPtr, ByVal Length As LPtr)

Private Declare PtrSafe Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As LPtr, _
ByVal pTemplateName As LPtr, ByVal hWndParent As LPtr,ByVal lpDialogFunc As LPtr, ByVal dwInitParam As LPtr) As Integer

Dim HBytes(0 To 5) As Byte
Dim OBytes(0 To 5) As Byte
Dim pFunc As LPtr
Dim Flag As Boolean

Private Function GetPtr(ByVal Value As LPtr) As LPtr
    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 LPtr
    Dim OriginProtect As LPtr

    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 LPtr, _
ByVal pTemplateName As LPtr, ByVal hWndParent As LPtr, _
ByVal lpDialogFunc As LPtr, ByVal dwInitParam As LPtr) As Integer

    If pTemplateName = 4070 Then
        MyDialogBoxParam = 1
    Else
        RecoverBytes
        MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
                   hWndParent, lpDialogFunc, dwInitParam)
        Hook
    End If
End Function

Sub UnprotectedVBACode()
    'Run this subroutine to unlock the VBA project.
    If Hook Then
        Debug.print ("VBA Project was cracked.")
    End If
End Sub

vba entsperrpasswort

Verwandter Artikel - VBA Password