Excel VBA 프로젝트에서 암호를 해독하는 방법이 있습니까?
Excel 2003 매크로 갱신을 요구받았지만 VBA 프로젝트는 패스워드로 보호되고 있어 문서가 부족한 것 같습니다.아무도 비밀번호를 몰라
VBA 프로젝트에서 패스워드를 삭제하거나 크래킹하는 방법이 있습니까?
됩니다.VBA
HEX의 'HEX'는 'HEX 'HEX'"*xls.xls, *.xlsm, *.xlam..."을 사용하다
테스트 및 동작:
2007 Excel 2007
2010 Excel 2010
Excel 2013 - 32비트판
Excel 2016 - 32비트판
64비트 버전을 찾고 계십니까?이 답변을 참조해 주세요.
구조
저는 그것이 어떻게 작동하는지 설명하도록 최선을 다할 것입니다 - 제 영어를 용서해주세요.
- VBE는 시스템 함수를 호출하여 비밀번호 대화상자를 만듭니다.
- 사용자가 올바른 비밀번호를 입력하고 [OK]를 클릭하면 이 함수는 1을 반환합니다.사용자가 잘못된 비밀번호를 입력하거나 [Cancel]를 클릭하면 이 함수는 0을 반환합니다.
- 대화상자가 닫히면 VBE는 반환된 시스템 기능의 값을 확인합니다.
- 이 값이 1인 경우, VBE는 패스워드가 올바르다고 생각하므로 잠긴 VBA 프로젝트가 열립니다.
- 아래 코드는 암호 대화 상자를 표시하는 데 사용된 원래 함수의 메모리를 호출 시 항상 1을 반환하는 사용자 정의 함수와 스왑합니다.
코드 사용
먼저 파일을 백업하십시오!
- 잠긴 VBA 프로젝트가 포함된 파일을 엽니다.
새 xlsm 파일을 만들고 이 코드를 Module 1에 저장합니다.
code credited to Siwtom (nick name), a Vietnamese developer
Option Explicit Private Const PAGE_EXECUTE_READWRITE = &H40 Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _ (Destination As Long, Source As Long, ByVal Length As Long) Private Declare Function VirtualProtect Lib "kernel32" (lpAddress As Long, _ ByVal dwSize As Long, ByVal flNewProtect As Long, lpflOldProtect As Long) As Long Private Declare Function GetModuleHandleA Lib "kernel32" (ByVal lpModuleName As String) As Long Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, _ ByVal lpProcName As String) As Long Private Declare Function DialogBoxParam Lib "user32" Alias "DialogBoxParamA" (ByVal hInstance As Long, _ ByVal pTemplateName As Long, ByVal hWndParent As Long, _ ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer Dim HookBytes(0 To 5) As Byte Dim OriginBytes(0 To 5) As Byte Dim pFunc As Long Dim Flag As Boolean Private Function GetPtr(ByVal Value As Long) As Long 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 Long Dim OriginProtect As Long 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 Long, _ ByVal pTemplateName As Long, ByVal hWndParent As Long, _ ByVal lpDialogFunc As Long, ByVal dwInitParam As Long) As Integer If pTemplateName = 4070 Then MyDialogBoxParam = 1 Else RecoverBytes MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _ hWndParent, lpDialogFunc, dwInitParam) Hook End If End Function
모듈 1에서 위의 코드 아래에 이 코드를 붙여넣고 실행합니다.
Sub unprotected() If Hook Then MsgBox "VBA Project is unprotected!", vbInformation, "*****" End If End Sub
VBA 프로젝트로 돌아가서 즐겨보세요.
,, 습, 습, 습, 습, 습, 습, 습, 습, 습, yes, yes, . 사용하시는 한.xls
의 디폴트는 Excel 2007 입니다..xlsx
이 포맷은 상당히 안전한 포맷으로 이 메서드는 동작하지 않습니다.
Treb의 말처럼 단순한 비교입니다.한 가지 방법은 16진 에디터를 사용하여 파일 내의 패스워드 엔트리를 간단하게 교환하는 것입니다(Windows의 경우 16진 에디터 참조).단계별 예:
- 새로운 단순 Excel 파일을 만듭니다.
- VBA 부분에서 간단한 비밀번호를 설정합니다(예: - 1234).
- 파일을 저장하고 종료합니다.파일 크기를 확인합니다. Strewbob's gotcha를 참조하십시오.
- 16진 에디터로 작성한 파일을 엽니다.
다음 키로 시작하는 행을 복사합니다.
CMG=.... DPB=... GC=...
먼저 VBA 비밀번호를 모르는 Excel 파일을 백업한 후 16진 에디터로 열고 위의 복사한 행을 더미 파일에서 붙여넣습니다.
- Excel 파일을 저장하고 종료합니다.
- 이제 VBA 코드를 표시하기 위해 필요한 Excel 파일을 엽니다.VBA 코드의 패스워드는 단순히 1234입니다(여기 보이는 예시와 같습니다).
Excel 2007 또는 2010을 사용해야 하는 경우, 특히 1, 2, 3의 답변이 도움이 될 수 있습니다.
2015년 2월 편집: 매우 유망해 보이는 또 다른 방법은 닥탄응우옌의 새로운 답변을 참조하십시오.
저는 이 방법을 64비트 버전의 Excel에서 사용할 수 있도록 하기 위해 닥탄응우옌의 환상적인 답변을 바탕으로 했습니다.64비트 Windows 7 상에서 Excel 2010 64비트를 실행하고 있습니다.
- 잠긴 VBA 프로젝트가 포함된 파일을 엽니다.
새 xlsm 파일을 만들고 이 코드를 Module 1에 저장합니다.
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 5) As Byte Dim OriginBytes(0 To 5) 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)), 6 End Sub Public Function Hook() As Boolean Dim TmpBytes(0 To 5) As Byte Dim p As LongPtr Dim OriginProtect As LongPtr 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 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에 붙여넣고 실행합니다.
Sub unprotected() If Hook Then MsgBox "VBA Project is unprotected!", vbInformation, "*****" End If End Sub
면책사항 이것은 나에게 효과가 있었고 나는 그것이 누군가에게 도움이 되기를 바라며 여기에 그것을 문서화했다.아직 충분히 테스트하지 않았습니다.이 옵션을 계속하기 전에 열려 있는 모든 파일을 저장해야 합니다.
사이즈에 문제가 없는 (어느 정도 쉬운) 다른 솔루션이 있습니다.저는 오늘(2003년 XLS 파일, Excel 2007 사용) 이 방법을 사용하여 성공했습니다.
- xls 파일 백업
- HEX를 .
DPB=...
교환 - 변경합니다.
DPB=...
으로 묶다DPx=...
- Excel에서 xls 파일을 엽니다.
- VBA ALT에디터(+)를 엽니다.
- 마법:Excel이 비활성 키(DPX)를 검색하여 프로젝트 로드를 계속할 것인지 묻습니다(기본적으로 보호 무시).
- 암호를 덮어쓸 수 있으므로 기억할 수 있는 암호로 변경하십시오.
- xls 파일 저장*
- 문서를 닫았다가 다시 열고 VBA 마법을 사용하세요!
* 메모: 패스워드를 새로운 값으로 변경했는지 확인하십시오.변경하지 않으면 다음에 스프레드시트를 열면 Excel에 에러(예기치 않은 오류)가 표시됩니다.VBA 모듈 목록에 액세스하면 소스 모듈의 이름이 표시되지만 폼/코드 등을 열려고 하면 다른 오류가 발생합니다.이 문제를 해결하려면 VBA 프로젝트 속성으로 돌아가서 암호를 새 값으로 설정하십시오.Excel 문서를 저장하고 다시 열면 바로 사용할 수 있습니다.
의 .xlsm
★★★★★★★★★★★★★★★★★」.dotm
파일 타입은 약간 다른 방법으로 해야 합니다.
- 를 바꿉니다.
.xlsm
.zip
. - .zip 파일(WinZip 또는 WinRar 등)을 열고 xl 폴더로 이동합니다.
- 뽑습니다.
vbaProject.bin
파일을 만들어 Hex Editor에서 엽니다(HxD를 사용합니다.HxD는 완전히 자유롭고 가볍습니다). - (Search(검))
DPB
로 and and and and and로DPx
파일을 저장합니다. - 것을 해 주세요.
vbaProject.bin
압축된 파일에 이 새 파일이 들어 있습니다. - 를 다시 확장자로 변경합니다.
.xlsm
. - 경고 메시지에서 워크북을 엽니다.
- Excel에서 Visual Basic을 엽니다.
- [ Tools ] > [ VBAProject Properties ]> [ Protection ]탭으로 이동합니다.
- 를 입력하고, 「」를 합니다.
.xlsm
filename을 클릭합니다. - 닫았다가 다시 열면 새 암호가 작동합니다.
편집: 승인된 답변의 업데이트 버전으로 더 많은 Office 버전에서 작동합니다.어렵지만 이 답을 꼭꼭 맞혀보자!
이번에는 32/64비트 버전의 Office에서 이 방법을 사용할 수 있도록 d allowc Thanh Nguynn의 환상적인 답변을 바탕으로 한 kaybee99의 훌륭한 답변을 바탕으로 합니다.
변경된 내용의 개요에서는 32비트 주소로 제한된 푸시/재설정을 피하고 mov/jmp reg로 대체합니다.
동작 원리
잠긴 VBA 프로젝트가 포함된 파일을 엽니다.
위와 같은 유형의 새 파일을 생성하여 이 코드를 Module 1에 저장합니다.
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에 붙여넣고 실행합니다.
Sub unprotected() If Hook Then MsgBox "VBA Project is unprotected!", vbInformation, "*****" End If End Sub
콜린 피카드는 훌륭한 답을 가지고 있지만, 이것과 함께 한 가지 '조심하라'가 있다."CMG=........"의 총 길이가 아직 원인을 파악하지 못한 경우가 있습니다.파일의 GC=........" 항목이 Excel 파일마다 다릅니다.경우에 따라서는 이 엔트리가 137바이트가 될 수도 있고 143바이트가 될 수도 있습니다.137 바이트의 길이는 홀수이며, '1234' 비밀번호를 사용하여 파일을 만들 때 이 문제가 발생하면 다른 파일을 생성하기만 하면 143 바이트의 길이로 점프합니다.
잘못된 바이트 수를 파일에 붙여넣으려고 하면 Excel로 파일을 열 때 VBA 프로젝트가 손실됩니다.
편집
Excel 2007/2010 파일에는 적용되지 않습니다.표준 .xlsx 파일 형식은 형식, 레이아웃, 내용 등이 포함된 다수의 하위 폴더를 포함하는 .zip 파일이며 xml 데이터로 저장됩니다.보호되지 않은 Excel 2007 파일의 경우 .xlsx 확장자를 .zip으로 변경한 다음 zip 파일을 열고 모든 xml 데이터를 확인합니다.아주 간단해요.
단, Excel 2007 파일을 패스워드로 보호하면 실제로는 .zip(.xlsx) 파일 전체가 RSA 암호화를 사용하여 암호화됩니다.확장자를 .zip으로 변경하고 파일 내용을 참조할 수 없게 되었습니다.
Excel 2007(xlsm) 파일이 있는 경우 Excel 2003(xls) 파일로 저장하고 다른 답변에서 설명하는 방법을 사용할 수 있습니다.
의 VBA (「」, 「Excel, Powerpoint」, 「Word」)2007, 2010, 2013 or 2016
를 가진 .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM
)는 간단하게 제거할 수 있습니다.
파일 이름 확장자를 다음과 같이 변경하는 것이 중요합니다..ZIP
파일의 압축을 풀고 기본 Hex Editor(예: XVI32)를 사용하여 기존 비밀번호를 "브레이크"하면 Office에서 다음 번에 파일을 열 때 새 비밀번호를 입력하라는 메시지가 표시됩니다.
순서의 개요:
- 이름을 하여 파일 합니다.
.ZIP
내선 번호 - 을 열다
ZIP
ㅇㅇㅇㅇㅇㅇㅇㅇㅇ에 가보세요.XL
더입니니다다 vbaProject.bin
16진 에디터- & Replace에서 "all"로 변경, "Search & Replace"에서 "Replace all"로 변경
DPB
로로 합니다.DPX
. - 「」를 합니다.
.bin
파일을 zip에 다시 저장하고 일반 확장자로 되돌린 후 파일을 여십시오. - ALT을 클릭하여 하여 [ALT+F11]를합니다.
VBA Project Properties
. - 에에 。
Protection
탭을 누르고 새 암호를 설정합니다. - [ ] 를 합니다.
OK
ALT+F11을 사용하다 - 설정한 새 비밀번호를 입력합니다.
이 시점에서, 패스워드를 완전하게 삭제할 수 있습니다.
제가 만든 "오래 전" 비디오로 설명을 완성해 보세요. 여기 유튜브에 있습니다.
이 회피책이 몇 년째 행해지고 있는데, Microsoft가 이 문제를 해결하지 못하고 있다는 것은 다소 충격적입니다.
이야기의 교훈은?
Microsoft Office VBA Project 비밀번호는 기밀 정보의 보안에 의존하지 않습니다.보안이 중요한 경우 타사 암호화 소프트웨어를 사용하십시오.
OpenOffice.org에서 간단히 열어보셨나요?
얼마 전에도 비슷한 문제가 있었는데, Excel과 Calc가 서로의 암호화를 이해하지 못했기 때문에 모든 것에 직접 접근할 수 있었습니다.
이것은 꽤 오래 전의 일이기 때문에, 저로서는 요행수만이 아니었다면, 패치도 되어 있었을지도 모릅니다.
이 "" "" " " " " " " " in " in " in " in " in " in " inCMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX"
'known password'는 'known password'로, 'known password'는 'known password'입니다. 올바른 길이에 도달하려면 16진수 문자열에 후행 0을 채우십시오.
예.
CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"
unknown password 파일에서, 로 설정해야 합니다.
CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000"
파일 길이를 보존합니다.
이것도 .X에서 작업한 적이 있습니다.Office 2007의 LA(97/2003 형식) 파일.
Excel 2007 이후로는 파일 확장자를 .zip으로 변경해야 합니다.아카이브에는 서브폴더 xl이 있으며, 그 안에 vbaProject.bin이 있습니다.vbaProject.bin을 사용하여 위의 단계를 수행한 후 다시 아카이브에 저장합니다.내선번호를 되돌리고 voila!(위의 단계를 따릅니다)
위의 몇 가지 솔루션을 시험해 봤지만, 어느 솔루션도 효과가 없습니다(2007 xlsm 파일 제외).그리고 암호를 해독하는 것뿐만 아니라 암호도 검색할 수 있는 다른 해결책을 찾았습니다.
이 코드를 모듈에 삽입하고 실행한 후 시간을 주십시오.무차별적인 힘으로 패스워드를 회복합니다.
Sub PasswordBreaker()
'Breaks worksheet password protection.
Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
MsgBox "One usable password is " & Chr(i) & Chr(j) & _
Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next
End Sub
Colin Pickard는 대부분 맞지만 파일 전체의 "비밀번호 열기" 보호와 VBA 비밀번호 보호를 혼동하지 마십시오.이는 Office 2003과 2007의 경우와 완전히 다릅니다(Office 2007의 경우 파일 이름을 .zip으로 변경하고 vba Project를 찾습니다).휴지통)을 엽니다.그리고 기술적으로 파일을 편집하는 올바른 방법은 CFX와 같은 OLE 복합 문서 뷰어를 사용하여 올바른 스트림을 여는 것입니다.물론 바이트만 교체하는 경우 일반 이전 바이너리 에디터가 작동할 수 있습니다.
참고로, 이러한 필드의 정확한 형식이 궁금할 경우, 지금 문서화되어 있습니다.
http://msdn.microsoft.com/en-us/library/dd926151%28v=office.12%29.aspx
파일 몇 는 zip 파일)인 경우.50 4B
-- 다음과 같은 형식으로 사용됩니다..xlsm
다음 파일의 xl/vbaProject.bin
은 CFB와 같은 .xls
XLS 형식(서브 파일에 적용됨)의 지시에 따라 내용을 압축합니다.
XLS 포맷의 경우, 이 투고에 기재되어 있는 다른 방법에 따라 주세요.으로 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★를 검색하는 것을 선호합니다.DPB=
및
CMG="..."
DPB="..."
GC="..."
빈칸으로 표시합니다.이것에 의해, CFB 컨테이너 사이즈의 문제가 회피됩니다.
톰 - 처음에는 바이트 크기를 보지 않고 "CMG" 설정을 복사하여 다음 엔트리에 붙여 넣었기 때문에 남학생 오류를 범했습니다.그러나 두 파일 사이에 텍스트 크기가 서로 달라 Stewbob이 경고한 대로 VBA 프로젝트를 놓쳤다.
HxD를 사용하여 선택한 파일의 양을 추적하는 카운터가 있습니다.CMG에서 시작하여 카운터가 8F(143)로 표시될 때까지 복사하고, 마찬가지로 잠금 파일에 붙여넣을 때 페이스트 끝에 "..."라는 숫자가 두 배 붙었는데, 왠지 이상하고 부자연스럽게 느껴졌지만, 작동했습니다.
중요한지는 모르겠지만, 엑셀로 파일을 열기 전에 16진 에디터와 엑셀을 모두 셧다운하고 있는 것을 확인했습니다.그런 다음 메뉴를 통해 VB Editor를 열고 VBProject Properties로 이동한 후 'new' 비밀번호를 입력하여 코드를 잠금 해제해야 했습니다.
이게 도움이 됐으면 좋겠어요.
이 문서가 Office 2007 또는 그 이전에 작성된 경우, Elcom Soft는 Advanced Office Password Breaker 및 Advanced Office Password Recovery 제품을 만듭니다.
내 도구인 VbaDiff는 파일에서 VBA를 직접 읽어내기 때문에 16진수 편집기를 사용하지 않고도 대부분의 사무실 문서에서 보호된 VBA 코드를 복구할 수 있습니다.
승인된 답변은 Windows 10의 Excel 2019에서 작동하지 않았습니다.잠긴 매크로를 표시하기 위해 필요한 추가 절차를 확인했습니다.스텝을 정리하고 있습니다.
Excel 파일 이름 끝에 .zip을 추가하고 Enter 키를 누릅니다.
파일이 ZIP 파일로 변경되면 두 번 클릭하여 엽니다.
내부에는 아래와 같은 xl라는 폴더가 있습니다.
xl 안에 vbaProject.bin이라는 파일이 있습니다.데스크탑에 복사/붙여넣기
온라인 16진수 에디터 HexEd.it에 접속합니다.
다음 텍스트 DPB=...를 검색하여 DPx=...로 변경합니다.
파일을 저장하고 HexEd.it 를 닫습니다.
ZIP 파일 내 데스크톱에서 업데이트된 파일을 복사/붙여넣기(덮어쓰기 필요)
파일 이름 끝에서 .zip 확장자를 삭제하고 Excel 확장자를 다시 추가합니다.
파일을 Excel로 엽니다.오류 알림이 몇 개 표시될 수 있습니다.클릭만 하면 됩니다.
==== 승인된 답변에 대한 추가 단계 =====
- Visual Basic 창(내 기억이 정확하다면 보통 ALT+F11)을 열고 VBAProject 속성(도구 메뉴)을 엽니다.
- 보호 탭을 클릭하고 암호를 짧고 기억하기 쉬운 것으로 변경합니다(이 단계에서는 제거하지 마십시오). 다음 단계에서 제거합니다.
- 워크북을 저장한 후 닫았다가 다시 여십시오.
- Visual Basic 창을 다시 열고 입력한 암호를 입력합니다.이전 단계를 다시 수행하지만 이번에는 암호를 삭제(삭제)할 수 있습니다.
- 워크북을 저장하면 비밀번호가 삭제됩니다.
다음 사이트에서 추가 절차를 수행합니다.https://confluence.jaytaala.com/display/TKB/Remove+Excel+VBA+password
사실 대부분의 매크로 사용 가능한 Office 문서의 코드 파일은 암호화되지 않으며 비밀번호는 Office 프로그램으로 프로젝트를 열 수 없도록 합니다.즉, 다른 답변에서 제시된 바와 같이 Office를 사용하여 파일에 액세스하고 편집할 수 있습니다.
다만, 코드에 액세스 할 필요가 있는 경우는, oledump.py 와 같은 툴을 사용해 매크로 코드를 추출할 수 있습니다.이 기능은 악성 프로그램 분석과 파일에서 대부분의 코드를 가져올 때 유용합니다. 따라서 암호를 잊어버린 경우 처음부터 다시 시작할 필요가 없습니다.
또한 많은 Excel 파일이 파일을 열 때 동적으로 비밀번호를 설정합니다.즉, 코드를 읽을 수 있으면 보통 일반 텍스트로 비밀번호를 찾거나 암호를 해독할 수 있습니다.
oledump.py
§:
사무실 문서 내의 모든 "스트림"(내장 바이너리 파일 또는 코드 파일)을 나열합니다.
python oledump.py -v yourExcelFile.xlsm
출력:
A: xl/vbaProject.bin
A1: 2000 'PROJECT'
A2: 1500 'PROJECTwm'
A3: M 1224 'VBA/Module1'
A4: M 18694 'VBA/Module2'
A5: M 11877 'VBA/Module3'
...
" " 가 붙은 M
되지 않은 VBA .
스트림을 추출하다
python oledump.py -s A3 -v yourExcelFile.xlsm > Module1.vba
에 됩니다.A3
로 to로 Module1.vba
.
나는 보통 이것을 루프와 결합하여 모든 파일을 폴더에 추출한다.이 빠른 PowerShell 스크립트는 대부분의 파일에 있는 모든 스트림을 추출합니다.
New-Item -ItemType Directory "Output"
# just hardcode the highest stream outputted by oledump.py -v
$max = 5
for ($i = 1; $i -le $max; $i++) {
python oledump.py -s "A$i" -v yourExcelFile.xlsm > ".\Output\A$i"
}
이렇게 하면 사람이 읽을 수 있는 파일만 추출됩니다.
보호 기능은 Excel에서 단순 텍스트 비교입니다.마음에 드는 디버거에 Excel을 로드하고(Olydbg는 내가 선택한 도구) 비교 코드를 찾아 항상 true를 반환하도록 수정하면 매크로에 액세스할 수 있습니다.
Windows 10 머신의 Excel 2016 64비트의 경우 16진 에디터를 사용하여 보호된 xla의 비밀번호를 변경할 수 있습니다(다른 확장자에 대해서는 테스트하지 않았습니다).힌트: 이 작업을 수행하기 전에 백업을 생성하십시오.
내가 취한 조치:
- 16진수 에디터에서 vba를 엽니다(예: XVI).
- 이 DPB에서 검색
- DPB를 DPX와 같은 다른 것으로 변경
- 살려주세요!
- .xla를 다시 열면 오류 메시지가 나타납니다.계속 진행해주세요
- 이제 속성을 열고 암호 탭으로 이동하여 .xla의 암호를 변경할 수 있습니다.
이게 도움이 됐으면 좋겠네요!
에서 하고 있는 Java
VBA 스크립트를 추출한 후,.xlsm
일반 텍스트에서 암호를 찾았습니다.
Excel 파일의 확장자가 xml로 변경됩니다.메모장에서 열어보세요.xml 파일에서 찾을 수 있는 암호 텍스트.
아래 줄과 같습니다.
Sheets("Sheet1").Unprotect Password:="blabla"
(영어가 서툴러서 미안해)
VBA 프로젝트 비밀번호를 삭제하는 간단한 방법 중 하나는 다음을 수행하는 것입니다.
- xlsm 파일을 zip으로 변환합니다.
- 내부에서 VBAProject.bin 파일을 엽니다(메모장++(https://notepad-plus-plus.org/downloads/)를 사용하는 것이 좋습니다).
- [ Search for DPB ]필드
- DPx로 교체합니다.
- 파일 저장
- zip 파일을 xlsm으로 변환하다
- 엑셀 파일을 열다
- 메시지 상자가 나타나면 예를 클릭합니다.
- VBA 프로젝트 속성에 대한 새 암호 설정
- 파일을 닫았다가 다시 엽니다.
- 보호를 해제할 새 암호 입력
언급URL : https://stackoverflow.com/questions/1026483/is-there-a-way-to-crack-the-password-on-an-excel-vba-project
'programing' 카테고리의 다른 글
vba: 어레이에서 원하는 값 가져오기 (0) | 2023.04.14 |
---|---|
Swift에서 문자열을 배열로 분할하시겠습니까? (0) | 2023.04.14 |
인쇄 탭에서 '모든 열을 한 페이지에 맞춤'을 설정하는 방법 (0) | 2023.04.14 |
NSUserDefaults가 NSMutableDictionary를 iOS에 저장하지 못한 이유는 무엇입니까? (0) | 2023.04.14 |
SourceKit 서비스가 종료되었습니다. (0) | 2023.04.14 |