Bazı Excel 2003 makrolarını güncellemem istendi, ancak VBA projeleri şifre korumalı ve dokümantasyon eksikliği var gibi görünüyor ... kimse şifreleri bilmiyor.
Bir VBA projesinde şifreyi kaldırmanın veya kırmanın bir yolu var mı?
Bazı Excel 2003 makrolarını güncellemem istendi, ancak VBA projeleri şifre korumalı ve dokümantasyon eksikliği var gibi görünüyor ... kimse şifreleri bilmiyor.
Bir VBA projesinde şifreyi kaldırmanın veya kırmanın bir yolu var mı?
Yanıtlar:
VBA
HEX düzenlemesi gerektirmeyen bu doğrudan yaklaşımı deneyebilirsiniz . Herhangi bir dosya için çalışır (* .xls, * .xlsm, * .xlam ...).
Test edildi ve üzerinde çalışıyor:
Excel 2007
Excel 2010
Excel 2013 - 32 bit sürüm
Excel 2016 - 32 bit sürüm
64 bit sürümü mü arıyorsunuz? Bu cevaba bakın
Nasıl çalıştığını açıklamak için elimden geleni yapacağım - lütfen İngilizcemi affedin.
Lütfen önce dosyalarınızı yedekleyin!
Yeni bir xlsm dosyası oluşturun ve bu kodu Module1 içinde saklayın
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
Bu kodu Modül1'deki yukarıdaki kodun altına yapıştırın ve çalıştırın
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
VBA Projelerinize geri dönün ve tadını çıkarın.
Evet, bir .xls
biçim elektronik tablosu kullandığınız sürece (Excel için 2003'e kadar varsayılan). Excel 2007'den itibaren, varsayılan değer .xlsx
, oldukça güvenli bir biçimdir ve bu yöntem çalışmaz.
Treb'in dediği gibi, basit bir karşılaştırma. Yöntemlerden biri, onaltılık bir düzenleyici kullanarak dosyadaki parola girişini değiştirmektir (bkz . Windows için Hex editörleri ). Adım adım örnek:
Aşağıdaki tuşlarla başlayan satırları kopyalayın:
CMG=....
DPB=...
GC=...
İLK YEDEKLEME , VBA şifresini bilmediğiniz excel dosyasını, sonra hex düzenleyicinizle açın ve kopyalanan yukarıdaki satırları kukla dosyadan yapıştırın.
Excel 2007 veya 2010 ile çalışmanız gerekiyorsa, aşağıda yardımcı olabilecek başka yanıtlar da vardır, özellikle de bunlar: 1 , 2 , 3 .
EDIT Şubat 2015: Çok umut verici görünen başka bir yöntem için Đức Thanh Nguyễn'ın bu yeni cevabına bakın .
CMG...
dize orijinalden daha uzunsa , dosyanın uzunluğunu güvenli bir şekilde artırabileceğinizi belirtmek gerekir .
Bu yöntemin Excel'in 64 bit sürümleriyle çalışmasına izin vermek için Đ -c Thanh Nguyễn'ın harika cevabını temel aldım. 64-Bit Windows 7'de Excel 2010 64-Bit çalıştırıyorum.
Yeni bir xlsm dosyası oluşturun ve bu kodu Module1 içinde saklayın
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
Bu kodu Modül2'ye yapıştırın ve çalıştırın
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
YASAL UYARI Bu benim için çalıştı ve ben burada birine yardım etmek umuduyla belgeledim. Tam olarak test etmedim . Bu seçeneğe devam etmeden önce lütfen tüm açık dosyaları kaydettiğinizden emin olun.
Boyut problemleri olmadan başka (biraz daha kolay) bir çözüm var. Bu yaklaşımı bugün (Excel 2007 kullanarak 2003 XLS dosyasında) kullandım ve başarılı oldum.
DPB=...
parçayı bulunDPB=...
dizeDPx=...
* NOT: Parolayı yeni bir değere değiştirdiğinizden emin olun, aksi takdirde elektronik tabloyu bir sonraki açışınızda Excel hataları bildirir (Beklenmeyen Hata), daha sonra VBA modülleri listesine eriştiğinizde artık kaynak modülleri ancak formları / kodu / vb. açmaya çalışırken başka bir hata alırsınız. Bunu düzeltmek için VBA Proje Özellikleri'ne geri dönün ve parolayı yeni bir değere ayarlayın. Excel belgesini kaydedip yeniden açın ve gitmek için iyi olmalısınız!
Colin Pickard'ın mükemmel bir cevabı var, ama bununla bir 'dikkat et' var. Dosyadaki "CMG = ........ GC = ...." girişinin toplam uzunluğunun bir excel dosyasından farklı olduğu durumlar (henüz sebebini anlayamadım) vardır. Sonraki. Bazı durumlarda, bu girdi 137 bayt, diğerlerinde 143 bayt olacaktır. 137 bayt uzunluğu tuhaf olanıdır ve eğer bu dosyayı '1234' şifresiyle oluşturduğunuzda gerçekleşirse, sadece başka bir dosya oluşturun ve 143 bayt uzunluğuna atlaması gerekir.
Dosyaya yanlış sayıda bayt yapıştırmaya çalışırsanız, dosyayı Excel ile açmaya çalıştığınızda VBA projenizi kaybedersiniz.
DÜZENLE
Bu, Excel 2007/2010 dosyaları için geçerli değildir. Standart .xlsx dosya biçimi aslında xml veri olarak depolanan biçimlendirme, düzen, içerik vb. Sayısız alt klasör içeren bir .zip dosyasıdır. Korumasız bir Excel 2007 dosyası için .xlsx uzantısını .zip olarak değiştirebilir, sonra zip dosyasını açıp tüm xml verilerine bakabilirsiniz. Çok basit.
Ancak, bir Excel 2007 dosyasını parola ile koruduğunuzda, .zip (.xlsx) dosyasının tamamı aslında RSA şifrelemesi kullanılarak şifrelenir. Uzantıyı .zip olarak değiştirmek ve dosya içeriğine göz atmak artık mümkün değil.
Bir .xlsm
veya .dotm
dosya türü için bunu biraz farklı bir şekilde yapmanız gerekir.
.xlsm
Dosyanın uzantısını olarak değiştirin .zip
.vbaProject.bin
dosya ve bir Hex Editor açmak (kullandığım yxd , tamamen ücretsiz ve hafiftir.)DPB
ve değiştirin DPx
ve kaydedin.vbaProject.bin
Sıkıştırılmış dosyada eski dosyayı bu yeni ile değiştirin ..xlsm
..xlsm
dosyayı kaydedin .Bir Excel 2007 (xlsm) dosyanız varsa, bunu bir Excel 2003 (xls) dosyası olarak kaydedebileceğinizi ve diğer yanıtlarda özetlenen yöntemleri kullanabileceğinizi belirtmek gerekir.
1.
.xlsm'i .xls 2.
koduna 3.
dönüştürün .xls kodunu dönüştürün .xlsm'i .xlsx'e dönüştürün 4.
.xls içindeki modüllerden kodu koyun. xlsx ve bunu .xlsm olarak kaydet
Benim sıramla, kaybee99'un Đức Thanh Nguyễn'ın bu yöntemin Office'in hem x86 hem de amd64 sürümleriyle çalışmasına izin veren harika cevabı üzerine inşa edilen mükemmel cevabı üzerine kurulmuştur.
Nelerin değiştiğine genel bir bakış için, 32bit adreslerle sınırlı push / retten kaçınırız ve yerine mov / jmp reg.
Test edildi ve üzerinde çalışıyor
Word / Excel 2016 - 32 bit sürümü .
Word / Excel 2016 - 64 bit sürümü .
nasıl çalışır
Yukarıdakilerle aynı türde yeni bir dosya oluşturun ve bu kodu Modül1'de saklayın
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
Bu kodu Modül2'ye yapıştırın ve çalıştırın
Sub unprotected()
If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation, "*****"
End If
End Sub
Onları OpenOffice.org'da açmayı denediniz mi?
Bir süre önce benzer bir sorun yaşadım ve Excel ve Calc'un birbirlerinin şifrelemesini anlamadıklarını ve böylece hemen her şeye doğrudan erişime izin verdiğini buldum.
Bu bir süre önceydi, eğer bu sadece benim tarafımda bir fluke olmasaydı, yamalı olabilirdi.
Durumunda sizin bloğu olduğu
CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX"
için 'bilinen şifre' dosyasında doğru uzunluğa ulaşması sondaki sıfırlar ile onaltılık dizeleri 'bilinmeyen şifre' dosyada mevcut olan blok ped daha kısadır.
Örneğin
CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"
bilinmeyen şifre dosyasında,
CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000"
dosya uzunluğunu korumak için.
Ayrıca bu 2007 Office .XLA (97/2003 biçimi) dosyaları ile çalışma vardı.
Excel 2007'den itibaren dosya uzantısını .zip olarak değiştirmeniz gerekiyor Arşivde bir alt klasör xl var, orada vbaProject.bin bulacaksınız. Yukarıdaki adımı vbaProject.bin ile takip edin ve tekrar arşive kaydedin. Uzantınızı değiştirin ve voilà! (anlamı yukarıdaki adımları izleyin)
Access, Excel, Powerpoint veya Word belgelerindeki VBA Proje Parolaları ( 2007, 2010, 2013 or 2016
uzantılı sürümler .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM
) kolayca kaldırılabilir .
Dosya adı uzantısını değiştirmek .ZIP
, dosyayı açmak ve varolan şifreyi kırmak için herhangi bir temel Hex Düzenleyicisi'ni ( XVI32 gibi ) kullanmak, bu da dosyayı bir dahaki sefere yeni bir şifre isteyecek şekilde Office'i "karıştırır" açıldı.
.ZIP
uzantısı olacak şekilde dosyayı yeniden adlandırın .ZIP
ve XL
klasöre gidin .vbaProject.bin
ve bir Hex Editör ile açınDPB
için DPX
..bin
dosyayı tekrar zip'e yerleştirin, normal uzantısına geri döndürün ve dosyayı normal gibi açın.VBA Project Properties
.Protection
Yeni bir şifre belirleyin sekmesinde.OK
, dosyayı kapatın, yeniden açın, ALT + F11 tuşlarına basın.Bu noktada, isterseniz şifreyi tamamen kaldırabilirsiniz.
Komple talimatları adım adım video ile yaptığım "zaman yolu geri" Hangi YouTube burada .
Bu geçici çözümün yıllardır orada olması şaşırtıcı ve Microsoft sorunu çözmedi.
Hikayenin ahlakı?
Microsoft Office VBA Projesi şifreleri vardır güvenerek olmamak güvenliği için herhangi hassas bilgilerin . Güvenlik önemliyse, üçüncü taraf şifreleme yazılımı kullanın.
Colin Pickard çoğunlukla doğrudur, ancak "açmak için parola" korumasını, öncekinden tamamen farklı olan ve Office 2003 ve 2007 (Office 2007 için yeniden adlandırma) ile aynı olan VBA parola koruması ile karıştırmayın. dosyayı .zip dosyasına yerleştirin ve zip içindeki vbaProject.bin dosyasını arayın). Teknik olarak dosyayı düzenlemenin doğru yolu, doğru akışı açmak için CFX gibi bir OLE bileşik belge görüntüleyici kullanmaktır. Tabii ki, sadece baytları değiştiriyorsanız, düz eski ikili editör çalışabilir.
BTW, bu alanların tam biçimini merak ediyorsanız, şimdi bunları belgelendirdiler:
http://msdn.microsoft.com/en-us/library/dd926151%28v=office.12%29.aspx
Dosya geçerli bir zip dosyasıysa (ilk birkaç bayt 50 4B
- gibi biçimlerde kullanılır .xlsm
), dosyayı açın ve alt dosyayı arayın xl/vbaProject.bin
. Bu, tıpkı .xls
dosyalar gibi bir CFB dosyasıdır . XLS biçimi (alt dosyaya uygulanır) yönergelerini izleyin ve ardından içeriği sıkıştırın.
XLS biçimi için, bu gönderideki diğer yöntemlerden bazılarını takip edebilirsiniz. Şahsen DPB=
bloğu aramayı ve metni değiştirmeyi tercih ediyorum
CMG="..."
DPB="..."
GC="..."
boşluk ile arka plan. Bu, CFB kap boyutu sorunlarını ortadan kaldırır.
Yukarıdaki çözümlerden bazılarını denedim ve hiçbiri benim için çalışmıyor (excel 2007 xlsm dosyası). Sonra bile sadece çatlamak değil, şifre almak başka bir çözüm buldum.
Bu kodu modüle takın, çalıştırın ve biraz zaman tanıyın. Kaba kuvvetle şifrenizi kurtaracak.
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 , belge Office 2007 veya önceki sürümlerde oluşturulduğu sürece, bu durum için geçerli olabilecek Gelişmiş Office Password Breaker ve Advanced Office Password Recovery ürünlerini üretir .
Tom - Bayt boyutunu izlemediğim için başlangıçta bir okul çocuğu hatası yaptım ve bunun yerine kopyalayıp bir sonraki girişe ayarlanan "CMG" den yapıştırdım. Bu, iki dosya arasındaki iki farklı metin boyutuydu ve Stewbob'un uyardığı gibi VBA projesini kaybettim.
HxD'yi kullanarak, ne kadar dosya seçtiğinizi izleyen bir sayaç vardır. Sayaç 8F'yi (143 için altıgen) okuyana kadar CMG'den başlayarak ve aynı şekilde kilitli dosyaya yapıştırırken kopyaladım - macunun sonunda bir şekilde garip görünen ve neredeyse hissedilen iki kez "..." sayısıyla sonuçlandım. doğal olmayan, ama işe yaradı.
Çok önemli olup olmadığını bilmiyorum, ancak dosyayı Excel'de yeniden açmadan önce hem hex düzenleyiciyi kapattığımdan hem de mükemmelleştirdiğimden emin oldum. Daha sonra VB Düzenleyicisi'ni açmak için menülerden geçmek zorunda kaldım, VBProject Özellikleri'ne girdim ve kodun kilidini açmak için 'yeni' parolaya girdim.
Umarım bu yardımcı olur.
Aracım VbaDiff , VBA'yı doğrudan dosyadan okur, böylece bir hex editörüne başvurmadan çoğu ofis belgesinden korumalı VBA kodunu kurtarmak için kullanabilirsiniz.
Bir Windows 10 makinesinde Excel 2016 64 bit için, korumalı bir xla'nın parolasını değiştirmek için bir onaltılık düzenleyici kullandım (bunu başka herhangi bir uzantı için test etmedim). İpucu: Bunu yapmadan önce bir yedek oluşturun.
Attığım adımlar:
Umarım bu bazılarınıza yardımcı olmuştur!
excel dosyanızın uzantısı xml olarak değişir. Ve not defterinde açın. şifre metni xml dosyasında bulabilirsiniz.
aşağıdaki satır gibi görüyorsunuz;
Sheets("Sheet1").Unprotect Password:="blabla"
(kötü ingilizcem için özür dilerim)
Eğer çalışıyorsanız Java
deneyebilirsiniz VBAMacroExtractor
. VBA komut dosyalarını çıkardıktan sonra .xlsm
düz metin olarak şifre buldum.