VBA-Passwort mit VBA-Skripten entschlüsseln
Glen Alfaro
18 April 2022
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
- Der Code ruft eine Systemfunktion auf, um ein Dialogfeld für die Passworteingabe zu erstellen.
- Die Funktion gibt
1
zurück, wenn das Passwort korrekt ist. Gibt0
zurück, wenn nicht. - Nachdem der Passwortdialog geschlossen wurde, erwartet das System den Rückgabewert.
- 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