Excel VBA Projesinde şifreyi kırmanın bir yolu var mı?


486

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ı?


Bağlantınızdaki örneklerin önerdiği gibi, .xla yerine .xls olarak Farklı Kaydedebiliyor musunuz? Bunun bir fark yaratıp yaratmayacağından emin değilim.
B Hart

4
iyi bilinen: xlsb şifre kırma hilelerine karşı sağlam
Qbik

20
@ Fandango68 Bu soru yıllar önce meta üzerinde tartışıldı . TLDR: SO ile ilgili soruların birçoğu (en çok?) Kötü aktörler tarafından istismar edilebilir, ancak yanlış bir hata olduğuna dair açık bir kanıt yoksa, iyi niyetli olduğumuzu varsayarız. Bir VBA şifresini kırmak için birçok yasal ve etik neden vardır. Buna ek olarak, mevcut sistemlerin zayıflıklarının tartışılması nihayetinde gelecekte daha iyi güvenliğe katkıda bulunur ve insanların şu anda körü körüne güvensiz sistemlere güvenmelerini engeller.
jmbpiano

Yanıtlar:


700

VBAHEX 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ışır

Nasıl çalıştığını açıklamak için elimden geleni yapacağım - lütfen İngilizcemi affedin.

  1. VBE, parola iletişim kutusunu oluşturmak için bir sistem işlevini çağıracaktır.
  2. Kullanıcı doğru parolayı girip Tamam'ı tıklatırsa bu işlev 1 değerini döndürür. Kullanıcı yanlış parola girerse veya İptal'i tıklatırsa, bu işlev 0 değerini döndürür.
  3. İletişim kutusu kapatıldıktan sonra, VBE sistem işlevinin döndürülen değerini kontrol eder
  4. bu değer 1 ise, VBE parolanın doğru olduğunu "düşünecek", böylece kilitli VBA projesi açılacaktır.
  5. Aşağıdaki kod, şifre iletişim kutusunu görüntülemek için kullanılan orijinal işlevin belleğini, çağrıldığında her zaman 1 döndürecek olan kullanıcı tanımlı bir işlevle değiştirir.

Kodu kullanma

Lütfen önce dosyalarınızı yedekleyin!

  1. Kilitli VBA Projelerinizi içeren dosyaları açın
  2. 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
  3. 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
  4. VBA Projelerinize geri dönün ve tadını çıkarın.


4
@Chris kesinlikle haklısın. Çünkü Windows API işlevleri bu kodda win 32 için tanımlanmıştır.
Đức Thanh Nguyễn

8
Bunun nasıl çalıştığına dair bazı açıklamalar iyi olurdu.
Dennis G

20
Şimdi geriye kalan tek soru (bu etkileyici yöntemin mükemmel çalıştığını gördükten sonra), VBA projemi başkalarının bu
hack'i

6
Bu kod, VBA kodunun kilidini açmak için mükemmel çalışıyor, ancak bunu her kullandığımda, projeyi farklı bir parola ile yeniden korumamı engelliyor, başka biri bu sorunu yaşadı mı?
Matthew Bond

2
Excel modülündeki VBA projesini bozduğunu gördüm, bu yüzden tüm modülleri / sınıfları dışa aktarmak zorunda kaldım, sonra dosyayı xlsx (makro olmayan) olarak kaydettikten sonra dosyayı KAPATIN (aptal Excel), sonra tekrar açıp modülleri içe aktarın ve sınıf dosyalarından kodu kopyalayın. Bu noktada, VBA projesinde kendi şifremle dosyayı xlsm olarak kaydedebilirim.
BH

217

Evet, bir .xlsbiç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:

  1. Yeni bir basit excel dosyası oluşturun.
  2. VBA bölümünde basit bir şifre belirleyin (örneğin - 1234).
  3. Dosyayı kaydet ve çık. Sonra dosya boyutunu kontrol edin - Stewbob'un gotcha'sına bakın
  4. Yeni oluşturduğunuz dosyayı onaltılık düzenleyiciyle açın.
  5. Aşağıdaki tuşlarla başlayan satırları kopyalayın:

    CMG=....
    DPB=...
    GC=...
  6. İ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.

  7. Excel dosyasını kaydedin ve çıkın.
  8. Şimdi, VBA kodunu görmeniz gereken excel dosyasını açın. VBA kodunun şifresi sadece 1234 olacaktır (burada gösterdiğim örnekte olduğu gibi).

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 = ... ile başlayan bir satır yoksa ne olur?
systemovich

