Excel 2003 매크로를 업데이트하라는 요청을 받았지만 VBA 프로젝트는 암호로 보호되어 있으며 문서가 부족한 것 같습니다. 아무도 암호를 모른다.
VBA 프로젝트에서 암호를 제거하거나 해독하는 방법이 있습니까?
Excel 2003 매크로를 업데이트하라는 요청을 받았지만 VBA 프로젝트는 암호로 보호되어 있으며 문서가 부족한 것 같습니다. 아무도 암호를 모른다.
VBA 프로젝트에서 암호를 제거하거나 해독하는 방법이 있습니까?
답변:
VBA
HEX 편집이 필요없는 이 직접 접근 방식을 시도 할 수 있습니다 . 모든 파일 (* .xls, * .xlsm, * .xlam ...)에서 작동합니다.
테스트 및 작동 :
Excel 2007
Excel 2010
Excel 2013-32 비트 버전
Excel 2016-32 비트 버전
64 비트 버전을 찾고 계십니까? 이 답변을 참조하십시오
나는 그것이 어떻게 작동하는지 설명하기 위해 최선을 다할 것입니다-영어 실례합니다.
먼저 파일을 백업하십시오!
새 xlsm 파일을 작성하고이 코드를 Module1에 저장 하십시오.
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
이 코드를 Module1 의 위 코드 아래에 붙여 넣고 실행하십시오.
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
VBA 프로젝트로 돌아와서 즐기십시오.
예, .xls
형식 스프레드 시트 (2003 년까지 Excel의 기본값)를 사용하는 한 있습니다. Excel 2007 이후의 경우 기본값은 .xlsx
매우 안전한 형식이며이 방법은 작동하지 않습니다.
Treb가 말했듯이 간단한 비교입니다. 한 가지 방법은 16 진 편집기를 사용하여 파일에서 비밀번호 항목을 간단히 바꾸는 것 입니다 (Windows 용 16 진 편집기 참조 ). 단계별 예 :
다음 키로 시작하는 행을 복사하십시오.
CMG=....
DPB=...
GC=...
첫 번째 백업 VBA 암호를 모르는 Excel 파일을 16 진수 편집기로 연 다음 더미 파일에서 위의 복사 된 행을 붙여 넣습니다.
Excel 2007 또는 2010으로 작업해야하는 경우 아래에 도움이 될만한 다른 답변이 있습니다. 1 , 2 , 3 .
2015 년 2 월 편집 : 매우 유망 해 보이는 또 다른 방법은 Đức Thanh Nguyễn의 새로운 답변 을 보십시오 .
CMG...
문자열이 원본보다 길면 파일 길이를 안전하게 늘릴 수 있습니다 .
이 방법을 64 비트 버전의 Excel에서 사용할 수 있도록 Đức Thanh Nguyễn의 환상적인 답변을 바탕으로 작성했습니다. 64 비트 Windows 7에서 Excel 2010 64 비트를 실행하고 있습니다.
새 xlsm 파일을 작성하고이 코드를 Module1에 저장 하십시오.
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
이 코드를 Module2에 붙여 넣고 실행하십시오.
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
면책 조항 이것은 저에게 효과적 이며 누군가를 도울 수 있도록 여기에 문서화했습니다. 나는 그것을 완전히 테스트하지 않았습니다 . 이 옵션을 진행하기 전에 열려있는 모든 파일을 저장하십시오.
크기 문제없이 또 다른 (약간 쉬운) 솔루션이 있습니다. 나는 오늘 (2003 Excel 2007을 사용하여 2003 XLS 파일에서)이 접근법을 사용했으며 성공했습니다.
DPB=...
부품을 찾습니다DPB=...
에 문자열을DPx=...
* 참고 : 비밀번호를 새 값으로 변경했는지 확인하십시오. 그렇지 않으면 다음에 스프레드 시트를 열면 Excel에서 오류 (예기치 않은 오류)가보고 된 다음 VBA 모듈 목록에 액세스하면 이제 이름이 표시됩니다. 소스 모듈이지만 양식 / 코드 등을 열려고하면 다른 오류가 발생합니다. 이 문제를 해결하려면 VBA 프로젝트 속성으로 돌아가서 암호를 새 값으로 설정하십시오. 저장하고 Excel 문서를 다시 열면 잘 가야합니다!
콜린 피커드 (Colin Pickard)는 훌륭한 해답을 가지고 있지만 이것에 대한 '감시'가 있습니다. 파일의 "CMG = ........ GC = ...."항목의 전체 길이가 Excel 파일마다 다르고 (아직 원인을 찾지 못했음) 인스턴스가 있습니다. 다음. 어떤 경우에는이 항목이 137 바이트이고 다른 경우에는 143 바이트입니다. 137 바이트 길이는 홀수이며, '1234'암호로 파일을 만들 때 이런 일이 발생하면 다른 파일을 만들면 143 바이트 길이로 이동합니다.
파일에 잘못된 수의 바이트를 붙여 넣으려고하면 Excel에서 파일을 열려고하면 VBA 프로젝트가 손실됩니다.
편집하다
Excel 2007/2010 파일에는 유효하지 않습니다. 표준 .xlsx 파일 형식은 실제로는 서식, 레이아웃, 내용 등이 XML 데이터로 저장된 수많은 하위 폴더가 포함 된 .zip 파일입니다. 보호되지 않은 Excel 2007 파일의 경우 .xlsx 확장자를 .zip으로 변경 한 다음 zip 파일을 열고 모든 xml 데이터를 살펴볼 수 있습니다. 매우 간단합니다.
그러나 Excel 2007 파일을 암호로 보호하면 전체 .zip (.xlsx) 파일이 실제로 RSA 암호화를 사용하여 암호화됩니다. 더 이상 확장자를 .zip으로 변경하고 파일 내용을 찾아 볼 수 없습니다.
A에 대한 .xlsm
또는 .dotm
파일 형식 당신은 그것을 약간 다른 방식으로 할 필요가있다.
.xlsm
파일 확장자를로 변경하십시오 .zip
.vbaProject.bin
파일을 추출하고 16 진수 편집기에서 엽니 다 ( 완전히 무료이며 가벼운 HxD 사용 합니다.)DPB
바꾸고 DPx
파일을 저장하십시오.vbaProject.bin
압축 파일에서 이전 파일을 새 파일로 바꿉니다 ..xlsm
..xlsm
파일을 저장 하십시오.Excel 2007 (xlsm) 파일이있는 경우 해당 파일을 Excel 2003 (xls) 파일로 저장하고 다른 답변에 설명 된 방법을 사용할 수 있습니다.
1.
.XLS로 변환 .xlsm을 2.
.XLS의의 코드 균열 3.
변환 .xlsm을 .XLSX하기 4.
에 .XLS에서 모듈의 코드를 넣어은. xlsx로 저장하고 .xlsm으로 저장
내 차례에 이것은 kaybee99의 탁월한 답변을 기반으로 하며이 방법은 x86 및 amd64 버전의 Office 모두에서 작동 할 수있는 Đức Thanh Nguyễn의 환상적인 답변을 기반으로합니다.
변경된 사항에 대한 개요, 우리는 32 비트 주소로 제한되는 푸시 / 레트를 피하고 mov / jmp reg로 대체합니다.
테스트 및 작동
Word / Excel 2016-32 비트 버전 .
Word / Excel 2016-64 비트 버전 .
작동 원리
위와 동일한 유형의 새 파일을 작성하고이 코드를 Module1에 저장 하십시오.
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
이 코드를 Module2에 붙여 넣고 실행하십시오.
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
당신의 블록의 경우
CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX"
당신 '알려진 비밀'파일이 올바른 길이에 도달하기 위해 0을 후행과의 진수 문자열 '알 수없는 비밀'파일의 기존 블록, 패드보다 짧습니다.
예 :
CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"
알 수없는 비밀번호 파일에서
CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000"
파일 길이를 유지합니다.
또한 office 2007에서 .XLA (97/2003 형식) 파일로 작업했습니다.
Excel 2007 이후에는 파일 확장자를 .zip으로 변경해야합니다. 아카이브에는 하위 폴더 xl이 있으며 여기에는 vbaProject.bin이 있습니다. vbaProject.bin으로 위의 단계를 수행 한 후 다시 아카이브에 저장하십시오. 확장 기능을 다시 수정하십시오! (위의 단계를 따르십시오)
Access, Excel, Powerpoint 또는 Word 문서 ( 2007, 2010, 2013 or 2016
확장자가있는 버전 .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM
)의 VBA 프로젝트 암호는 쉽게 제거 할 수 있습니다 .
파일 이름 확장명을로 변경하고 파일의 .ZIP
압축을 풀고 기본 16 진수 편집기 (예 : XVI32 )를 사용하여 기존 암호를 "중단"하면 Office가 "혼동"되므로 다음에 파일을 다시 시작할 때 새 암호를 입력하라는 메시지가 표시됩니다. 열었다.
.ZIP
확장자를 갖도록 파일 이름을 바꿉니다 .ZIP
로 이동하십시오 XL
.vbaProject.bin
16 진 편집기로 추출 하여여십시오DPB
되었습니다 DPX
..bin
파일을 zip에 다시 넣은 다음 일반 확장명으로 되돌리고 일반 파일처럼 엽니 다.VBA Project Properties
.Protection
탭, 새 비밀번호를 설정합니다.OK
하고 파일을 닫은 후 다시 열고 ALT + F11을 누르십시오.이 시점에서 원하는 경우 비밀번호를 완전히 제거 할 수 있습니다.
전체 지침 단계별 비디오는 내가 만든 "때 방법은 다시" 에있는 유튜브 여기 .
이 해결 방법이 수년 동안 존재 해 왔으며 Microsoft가이 문제를 해결하지 않은 것은 충격적입니다.
이 이야기의 교훈?
마이크로 소프트 오피스 VBA 프로젝트 암호가 있습니다 에 의존 할 수 없습니다 의 보안을 위해 모든 민감한 정보 . 보안이 중요한 경우 타사 암호화 소프트웨어를 사용하십시오.
Colin Pickard는 대부분 정확하지만 전체 파일에 대한 "열기 암호"보호와 VBA 암호 보호를 혼동하지 마십시오. VBA 암호 보호는 전자와 완전히 다르며 Office 2003 및 2007과 동일합니다 (Office 2007의 경우 이름 바꾸기). .zip 파일을 찾고 zip 내부의 vbaProject.bin을 찾으십시오. 기술적으로 파일을 편집하는 올바른 방법은 CFX와 같은 OLE 복합 문서 뷰어를 사용하여 올바른 스트림을 여는 것입니다. 물론 바이트를 바꾸는 경우 일반 이진 편집기가 작동 할 수 있습니다.
BTW, 이러한 필드의 정확한 형식에 대해 궁금한 경우 지금 문서화되어 있습니다.
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 컨테이너 크기 문제를 방지합니다.
위의 솔루션 중 일부를 시도했지만 그중 어느 것도 나를 위해 작동하지 않습니다 (excel 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
Tom-바이트 크기를 보지 않고 처음에는 남학생 오류가 발생했으며 대신 "CMG"설정에서 후속 항목으로 복사하여 붙여 넣었습니다. 이것은 두 파일 사이의 두 가지 다른 텍스트 크기였으며 Stewbob이 경고 한 것처럼 VBA 프로젝트를 잃었습니다.
HxD를 사용하면 선택한 파일의 양을 추적하는 카운터가 있습니다. 카운터가 8F (16 진수 16 진수)를 읽을 때까지 복사 한 파일을 붙여 넣을 때 CMG에서 복사-붙여 넣기가 끝날 때 "..."의 두 배로 끝났습니다. 어쨌든 이상하게 보였고 거의 느꼈습니다. 부자연 스럽지만 효과가있었습니다.
중요한지 모르겠지만 Excel에서 파일을 다시 열기 전에 16 진 편집기와 Excel을 모두 종료했는지 확인했습니다. 그런 다음 메뉴를 통해 VB 편집기를 열고 VBProject 속성으로 이동 한 다음 '새'비밀번호를 입력하여 코드 잠금을 해제해야했습니다.
이게 도움이 되길 바란다.
Windows 10 컴퓨터의 Excel 2016 64 비트의 경우 16 진수 편집기를 사용하여 보호 된 xla의 암호를 변경할 수 있습니다 (다른 확장 프로그램에서는 테스트하지 않았습니다). 팁: 이 작업을 수행하기 전에 백업을 만드십시오.
내가 취한 단계 :
이것이 여러분의 도움이 되었기를 바랍니다!
당신이 일하는 경우 Java
시도 할 수 있습니다 VBAMacroExtractor
. VBA 스크립트를 추출한 후 .xlsm
일반 텍스트의 비밀번호를 찾았습니다.