Lost Information!

엑셀 VBA 기본 - 엑셀VBA 프로젝트의 비밀번호 풀기 - 1편 본문

개인브랜드블로그를 만들어 보자/엑셀VBA

엑셀 VBA 기본 - 엑셀VBA 프로젝트의 비밀번호 풀기 - 1편

Lostinformation 2021. 2. 8. 20:37

모두가 칼퇴하는 그날까지~

 

지난 글에서는

엑셀 시트가 잠겼을 때

엑셀 VBA 사용하지 않고 

푸는 방법을 알려드렸습니다.

 

만일 저번 내용을 모르시거나

기억이 나질 않으신다면

밑에 글을 참고해주세요.

red-s.tistory.com/2511

 

엑셀 VBA 기본 - 잠긴 엑셀시트를 풀어보자 - 2편

모두가 칼퇴하는 그날까지~ 지난 글에서는 엑셀 시트가 잠겼을 때 엑셀 VBA으로 푸는 방법을 알려드렸습니다. 만일 저번 내용을 모르시거나 기억이 나질 않으신다면 밑에 글을 참고해주세요. r

red-s.tistory.com

 

이번 글에서는

엑셀 워크시트 외에 

VBA에 비밀번호가 

걸려있을 때 푸는 방법

알려드리도록 하겠습니다.

 

사실 VBA에 비밀번호를

설정하는 방법도 모르실 수도

있기 때문에 이 방법도 

알려드리도록 하겠습니다.

 

그럼 ALT +F11을 눌러주세요.

 

먼저 이렇게 VBA를 적었다고

가정하고 나서 

VBA 도구 탭에 VBAProject 속성

클릭해주세요.

 

 

보호 탭을 누르고 

읽기 전용으로 프로젝트 잠금을

체크하고 나서 암호를

설정해주시면 됩니다.

 

저장 후에 종료하고 다시 실행하면

 

이렇게 ALT + F11을 눌러

VBA를 확인하려고 해도

암호를 입력하라는 창이 

나오게 됩니다.

 

물론 남이 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 Win 64 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

 

모조리 복사해서 붙여 넣어주세요.

 

또한 모듈을 하나 더 추가해서

 

Sub unprotected()
    If Hook Then
        MsgBox "VBA 암호가 정상적으로 해제되었습니다."
    End If
End Sub

 

까지 추가해주세요.

 

 

그러고 나서 암호해제 버튼까지

만든 후에 VBA를 연결시켜준 뒤에

실행하게 되면 잠겨있던

엑셀 VBA에 풀리게 될 것입니다.

 

이에 대한 설명은 다음 글에

알려드리도록 하겠습니다.

 

그럼 여기까지 궁금하신 점은

댓글에 남겨주시고 

공감구독도 부탁드립니다.

Comments