1
Boş excel dosyasında mı, yoksa kilitli dosyada mı? Boş dosyanın dosya boyutunu kontrol edin. Kilitli dosyaysa, yedeklemenizin güvenli olduğundan emin olun, ardından yalnızca diğer iki satırı değiştirmeyi deneyin. Şifrelenmiş dosya olduğundan emin misiniz?
Colin Pickard

6
Excel 2007 parola koruması (ve dosya biçimi) Excel 2003'ten kökten farklı. Aşağıdaki cevabımda bununla ilgili bazı özellikler ekledim. Bence, Excel 2007 dosyasındaki parola korumalı seçenek, Microsoft Office geçmişinde ilk kez makul derecede güvenli bir dosya oluşturduklarıdır.
Stewbob

1
2016 excel yeni bir dosyada vba şifresi ayarlayamadım. Birisi sadece 1234 ile değiştirmek için HEX paylaşabilir miyim? Yoksa makineden makineye değişebilir mi?
Mescalito

1
Bu yaklaşım benim için bir .xlsm dosyası üzerinde çalıştı. Bir .xls olarak kaydettim, bunu yaptım ve sonra tekrar .xlsm'ye dönüştürdüm. Yeni CMG...dize orijinalden daha uzunsa , dosyanın uzunluğunu güvenli bir şekilde artırabileceğinizi belirtmek gerekir .
Drew Chapin

173

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.

  1. Kilitli VBA Projelerinizi içeren dosyaları açın.
  2. 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
  3. 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.


1
Neden emin değilim ama 365 MSP 64-bit excel çöküyor için Excel'de bu çalıştırdığınızda, dosyaları kapatır ve yeniden başlattığınızda, parola hala orada.
eborbath

Bu, excel'de artık yapılamaz çünkü bağlam menüsündeki seçenekler gri olur, böylece modülü oluşturamazsınız.
thanos.a

170

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.

  1. Xls dosyasını yedekleyin
  2. Dosyayı bir HEX düzenleyicisinde açın ve DPB=...parçayı bulun
  3. Değişim DPB=...dizeDPx=...
  4. Xls dosyasını Excel'de açma
  5. VBA düzenleyicisini açma ( ALT+ F11)
  6. sihir: Excel geçersiz bir anahtar (DPx) bulur ve projeyi yüklemeye devam etmek isteyip istemediğinizi sorar (temel olarak korumayı yok sayarak)
  7. Şifrenin üzerine yazabileceksiniz, bu yüzden hatırlayabileceğiniz bir şeyle değiştirin
  8. Xls dosyasını kaydedin *
  9. Belgeyi kapatın ve yeniden açın ve VBA büyünüzü çalışın!

* 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!


3
Ne yazık ki, bu benim için Excel for Mac 2011 v14.2.5 ile işe yaramadı. Parolayı sıfırlamak için dosyayı onarma seçeneğim var ve efekt tüm VBA komut dosyalarını kaybediyordu.
Joe Carroll

Mükemmel çözüm - Bunu HxD Hex Editor kullanarak bir 2003 dosyası ile yaptım
Chris W

4
Sadece denedim (.xls, Excel 2007) ve işe yaramadı. Sonuç: Modüller görülebilir, kod gerçekten işe yarıyor gibi görünüyor, ancak bir modülü açarken beklenmeyen bir hata (40230) söylüyor .
KekuSemau

2
Aynı hata burada (Excel 2010) - ama sonra Pieter'den 'yeni bir şifre belirle ve kaydet / yeniden aç' (adım 7-9) atladığımı fark ettim.
Owen B

+1 Bu yöntem kötü geliştirilmiş erişim (.mdb) dosyamızda da çalıştı! Şimdi bunu daha iyi yapabiliriz, bunun için teşekkürler!
Er Gabriel Doronila

65

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.


O zaman standart zip hack araçları kullanmanız gerekir. Onun artık bir "nasıl bir excel dosyası geri" sorunu.
Anonim Tip

3
@Anonymous Type: Bir zip kırma aracının yardımcı olmayacağını düşünüyorum. Stewbob'u anladığım gibi, şifrelenmiş zip dosyasındaki dosya girişleri değil, üstbilgi ve merkezi dizini içermesi gereken tüm zip dosyasının kendisi.
Treb

