Tôi đã được yêu cầu cập nhật một số macro Excel 2003, nhưng các dự án VBA được bảo vệ bằng mật khẩu và dường như thiếu tài liệu ... không ai biết mật khẩu.
Có cách nào để xóa hoặc bẻ khóa mật khẩu trong dự án VBA không?
Tôi đã được yêu cầu cập nhật một số macro Excel 2003, nhưng các dự án VBA được bảo vệ bằng mật khẩu và dường như thiếu tài liệu ... không ai biết mật khẩu.
Có cách nào để xóa hoặc bẻ khóa mật khẩu trong dự án VBA không?
Câu trả lời:
Bạn có thể thử VBA
phương pháp trực tiếp này không yêu cầu chỉnh sửa HEX. Nó sẽ hoạt động cho mọi tệp (* .xls, * .xlsm, * .xlam ...).
Đã thử nghiệm và hoạt động trên:
Excel 2007
Excel 2010
Excel 2013 - phiên bản 32 bit
Excel 2016 - phiên bản 32 bit
Tìm kiếm phiên bản 64 bit? Xem câu trả lời này
Tôi sẽ cố gắng hết sức để giải thích cách nó hoạt động - xin vui lòng xin lỗi tiếng Anh của tôi.
Vui lòng sao lưu các tập tin của bạn đầu tiên!
Tạo một tệp xlsm mới và lưu trữ mã này trong 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
Dán mã này theo mã trên trong Module1 và chạy nó
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
Quay trở lại Dự án VBA của bạn và tận hưởng.
Có, miễn là bạn đang sử dụng .xls
bảng tính định dạng (mặc định cho Excel cho đến 2003). Đối với Excel 2007 trở đi, mặc định là .xlsx
định dạng khá an toàn và phương pháp này sẽ không hoạt động.
Như Treb nói, đó là một so sánh đơn giản. Một phương pháp là chỉ cần trao đổi mục nhập mật khẩu trong tệp bằng trình chỉnh sửa hex (xem trình soạn thảo Hex cho Windows ). Từng bước ví dụ:
Sao chép các dòng bắt đầu bằng các phím sau:
CMG=....
DPB=...
GC=...
FIRST BACKUP tệp excel mà bạn không biết mật khẩu VBA, sau đó mở nó bằng trình soạn thảo hex của bạn và dán các dòng được sao chép ở trên từ tệp giả.
Nếu bạn cần làm việc với Excel 2007 hoặc 2010, có một số câu trả lời khác bên dưới có thể giúp ích, đặc biệt là: 1 , 2 , 3 .
EDIT tháng 2 năm 2015: đối với một phương pháp khác có vẻ rất hứa hẹn, hãy xem câu trả lời mới này của Đức Thanh Nguyễn.
CMG...
chuỗi mới dài hơn bản gốc.
Tôi đã dựa trên câu trả lời tuyệt vời của Đức Thanh Nguyễn để cho phép phương pháp này hoạt động với các phiên bản 64 bit của Excel. Tôi đang chạy Excel 2010 64-bit trên Windows 7 64-bit.
Tạo một tệp xlsm mới và lưu trữ mã này trong 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
Dán mã này vào Module2 và chạy nó
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
TUYÊN BỐ TỪ CHỐI Điều này làm việc cho tôi và tôi đã ghi lại nó ở đây với hy vọng nó sẽ giúp được ai đó. Tôi chưa kiểm tra đầy đủ . Hãy chắc chắn lưu tất cả các tệp đang mở trước khi tiếp tục với tùy chọn này.
Có một giải pháp khác (có phần dễ dàng hơn), không có vấn đề kích thước. Tôi đã sử dụng phương pháp này ngày hôm nay (trên tệp XLS 2003, sử dụng Excel 2007) và đã thành công.
DPB=...
phầnDPB=...
chuỗi thànhDPx=...
* LƯU Ý: Đảm bảo rằng bạn đã thay đổi mật khẩu thành giá trị mới, nếu không, lần sau khi bạn mở bảng tính, Excel sẽ báo lỗi (Lỗi không mong muốn), sau đó khi bạn truy cập danh sách các mô-đun VBA, bạn sẽ thấy tên của mô-đun nguồn nhưng nhận được một lỗi khác khi cố gắng mở biểu mẫu / mã / vv. Để khắc phục điều này, hãy quay lại Thuộc tính dự án VBA và đặt mật khẩu thành một giá trị mới. Lưu và mở lại tài liệu Excel và bạn sẽ thấy ổn!
Colin Pickard có một câu trả lời tuyệt vời, nhưng có một câu 'coi chừng' với điều này. Có những trường hợp (tôi chưa tìm ra nguyên nhân) trong đó tổng chiều dài của mục "CMG = ........ GC = ...." trong tệp khác với một tệp excel đến kế tiếp. Trong một số trường hợp, mục nhập này sẽ là 137 byte và trong những trường hợp khác, nó sẽ là 143 byte. Độ dài 137 byte là số lẻ và nếu điều này xảy ra khi bạn tạo tệp của mình bằng mật khẩu '1234', chỉ cần tạo một tệp khác và nó sẽ nhảy đến độ dài 143 byte.
Nếu bạn cố dán sai số byte vào tệp, bạn sẽ mất dự án VBA khi bạn cố mở tệp bằng Excel.
BIÊN TẬP
Điều này không hợp lệ cho các tệp Excel 2007/2010. Định dạng tệp .xlsx tiêu chuẩn thực sự là một tệp .zip chứa nhiều thư mục con với định dạng, bố cục, nội dung, v.v., được lưu dưới dạng dữ liệu xml. Đối với tệp Excel 2007 không được bảo vệ, bạn chỉ cần thay đổi phần mở rộng .xlsx thành .zip, sau đó mở tệp zip và xem qua tất cả dữ liệu xml. Nó rất đơn giản.
Tuy nhiên, khi mật khẩu của bạn bảo vệ tệp Excel 2007, toàn bộ tệp .zip (.xlsx) thực sự được mã hóa bằng mã hóa RSA. Không thể thay đổi phần mở rộng thành .zip và duyệt nội dung tệp.
Đối với một loại .xlsm
hoặc .dotm
tệp bạn cần thực hiện theo một cách hơi khác.
.xlsm
tập tin thành .zip
.vbaProject.bin
tập tin và mở nó trong Hex Editor (Tôi sử dụng HxD , nó hoàn toàn miễn phí và nhẹ.)DPB
và thay thế bằng DPx
và lưu tệp.vbaProject.bin
tệp cũ bằng tệp mới này trong tệp nén..xlsm
..xlsm
tệp.Thật đáng để chỉ ra rằng nếu bạn có tệp Excel 2007 (xlsm), thì bạn chỉ cần lưu tệp đó dưới dạng tệp Excel 2003 (xls) và sử dụng các phương pháp được nêu trong các câu trả lời khác.
1.
convert .xlsm sang .xls 2.
bẻ khóa mã của .xls 3.
convert .xlsm sang .xlsx 4.
Đặt mã từ mô-đun vào .xls sang. xlsx và lưu nó dưới dạng .xlsm
Đến lượt tôi, điều này được xây dựng dựa trên câu trả lời tuyệt vời của kaybee99, được xây dựng dựa trên câu trả lời tuyệt vời của Đức Thanh Nguyễn để cho phép phương pháp này hoạt động với cả hai phiên bản Office x86 và amd64.
Tổng quan về những gì được thay đổi, chúng tôi tránh đẩy / ret bị giới hạn ở địa chỉ 32 bit và thay thế bằng reg / jmp reg.
Đã thử nghiệm và hoạt động trên
Word / Excel 2016 - Phiên bản 32 bit .
Word / Excel 2016 - Phiên bản 64 bit .
làm thế nào nó hoạt động
Tạo một tệp mới với cùng loại như trên và lưu mã này trong 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
Dán mã này vào Module2 và chạy nó
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
Bạn đã thử chỉ đơn giản là mở chúng trong OpenOffice.org?
Tôi đã có một vấn đề tương tự một thời gian trước đây và thấy rằng Excel và Calc không hiểu mã hóa của nhau và vì vậy cho phép truy cập trực tiếp vào mọi thứ.
Đây là một thời gian trước đây, vì vậy nếu đó không chỉ là một con sán về phía tôi thì nó cũng có thể đã được vá.
Trong trường hợp khối của
CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX"
bạn trong tệp 'mật khẩu đã biết' của bạn ngắn hơn khối hiện có trong tệp 'mật khẩu không xác định', hãy đệm các chuỗi hex của bạn bằng các số 0 ở cuối để đạt độ dài chính xác.
ví dụ
CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"
trong tệp mật khẩu không xác định, nên được đặt thành
CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000"
để bảo toàn chiều dài tập tin.
Tôi cũng đã làm việc với các tệp .XLA (định dạng 97/2003) trong office 2007.
Đối với Excel 2007 trở đi, bạn cần thay đổi phần mở rộng tệp của mình thành .zip Trong kho lưu trữ có một thư mục con xl, trong đó bạn sẽ tìm thấy vbaProject.bin. Thực hiện theo bước trên với vbaProject.bin sau đó lưu lại trong kho lưu trữ. Sửa đổi lại phần mở rộng của bạn và voilà! (có nghĩa là làm theo các bước ở trên)
Mật khẩu dự án VBA trên các tài liệu Access, Excel, Powerpoint hoặc Word ( 2007, 2010, 2013 or 2016
phiên bản có phần mở rộng .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM
) có thể dễ dàng bị xóa .
Đó chỉ đơn giản là vấn đề thay đổi phần mở rộng tên tệp thành .ZIP
, giải nén tệp và sử dụng bất kỳ Trình soạn thảo Hex cơ bản nào (như XVI32 ) để "phá vỡ" mật khẩu hiện có, điều này "gây nhầm lẫn" cho Office để nhắc mật khẩu mới vào lần tới đã mở.
.ZIP
phần mở rộngZIP
và đi đến XL
thư mục.vbaProject.bin
và mở nó với Hex EditorDPB
thành DPX
..bin
tệp trở lại vào zip, đưa nó trở lại phần mở rộng bình thường và mở tệp như bình thường.VBA Project Properties
.Protection
tab, Đặt mật khẩu mới.OK
, Đóng tệp, Mở lại tệp, nhấn ALT + F11.Tại thời điểm này, bạn có thể xóa hoàn toàn mật khẩu nếu bạn chọn.
Hướng dẫn đầy đủ với video từng bước tôi đã thực hiện "quay lại khi nào" trên YouTube tại đây .
Thật sốc khi cách giải quyết này đã tồn tại trong nhiều năm và Microsoft đã không khắc phục vấn đề này.
Noi dung chinh cua cau chuyen?
Mật khẩu Dự án Microsoft Office VBA không được dựa vào để bảo mật bất kỳ thông tin nhạy cảm nào . Nếu bảo mật là quan trọng, hãy sử dụng phần mềm mã hóa của bên thứ ba.
Colin Pickard hầu hết là chính xác, nhưng đừng nhầm lẫn bảo vệ "mật khẩu để mở" cho toàn bộ tệp với bảo vệ mật khẩu VBA, hoàn toàn khác với trước đây và giống với Office 2003 và 2007 (đối với Office 2007, đổi tên tệp vào .zip và tìm vbaProject.bin bên trong zip). Và về mặt kỹ thuật, cách chính xác để chỉnh sửa tệp là sử dụng trình xem tài liệu ghép OLE như CFX để mở luồng chính xác. Tất nhiên, nếu bạn chỉ thay thế byte, trình soạn thảo nhị phân cũ đơn giản có thể hoạt động.
BTW, nếu bạn đang tự hỏi về định dạng chính xác của các trường này, thì chúng đã được ghi lại ngay bây giờ:
http://msdn.microsoft.com/en-us/l Library / dd926151% 28v = office.12% 29.aspx
Nếu tệp là tệp zip hợp lệ (một vài byte đầu tiên 50 4B
- được sử dụng trong các định dạng như .xlsm
), sau đó giải nén tệp và tìm tệp con xl/vbaProject.bin
. Đây là một tệp CFB giống như các .xls
tệp. Làm theo các hướng dẫn cho định dạng XLS (áp dụng cho tập tin con) và sau đó chỉ cần nén nội dung.
Đối với định dạng XLS, bạn có thể làm theo một số phương pháp khác trong bài viết này. Cá nhân tôi thích tìm kiếm DPB=
khối và thay thế văn bản
CMG="..."
DPB="..."
GC="..."
với những khoảng trống. Điều này làm giảm các vấn đề kích thước container CFB.
Tôi đã thử một số giải pháp ở trên và không có giải pháp nào phù hợp với tôi (tệp xlsm excel 2007). Sau đó, tôi tìm thấy một giải pháp khác thậm chí lấy lại mật khẩu, không chỉ bẻ khóa nó.
Chèn mã này vào mô-đun, chạy nó và cho nó một chút thời gian. Nó sẽ khôi phục mật khẩu của bạn bằng vũ lực.
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
ElcomSoft tạo ra các sản phẩm Advanced Password Password Breaker và Advanced Office Password Recovery có thể áp dụng cho trường hợp này, miễn là tài liệu được tạo trong Office 2007 trở về trước.
Tom - Ban đầu tôi đã mắc một lỗi học sinh vì tôi không xem kích thước byte và thay vào đó tôi đã sao chép và dán từ "CMG" được thiết lập cho mục tiếp theo. Tuy nhiên, đây là hai kích cỡ văn bản khác nhau giữa hai tệp và tôi đã mất dự án VBA giống như Stewbob đã cảnh báo.
Sử dụng HxD, có một bộ đếm theo dõi số lượng tệp bạn đang chọn. Sao chép bắt đầu từ CMG cho đến khi bộ đếm đọc 8F (hex cho 143) và tương tự như vậy khi dán vào tệp bị khóa - Tôi đã kết thúc với số lượng gấp đôi "..." ở cuối dán, trông có vẻ kỳ lạ và gần như cảm thấy không tự nhiên, nhưng nó đã làm việc
Tôi không biết nó có quan trọng không, nhưng tôi chắc chắn rằng tôi đã đóng cả trình soạn thảo hex và excel xuống trước khi mở lại tệp trong Excel. Sau đó tôi đã phải đi qua các menu để mở VB Editor, vào VBProject Properties và nhập mật khẩu 'mới' để mở khóa mã.
Tôi hi vọng cái này giúp được.
Công cụ của tôi, VbaDiff , đọc VBA trực tiếp từ tệp, vì vậy bạn có thể sử dụng nó để khôi phục mã VBA được bảo vệ từ hầu hết các tài liệu văn phòng mà không cần dùng đến trình soạn thảo hex.
Đối với Excel 2016 64 bit trên máy Windows 10, tôi đã sử dụng trình chỉnh sửa hex để có thể thay đổi mật khẩu của xla được bảo vệ (chưa thử nghiệm điều này cho bất kỳ tiện ích mở rộng nào khác). Mẹo: tạo bản sao lưu trước khi bạn làm điều này.
Các bước tôi đã thực hiện:
Tôi hy vọng điều này đã giúp một số bạn!
phần mở rộng tệp excel của bạn thay đổi thành xml. Và mở nó trong notepad. mật khẩu tìm văn bản trong tập tin xml.
bạn thấy như dòng dưới đây;
Sheets("Sheet1").Unprotect Password:="blabla"
(Xin lỗi vì tiếng Anh của tôi không tốt)
Nếu bạn làm việc trong Java
bạn có thể cố gắng VBAMacroExtractor
. Sau khi trích xuất các tập lệnh VBA từ .xlsm
tôi đã tìm thấy mật khẩu trong bản rõ.