Poproszono mnie o aktualizację niektórych makr programu Excel 2003, ale projekty VBA są chronione hasłem i wygląda na to, że brakuje dokumentacji ... nikt nie zna haseł.
Czy istnieje sposób na usunięcie lub złamanie hasła w projekcie VBA?
Poproszono mnie o aktualizację niektórych makr programu Excel 2003, ale projekty VBA są chronione hasłem i wygląda na to, że brakuje dokumentacji ... nikt nie zna haseł.
Czy istnieje sposób na usunięcie lub złamanie hasła w projekcie VBA?
Odpowiedzi:
Możesz wypróbować to bezpośrednie VBA
podejście, które nie wymaga edycji HEX. Będzie działać dla wszystkich plików (* .xls, * .xlsm, * .xlam ...).
Testowany i działa na:
Excel 2007
Excel 2010
Excel 2013 - wersja 32-bitowa
Excel 2016 - wersja 32-bitowa
Szukasz wersji 64-bitowej? Zobacz tę odpowiedź
Postaram się jak najlepiej wyjaśnić, jak to działa - proszę wybaczyć mój angielski.
Najpierw wykonaj kopię zapasową plików!
Utwórz nowy plik xlsm i zapisz ten kod w 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
Wklej ten kod pod powyższym kodem w Module1 i uruchom go
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
Wróć do swoich projektów VBA i ciesz się.
Tak, pod warunkiem, że używasz .xls
arkusza kalkulacyjnego formatu (ustawienie domyślne dla programu Excel do 2003 r.). W programie Excel 2007 i późniejszym ustawieniem domyślnym jest .xlsx
dość bezpieczny format i ta metoda nie będzie działać.
Jak mówi Treb, jest to proste porównanie. Jedną z metod jest po prostu zamiana hasła w pliku za pomocą edytora szesnastkowego (patrz Edytory szesnastkowe dla systemu Windows ). Przykład krok po kroku:
Skopiuj linie zaczynając od następujących kluczy:
CMG=....
DPB=...
GC=...
PIERWSZA KOPIA plik Excel, dla którego nie znasz hasła VBA, a następnie otwórz go za pomocą edytora szesnastkowego i wklej powyższe skopiowane linie z pliku fikcyjnego.
Jeśli potrzebujesz pracować z programem Excel 2007 lub 2010, poniżej znajdziesz kilka innych odpowiedzi, w szczególności: 1 , 2 , 3 .
EDYCJA Luty 2015: dla innej metody, która wygląda bardzo obiecująco, spójrz na nową odpowiedź Đức Thanh Nguyguna.
CMG...
ciąg jest dłuższy niż oryginał.
Zbudowałem na podstawie fantastycznej odpowiedzi Đức Thanh Nguyễna, aby umożliwić tej metodzie działanie z 64-bitowymi wersjami programu Excel. Korzystam z programu Excel 2010 64-bit na 64-bitowym systemie Windows 7.
Utwórz nowy plik xlsm i zapisz ten kod w 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
Wklej ten kod w Module2 i uruchom go
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
WYŁĄCZENIE ODPOWIEDZIALNOŚCI To zadziałało dla mnie i udokumentowałem to tutaj w nadziei, że pomoże komuś pomóc. Nie w pełni go przetestowałem . Przed kontynuowaniem tej opcji należy zapisać wszystkie otwarte pliki.
Istnieje inne (nieco łatwiejsze) rozwiązanie bez problemów z rozmiarem. Zastosowałem to podejście dzisiaj (w pliku XLS 2003, używając programu Excel 2007) i odniosłem sukces.
DPB=...
częśćDPB=...
ciąg naDPx=...
* UWAGA: Upewnij się, że zmieniłeś hasło na nową wartość, w przeciwnym razie przy następnym otwarciu arkusza kalkulacyjnego Excel zgłosi błędy (nieoczekiwany błąd), a następnie, gdy uzyskasz dostęp do listy modułów VBA, zobaczysz teraz nazwy moduły źródłowe, ale pojawia się kolejny błąd podczas próby otwarcia formularzy / kodu / itp. Aby temu zaradzić, wróć do właściwości projektu VBA i ustaw hasło na nową wartość. Zapisz i ponownie otwórz dokument Excel i powinieneś już iść!
Colin Pickard ma doskonałą odpowiedź, ale jest jedno „uważaj”. Istnieją przypadki (jeszcze nie ustaliłem przyczyny), w których całkowita długość pozycji „CMG = ........ GC = ....” w pliku różni się od jednego pliku programu Excel do pliku Kolejny. W niektórych przypadkach ten wpis będzie miał 137 bajtów, a w innych 143 bajtów. Długość 137 bajtów jest nieparzysta, a jeśli tak się stanie, gdy utworzysz plik z hasłem „1234”, po prostu utwórz inny plik, który powinien przeskoczyć do długości 143 bajtów.
Jeśli spróbujesz wkleić niewłaściwą liczbę bajtów do pliku, stracisz swój projekt VBA podczas próby otwarcia pliku za pomocą programu Excel.
EDYTOWAĆ
Nie dotyczy to plików Excel 2007/2010. Standardowy format pliku .xlsx to tak naprawdę plik .zip zawierający liczne podfoldery z formatowaniem, układem, zawartością itp., Przechowywane jako dane xml. W przypadku niechronionego pliku Excel 2007 możesz po prostu zmienić rozszerzenie .xlsx na .zip, a następnie otworzyć plik zip i przejrzeć wszystkie dane xml. To bardzo proste.
Jednak po zabezpieczeniu hasłem pliku Excel 2007 cały plik .zip (.xlsx) jest w rzeczywistości szyfrowany przy użyciu szyfrowania RSA. Nie można już zmienić rozszerzenia na .zip i przeglądać zawartości pliku.
W przypadku typu .xlsm
lub .dotm
pliku musisz to zrobić nieco inaczej.
.xlsm
pliku na .zip
.vbaProject.bin
plik i otwórz go w edytorze heksadecymalnym (używam HxD , jest całkowicie darmowy i lekki).DPB
zamień DPx
i zapisz plik.vbaProject.bin
plik na nowy w spakowanym pliku..xlsm
..xlsm
plik.Warto zauważyć, że jeśli masz plik Excel 2007 (xlsm), możesz po prostu zapisać go jako plik Excel 2003 (xls) i użyć metod opisanych w innych odpowiedziach.
1.
przekonwertować .xlsm na .xls 2.
złamać kod .xls 3.
przekonwertować .xlsm na .xlsx 4.
Umieść kod z modułów w .xls na. xlsx i zapisz to jako .xlsm
Z moją koleją, jest to oparte na doskonałej odpowiedzi kaybee99, która jest oparta na fantastycznej odpowiedzi Đức Thanh Nguyễn, aby pozwolić tej metodzie działać zarówno z wersjami pakietu Office x86, jak i amd64.
Przegląd tego, co zostało zmienione, unikamy push / ret, który jest ograniczony do 32-bitowych adresów i zastępujemy go mov / jmp reg.
Testowane i działa na
Word / Excel 2016 - wersja 32-bitowa .
Word / Excel 2016 - wersja 64-bitowa .
jak to działa
Utwórz nowy plik tego samego typu co powyżej i zapisz ten kod w 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
Wklej ten kod w Module2 i uruchom go
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
Czy próbowałeś po prostu otworzyć je w OpenOffice.org?
Miałem podobny problem jakiś czas temu i okazało się, że Excel i Calc nie rozumieli się nawzajem w szyfrowaniu i dlatego umożliwili bezpośredni dostęp do prawie wszystkiego.
To było jakiś czas temu, więc jeśli nie byłby to zwykły przypadek z mojej strony, to również mógł zostać załatany.
W przypadku, gdy Twój blok
CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX"
w pliku „znanego hasła” jest krótszy niż istniejący blok w pliku „nieznanego hasła”, uzupełnij ciąg szesnastkowy zerowymi końcami, aby osiągnąć prawidłową długość.
na przykład
CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"
w pliku nieznanego hasła należy ustawić na
CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000"
aby zachować długość pliku.
Miałem to również do pracy z plikami .XLA (format 97/2003) w pakiecie Office 2007.
W przypadku programu Excel 2007 musisz zmienić rozszerzenie pliku na .zip W archiwum znajduje się podfolder xl, w którym znajduje się vbaProject.bin. Wykonaj powyższy krok za pomocą vbaProject.bin, a następnie zapisz go z powrotem w archiwum. Zmodyfikuj swoje rozszerzenie i voilà! (co oznacza wykonaj powyższe kroki)
Hasła projektu VBA do dokumentów Access, Excel, Powerpoint lub Word ( 2007, 2010, 2013 or 2016
wersje z rozszerzeniami .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM
) można łatwo usunąć .
Wystarczy zmienić rozszerzenie nazwy pliku .ZIP
, rozpakować plik i użyć dowolnego podstawowego edytora heksadecymalnego (takiego jak XVI32 ), aby „złamać” istniejące hasło, co „myli” Office, więc monituje o nowe hasło przy następnym pliku otwierany.
.ZIP
rozszerzenie.ZIP
i przejdź do XL
folderu.vbaProject.bin
i otwórz go za pomocą edytora heksadecymalnegoDPB
na DPX
..bin
plik z powrotem w zipie, przywróć normalne rozszerzenie i otwórz plik jak zwykle.VBA Project Properties
.Protection
karcie Ustaw nowe hasło.OK
, zamknij plik, otwórz go ponownie, naciśnij ALT + F11.W tym momencie możesz całkowicie usunąć hasło, jeśli chcesz.
Wykonaj instrukcje wraz z filmem krok po kroku, który zrobiłem „dawno temu, kiedy” jest na YouTube tutaj .
To trochę szokujące, że to obejście istniało od lat, a Microsoft nie naprawił tego problemu.
Morał tej historii?
Nie można powoływać się na hasła Microsoft Office VBA Project dla bezpieczeństwa jakichkolwiek poufnych informacji . Jeśli bezpieczeństwo jest ważne, użyj oprogramowania szyfrującego innej firmy.
Colin Pickard jest w większości poprawny, ale nie mylić ochrony „hasłem, aby otworzyć” dla całego pliku z ochroną hasłem VBA, która jest zupełnie inna od poprzedniej i jest taka sama dla Office 2003 i 2007 (dla Office 2007, zmień nazwę plik do .zip i poszukaj vbaProject.bin wewnątrz zip). I technicznie poprawnym sposobem edycji pliku jest użycie złożonej przeglądarki dokumentów OLE, takiej jak CFX, aby otworzyć właściwy strumień. Oczywiście, jeśli zastępujesz bajty, zwykły stary edytor binarny może działać.
BTW, jeśli zastanawiasz się nad dokładnym formatem tych pól, mają je teraz udokumentowane:
http://msdn.microsoft.com/en-us/library/dd926151%28v=office.12%29.aspx
Jeśli plik jest prawidłowym plikiem zip (kilka pierwszych bajtów jest 50 4B
używanych w formatach takich jak .xlsm
), rozpakuj plik i poszukaj podtekstu xl/vbaProject.bin
. Jest to plik CFB, podobnie jak .xls
pliki. Postępuj zgodnie z instrukcjami dla formatu XLS (zastosowanego do podtekstu), a następnie po prostu skompresuj zawartość.
W przypadku formatu XLS możesz zastosować inne metody opisane w tym poście. Osobiście wolę wyszukiwanie DPB=
bloku i zastępowanie tekstu
CMG="..."
DPB="..."
GC="..."
z pustymi spacjami. Pozwala to uniknąć problemów z rozmiarem kontenera CFB.
Wypróbowałem niektóre z powyższych rozwiązań i żadne z nich nie działa dla mnie (plik Excel xlsm 2007). Potem znalazłem inne rozwiązanie, które nawet odzyskuje hasło, a nie tylko je łamie.
Włóż ten kod do modułu, uruchom go i daj mu trochę czasu. Odzyska twoje hasło brutalną siłą.
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 tworzy produkty Advanced Office Password Breaker i Advanced Office Password Recovery , które mogą mieć zastosowanie w tym przypadku, o ile dokument został utworzony w pakiecie Office 2007 lub wcześniejszym.
Tom - początkowo popełniłem błąd ucznia, ponieważ nie oglądałem wielkości bajtu, a zamiast tego skopiowałem i wkleiłem z zestawu „CMG” do następnego wpisu. Były to jednak dwa różne rozmiary tekstu między tymi dwoma plikami i straciłem projekt VBA, tak jak ostrzegał Stewbob.
Używając HxD, istnieje licznik śledzący, ile plików wybierasz. Kopiuj, zaczynając od CMG, aż licznik odczyta 8F (hex dla 143) i podobnie podczas wklejania do zablokowanego pliku - skończyłem z podwójną liczbą „...” na końcu pasty, która wyglądała dziwnie i wydawała się prawie nienaturalne, ale zadziałało.
Nie wiem, czy jest to kluczowe, ale upewniłem się, że zamknąłem zarówno edytor szesnastkowy, jak i celowałem przed ponownym otwarciem pliku w Excelu. Następnie musiałem przejść przez menu, aby otworzyć edytor VB, przejść do właściwości VBProject i wprowadzić „nowe” hasło, aby odblokować kod.
Mam nadzieję, że to pomoże.
Moje narzędzie, VbaDiff , odczytuje VBA bezpośrednio z pliku, dzięki czemu można go użyć do odzyskania chronionego kodu VBA z większości dokumentów biurowych bez uciekania się do edytora szesnastkowego.
Ochrona to proste porównanie tekstu w programie Excel. Załaduj program Excel do swojego ulubionego debugera ( moim wyborem jest Ollydbg ), znajdź kod, który dokonuje porównania i napraw go, aby zawsze zwracał wartość true, co powinno umożliwić dostęp do makr.
W przypadku programu Excel 2016 64-bitowego na komputerze z systemem Windows 10 użyłem edytora szesnastkowego, aby móc zmienić hasło chronionego pliku Xla (nie testowałem tego pod kątem żadnych innych rozszerzeń). Wskazówka: utwórz kopię zapasową, zanim to zrobisz.
Kroki, które podjąłem:
Mam nadzieję, że to pomogło niektórym z was!
rozszerzenie pliku Excela zmienia się na xml. I otwórz go w notatniku. tekst hasła znajdź w pliku xml.
widzisz jak poniżej linii;
Sheets("Sheet1").Unprotect Password:="blabla"
(Przepraszam za mój zły angielski)
Jeśli pracujesz Java
, możesz spróbować VBAMacroExtractor
. Po wypakowaniu skryptów VBA .xlsm
znalazłem tam hasło w postaci zwykłego tekstu.