2
Sadece merak ediyorum: Sadece bir şifre (simetrik) girdiğimde nasıl RSA olabilir?
kizzx2

Almak istediğiniz dosyanın daha kısa anahtarları olduğunda ne olur? Sadece 137 tane olana kadar vba belgeleri oluşturmaya devam et.
onlynone

1
VBA projesini kilitlediğinizde tüm zip dosyasının şifreli olduğundan emin misiniz? Ben hala zipfile açabilir ve dosya yapısını görebilirsiniz .... Ve alt klasör xl \ tanıdık "CMG = ... GC =" karma blok olan vbaProject.bin dosyasını içerir .
Nigel Heffernan

63

Bir .xlsmveya .dotmdosya türü için bunu biraz farklı bir şekilde yapmanız gerekir.

  1. .xlsmDosyanın uzantısını olarak değiştirin .zip.
  2. .Zip dosyasını açın (WinZip veya WinRar vb. İle) ve xl klasörüne gidin.
  3. Özü vbaProject.bindosya ve bir Hex Editor açmak (kullandığım yxd , tamamen ücretsiz ve hafiftir.)
  4. Dosyayı arayın DPBve değiştirin DPxve kaydedin.
  5. vbaProject.binSıkıştırılmış dosyada eski dosyayı bu yeni ile değiştirin .
  6. Dosya uzantısını olarak değiştirin .xlsm.
  7. Açık çalışma kitabı uyarı mesajlarını atlayın.
  8. Excel içinde Visual Basic'i açın.
  9. Araçlar> VBAProject Özellikleri> Koruma Sekmesi'ne gidin.
  10. Yeni bir şifre girin ve .xlsmdosyayı kaydedin .
  11. Kapatıp tekrar açtığınızda yeni şifreniz çalışır.

8
Excel 2016, Windows 10 64bit'te çalıştı. (xlsm dosyaları)
LimaNightHawk

3
Word 2016'da çalıştı, Windows 10 64bit (dotm dosyaları)
NBajanca

7
Harika bir çözüm, Excel 2013 64 bit'te benim için çalıştı. Sen dosya uzantılarının değişen atlayabilirsiniz .zipvarsa 7-Zip yüklü. Bu durumda, .xlsmdosyayı sağ tıklayıp "7-Zip -> Arşivi Aç" ı
nkatsar

Word 2013, win7x64 ile çalışır. (Kodun biraz güvenli olduğuna inanmak için kandırılması çok üzücüdür).
Berry Tsakala

1
@ThierryMichel Önceki çözümlerle deneme yanılma kombinasyonu!
Matt

35

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.


4
bu doğru değil, xlsm'den xls / xla'ya dönüştürmenin imkansız olduğu dosyalarla çalıştım, Excel 2007 ve 2010 her seferinde çöktü, bir hata iletisinden çeşitli örnekleri denedim - Kod wyjątku: c0000005 005d211d
Qbik

4
Evet, bunu yapabilirsin. Bunu birçok kez yaptım. Sayfalarda gerekli olan ve eski sürüme aktarılmayan bir şey varsa bunu yapıyorum: 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
ZygD

Yanıtta olduğu gibi xlsm'yi xls'ye dönüştürdükten sonra çalışır.
Purus

32

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

  1. Kilitli VBA Projelerinizi içeren dosyaları açın.
  2. 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
  3. 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

3
Mükemmel! Windows Server 2016, Excel 2016 32 bit ile çalışın
Zin Min

Bu, Excel Office 365'te bir .xlsm dosyası üzerinde çalıştı. Teşekkürler!
Ryan James

Hala 2019'da çalışıyor, Office 365 64 bit en son sürümler, harika adamlar!
XavierAM

Güncellenen kod için teşekkürler, önceki sürümü (64 bit) çalıştıran çökmelerle karşı karşıya kaldım, ancak sürümünüzle iyi
emjaySX

Harika ... Mükemmel çalıştı
Mahhdy

17

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.


15

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ı.


1
Bu işe yarıyor, ancak yakın zamanda keşfettiğim gibi (yukarıda yorumladığım), GC = "..." bloğundaki son kapanış teklifinden sonra aynı uzunluğa ulaşana kadar boş karakterler de ekleyebilirsiniz.
tobriand

13

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)


1
Bunun Excel 2010 ile de .xlam dosyaları için çalıştığını doğrulayabilirim. 1!
Gimelist

