컴퓨터일반/프로그래밍

엑셀 VBA 암호화 해제 코드

G-Ryon 2026. 3. 24. 12:36

엑셀을 사용하다 보면 과거에 설정해둔 VBA(Visual Basic for Applications) 프로젝트 비밀번호를 잊어버려 곤란한 경우가 종종 있습니다.

외부 프로그램 설치 없이, 오직 VBA 코드만으로 VBA 프로젝트 암호 잠금을 무력화하는 방법에 대해 알아보겠습니다.

 

해당 코드는 이전에 어디선가 검색해서 알아낸 코드인데, 정확하게 출처를 찾지 못했습니다.

개인 정리 차원에서 포스팅하니,  혹시 원본 코드 작성자 분이나, 해당 코드가 문제가 될 경우 댓글 주시면 조치하도록 하겠습니다.

 


작동 원리: 메모리 후킹(Memory Hooking)

이 코드는 단순히 암호를 찾아내는 방식이 아닙니다.

엑셀이 암호 입력창을 띄우려고 할 때, 윈도우 API를 사용하여 "암호가 맞다"는 신호를 강제로 보내도록 메모리를 일시적으로 수정(Hooking)하는 방식입니다.

  1. DialogBoxParamA 후킹: 엑셀이 암호 확인 대화상자를 호출할 때 사용하는 함수를 가로챕니다.
  2. ID 확인: 호출된 대화상자의 ID가 VBA 암호창(4070)인지 확인합니다.
  3. 강제 승인: 암호창일 경우, 실제 암호를 묻지 않고 즉시 '확인' 버튼을 누른 것과 같은 값(1)을 반환합니다.

🛠️ 사용 방법

이 방법은 두 개의 모듈을 사용하여 진행됩니다.

1단계: 후킹 로직 작성 (Module1)

새 엑셀 파일을 열고 Alt + F11을 눌러 VBA 편집기를 켭니다.

[삽입] -> [모듈]을 클릭해 Module1을 만들고 아래 코드를 복사해 붙여넣으세요.

이 코드는 시스템 메모리에 접근하여 엑셀의 동작을 잠시 변경하는 핵심 역할을 합니다.

VBA
Option Explicit

Private Const PAGE_EXECUTE_READWRITE = &H40

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

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

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

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

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

Dim HookBytes(0 To 11) As Byte
Dim OriginBytes(0 To 11) As Byte
Dim pFunc As LongPtr
Dim Flag As Boolean

Private Function GetPtr(ByVal Value As LongPtr) As LongPtr
    GetPtr = Value
End Function

Public Sub RecoverBytes()
    If Flag Then MoveMemory ByVal pFunc, ByVal VarPtr(OriginBytes(0)), 12
End Sub

Public Function Hook() As Boolean
    Dim TmpBytes(0 To 11) As Byte
    Dim p As LongPtr, osi As Byte
    Dim OriginProtect As LongPtr

    Hook = False

    #If Win64 Then
        osi = 1
    #Else
        osi = 0
    #End If

    pFunc = GetProcAddress(GetModuleHandleA("user32.dll"), "DialogBoxParamA")

    If VirtualProtect(ByVal pFunc, 12, PAGE_EXECUTE_READWRITE, OriginProtect) <> 0 Then

        MoveMemory ByVal VarPtr(TmpBytes(0)), ByVal pFunc, osi+1
        If TmpBytes(osi) <> &HB8 Then

            MoveMemory ByVal VarPtr(OriginBytes(0)), ByVal pFunc, 12

            p = GetPtr(AddressOf MyDialogBoxParam)

            If osi Then HookBytes(0) = &H48
            HookBytes(osi) = &HB8
            osi = osi + 1
            MoveMemory ByVal VarPtr(HookBytes(osi)), ByVal VarPtr(p), 4 * osi
            HookBytes(osi + 4 * osi) = &HFF
            HookBytes(osi + 4 * osi + 1) = &HE0

            MoveMemory ByVal pFunc, ByVal VarPtr(HookBytes(0)), 12
            Flag = True
            Hook = True
        End If
    End If
End Function

Private Function MyDialogBoxParam(ByVal hInstance As LongPtr, _
ByVal pTemplateName As LongPtr, ByVal hWndParent As LongPtr, _
ByVal lpDialogFunc As LongPtr, ByVal dwInitParam As LongPtr) As Integer

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

2단계: 실행 매크로 작성 (Module2)

다시 **[삽입] -> [모듈]**을 클릭해 Module2를 만들고 아래 실행 코드를 넣습니다.

VBA
 
Sub unprotected()
    If Hook Then
        MsgBox "VBA Project is unprotected!", vbInformation, "*****"
    End If
End Sub

3단계: 암호 풀기

  1. 비밀번호가 걸린 엑셀 파일을 먼저 엽니다.
  2. 코드를 작성한 파일에서 unprotected 매크로를 실행합니다.
  3. "VBA Project is unprotected!" 메시지가 뜨면, 암호가 걸려있던 파일의 VBA 프로젝트를 클릭해보세요.
    암호 입력창 없이 바로 내부 코드가 열립니다.

⚠️ 주의사항 및 면책 공고

  • 백업 필수: 메모리를 직접 건드리는 방식이므로 엑셀이 강제 종료될 수 있습니다. 중요한 작업물은 반드시 백업 후 진행하세요.
  • 일회성 해제: 이 방법은 파일을 물리적으로 수정하는 것이 아니라 메모리상에서만 해제하는 것입니다.
                        코드를 열어본 뒤, [VBA Project 속성]에서 암호를 아예 없애거나 재설정해야 영구적으로 반영됩니다.
  • 윤리적 사용: 본 코드는 본인이 작성한 코드의 분실된 비밀번호를 찾기 위한 용도로만 사용하시기 바랍니다.
                        타인의 지적 재산권을 침해하는 행위는 법적 책임을 질 수 있습니다.