반응형
VBA(Visual Basic for Applications) 프로젝트에 설정된 암호를 제거하려면 몇 가지 방법이 있습니다. 아래에 대표적인 두 가지 방법을 소개합니다.
방법 1: HEX 에디터를 활용한 암호 제거
- 파일 준비: 암호가 설정된 엑셀 파일(
.xlsm
)의 백업을 생성합니다. - 파일 확장자 변경: 원본 파일의 확장자를
.zip
으로 변경합니다. 예를 들어,example.xlsm
을example.zip
으로 수정합니다. - 압축 해제: 변경된 ZIP 파일을 압축 해제하여 폴더를 엽니다.
- VBA 프로젝트 파일 수정:
xl
폴더 내의vbaProject.bin
파일을 HEX 에디터로 엽니다. - 암호 정보 수정: HEX 에디터에서
DPB
문자열을 찾아DPx
로 변경하고 저장합니다. - 파일 재구성: 수정된 파일들을 다시 ZIP 형식으로 압축하고, 확장자를
.xlsm
으로 변경합니다. - 암호 제거 확인: 엑셀에서 해당 파일을 열고, VBA 프로젝트에 접근하여 암호가 제거되었는지 확인합니다.
(3) 엑셀 VBA 프로젝트 암호 해제 - 로그남의 취미생활연구소
(3) 엑셀 VBA 프로젝트 암호 해제
엑셀 VBA 프로젝트 암호 해제를 해보겠습니다 xlsm 파일을 열고 단축키 Alt + F11 입력하여 VBA를 열어줍니다 도구 -> VBA Project 속성 -> 보호 탭 에서 읽기 전용으로 프로젝트 잠금 체크 박스 체크 후 암
lognam.tistory.com
방법 2: VBA 코드 이용한 암호 제거
- 새 엑셀 파일 생성: 엑셀을 열고 새 통합 문서를 만듭니다.
- VBA 편집기 열기:
Alt + F11
키를 눌러 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 Sub UnprotectVBA() If Hook Then MsgBox "VBA Project is unprotected!", vbInformation, "알림" End If End Sub
- 매크로 실행:
F5
키를 눌러UnprotectVBA
매크로를 실행합니다. - 암호 제거 확인: "VBA Project is unprotected!" 메시지가 나타나면, 암호가 성공적으로 제거된 것입니다.
주의사항
- 이러한 방법은 본인이 소유하거나 권한이 있는 파일에만 사용해야 합니다. 타인의 저작물을 무단으로 수정하거나 사용하는 것은 법적으로 문제가 될 수 있습니다.
- 파일을 수정하기 전에 반드시 백업을 생성하여 데이터 손실에 대비하십시오
반응형