12

Access, Excel, Powerpoint veya Word belgelerindeki VBA Proje Parolaları ( 2007, 2010, 2013 or 2016uzantı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ı.

Adımların bir özeti:

  • bir .ZIPuzantısı olacak şekilde dosyayı yeniden adlandırın .
  • klasörünü açın ZIPve XLklasöre gidin .
  • ayıklamak vbaProject.binve bir Hex Editör ile açın
  • "Arama ve Değiştir" değişen "tümünü değiştir" DPBiçin DPX.
  • Değişiklikleri kaydedin, .bindosyayı tekrar zip'e yerleştirin, normal uzantısına geri döndürün ve dosyayı normal gibi açın.
  • VB Düzenleyicisi'ne girmek için ALT + F11 tuşlarına basın ve seçmek için Proje Gezgini'nde sağ tıklayın VBA Project Properties.
  • ProtectionYeni bir şifre belirleyin sekmesinde.
  • Tıklayın OK, dosyayı kapatın, yeniden açın, ALT + F11 tuşlarına basın.
  • Belirlediğiniz yeni şifreyi girin.

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.


9

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


2
Aşağıdaki bağlantı XSLM biçimindeki dosyalar için ayrıntılar vermektedir. Çözüm , yukarıdaki Yuhong Bao tarafından özetlenen çözümle aynıdır, ancak ilginç okumalar yapar ve ekran görüntüleri içerir.
JohnLBevan

7

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ı .xlsdosyalar 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.


7

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

1
Güzel! Sanırım bir aşağı oyunuz var çünkü çözümünüz VBA modülü yerine çalışma sayfasının kilidini açar. Yine de yararlı buldum - çok teşekkürler!
PBD10017

1
Bu benim Kişisel Çalışma Kitabım var. Yazarlar, Bob McCormick'i daha sonra Norman Harker ve JE McGimpsey 2002 tarafından değiştirilmiş orijinal yazar olarak gösterdi.
Charles Byrne

5

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 .


4

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.


4

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.


Ben bu aracı test var ve gerçekten iyi çalışıyor ancak ücretsiz sürümü ilk 53 satır alır. Dosyamı kurtarmak için şifreyi açmak için Andy'nin talimatlarını takip etmek zorunda kaldım. Sonra her iki bölmede VbaDiff ile xlsm açtım ve sonra kodum ile sayfaya tıkladım. Kopyala-yapıştır ile aldım ve kurtarılan ama vba-boş excel dosyama koydu.
thanos.a

2

Koruma, Excel'de basit bir metin karşılaştırmasıdır. En sevdiğiniz hata ayıklayıcıya Excel'i yükleyin ( Ollydbg benim seçim aracımdır ), karşılaştırmayı yapan kodu bulun ve her zaman doğru dönecek şekilde düzeltin, bu makrolara erişmenize izin vermelidir.


1

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:

  1. Onaltılık düzenleyicide vba'yı açın (örneğin XVI)
  2. Bu DPB'de ara
  3. DPB'yi DPX gibi başka bir şeye değiştirin
  4. Kaydet!
  5. .Xla dosyasını yeniden açın, bir hata mesajı görünecektir, devam edin.
  6. Şimdi özellikleri açıp .xla şifresini değiştirebilir ve şifre sekmesine gidebilirsiniz.

Umarım bu bazılarınıza yardımcı olmuştur!


En iyi yanıt maalesef artık çalışmıyorken, Excel 10'un en son sürümünde Windows 10'da kullanarak eski bir .xls dosyasını açmayı başardım. HxD'yi indirdim ve son harfi önerilen gibi değiştirdim ve hataları atladım. Şimdi her şey yolunda, teşekkürler!
Starnes Öğrencisi

0

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)


Cevabınızın daha önce verilmiş olanlardan daha iyi olduğunu açıklayabilir misiniz?
Noel Widmer

benim çözümüm bir kodu yok. dışında çok kompakt bir çözüm.
Developer33

1
Verdiğiniz bu çözüm 2019'da çalışmıyor.
Daniel L. VanDenBosch

Benim için de çalışmıyor 365
thanos.a

0

Eğer çalışıyorsanız Javadeneyebilirsiniz VBAMacroExtractor. VBA komut dosyalarını çıkardıktan sonra .xlsmdüz metin olarak şifre buldum.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.