C'è un modo per decifrare la password su un progetto VBA di Excel?


486

Mi è stato chiesto di aggiornare alcune macro di Excel 2003, ma i progetti VBA sono protetti da password e sembra che manchi la documentazione ... nessuno conosce le password.

Esiste un modo per rimuovere o decifrare la password in un progetto VBA?


Sei in grado di salvare come .xls anziché come .xla come suggeriscono gli esempi nel tuo link? Non sono sicuro se questo farebbe la differenza.
B Hart,

4
Buono a sapersi: xlsb è robusto contro i trucchi per la
violazione della

20
@ Fandango68 Questa domanda è stata discussa anni fa su meta . TLDR: Molte (la maggior parte?) Delle domande su SO potrebbero essere abusate da cattivi attori, ma a meno che non ci siano prove chiare di illeciti, assumiamo buona fede. Esistono molte ragioni legittime ed etiche legittime per decifrare una password VBA. Inoltre, discutere delle debolezze degli attuali sistemi contribuisce in definitiva a una migliore sicurezza in futuro e scoraggia le persone dal fare affidamento cieco su sistemi non sicuri ora.
jmbpiano,

Risposte:


701

Puoi provare questo VBAapproccio diretto che non richiede l'editing HEX. Funzionerà con qualsiasi file (* .xls, * .xlsm, * .xlam ...).

Testato e funziona su:

Excel 2007
Excel 2010
Excel 2013 - Versione a 32 bit
Excel 2016 - Versione a 32 bit

Cerchi una versione a 64 bit? Vedi questa risposta

Come funziona

Farò del mio meglio per spiegare come funziona - per favore, scusa il mio inglese.

  1. VBE chiamerà una funzione di sistema per creare la finestra di dialogo della password.
  2. Se l'utente immette la password corretta e fa clic su OK, questa funzione restituisce 1. Se l'utente immette la password errata o fa clic su Annulla, questa funzione restituisce 0.
  3. Dopo la chiusura della finestra di dialogo, VBE verifica il valore restituito della funzione di sistema
  4. se questo valore è 1, il VBE "penserà" che la password è corretta, quindi verrà aperto il progetto VBA bloccato.
  5. Il codice seguente scambia la memoria della funzione originale utilizzata per visualizzare la finestra di dialogo della password con una funzione definita dall'utente che restituirà sempre 1 quando viene chiamata.

Usando il codice

Per favore, prima esegui il backup dei tuoi file!

  1. Apri i file che contengono i tuoi progetti VBA bloccati
  2. Crea un nuovo file xlsm e archivia questo codice in 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
  3. Incollare questo codice con il codice sopra in Module1 ed eseguirlo

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub
  4. Torna ai tuoi progetti VBA e divertiti.


4
@Chris hai assolutamente ragione. Perché le funzioni API di Windows sono definite per win 32 in questo codice.
Thanc Thanh Nguyễn,

8
Alcune spiegazioni sarebbero utili su come funziona.
Dennis G,

20
Ora l'unica domanda rimasta (dopo aver visto che questo metodo impressionante funziona perfettamente), è come diavolo posso rafforzare il mio progetto VBA per impedire ad altri di usare questo hack su di esso :)
EranG

6
Questo codice funziona perfettamente nello sbloccare il codice VBA anche se ogni volta che l'ho usato mi impedisce di proteggere nuovamente il progetto con una password diversa, qualcun altro ha avuto questo problema?
Matthew Bond,

2
Ho scoperto che corrompe il progetto VBA nel file Excel, quindi ho dovuto esportare tutti i moduli / classi, quindi salvare il file come xlsx (non macro), quindi CHIUDERE il file (stupido Excel), quindi riaprire, quindi importa moduli e copia codice da file di classe. A questo punto, ho potuto salvare il file come xlsm con la mia password sul progetto VBA.
BH,

217

Sì, a condizione che tu stia utilizzando un .xlsfoglio di calcolo formato (impostazione predefinita per Excel fino al 2003). Per Excel 2007 in poi, il valore predefinito è.xlsx , che è un formato abbastanza sicuro, e questo metodo non funzionerà.

Come dice Treb, è un semplice confronto. Un metodo consiste nello scambiare semplicemente la voce della password nel file utilizzando un editor esadecimale (consultare Editor esadecimali per Windows ). Esempio passo passo:

  1. Crea un nuovo semplice file Excel.
  2. Nella parte VBA, imposta una password semplice (diciamo - 1234).
  3. Salva il file ed esci. Quindi controlla le dimensioni del file - vedi il gotcha di Stewbob
  4. Apri il file che hai appena creato con un editor esadecimale.
  5. Copia le righe che iniziano con i seguenti tasti:

    CMG=....
    DPB=...
    GC=...
  6. PRIMO BACKUP del file Excel per il quale non si conosce la password VBA, quindi aprirlo con l'editor esadecimale e incollare le righe sopra copiate dal file fittizio.

  7. Salvare il file Excel e uscire.
  8. Ora, apri il file Excel necessario per visualizzare il codice VBA. La password per il codice VBA sarà semplicemente 1234 (come nell'esempio che sto mostrando qui).

Se devi lavorare con Excel 2007 o 2010, ci sono alcune altre risposte che potrebbero esserti utili, in particolare queste: 1 , 2 , 3 .

MODIFICA Febbraio 2015: per un altro metodo che sembra molto promettente, guarda questa nuova risposta di Thanc Thanh Nguyễn.


Cosa succede se non ci sono righe che iniziano con CMG = ...?
systemovich,

1
Nel file Excel vuoto o bloccato? Controlla la dimensione del file vuoto. Se è il file bloccato, assicurati che il tuo backup sia sicuro, quindi prova a cambiare solo le altre due linee. Sei sicuro che sia un file crittografato?
Colin Pickard,

6
La protezione con password di Excel 2007 (e il formato del file) è radicalmente diversa da Excel 2003. Ho incluso alcune specifiche al riguardo nella mia risposta di seguito. A mio avviso, l'opzione protetta da password su un file Excel 2007 è la prima volta nella storia di Microsoft Office che hanno prodotto un file ragionevolmente sicuro.
Stewbob,

1
Non sono riuscito a impostare la password di vba su un nuovo file di Excel 2016. Qualcuno potrebbe semplicemente condividere l'esadecimale da sostituire con 1234? O può cambiare da macchina a macchina?
Mescalito,

1
Questo approccio ha funzionato per me su un file .xlsm. L'ho salvato come .xls, l'ho fatto e poi l'ho riconvertito in .xlsm. Va notato che è possibile aumentare in modo sicuro la lunghezza del file se la nuova CMG...stringa è più lunga dell'originale.
Ha disegnato Chapin

173

Ho sviluppato la fantastica risposta di Thanc Thanh Nguyễn per consentire a questo metodo di funzionare con le versioni a 64 bit di Excel. Sto eseguendo Excel 2010 a 64 bit su Windows 7 a 64 bit.

  1. Apri i file che contengono i tuoi progetti VBA bloccati.
  2. Crea un nuovo file xlsm e archivia questo codice in 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
  3. Incolla questo codice in Module2 ed eseguilo

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub

DISCLAIMER Questo ha funzionato per me e l'ho documentato qui nella speranza che possa aiutare qualcuno. Non l'ho provato completamente . Assicurati di salvare tutti i file aperti prima di procedere con questa opzione.


1
Non sono sicuro del perché, ma quando eseguo questo su Excel per 365 MSP a 64 bit si arresta in modo anomalo, chiude i file e quando lo riavvio, la password è ancora lì.
eborbath

Questo non può più essere fatto in Excel poiché le opzioni nel menu di scelta rapida sono disattivate, quindi non è possibile creare il modulo.
thanos.a

170

Esiste un'altra soluzione (un po 'più semplice), senza problemi di dimensioni. Ho usato questo approccio oggi (su un file XLS del 2003, usando Excel 2007) e ho avuto successo.

  1. Eseguire il backup del file xls
  2. Aprire il file in un editor HEX e individuare la DPB=...parte
  3. Cambia la DPB=...stringa inDPx=...
  4. Apri il file xls in Excel
  5. Apri l'editor VBA ( ALT+ F11)
  6. la magia: Excel scopre una chiave non valida (DPx) e chiede se si desidera continuare a caricare il progetto (sostanzialmente ignorando la protezione)
  7. Sarai in grado di sovrascrivere la password, quindi cambiala in qualcosa che ricordi
  8. Salva il file xls *
  9. Chiudi e riapri il documento e lavora con la tua magia VBA!

* NOTA: assicurati di aver modificato la password con un nuovo valore, altrimenti la prossima volta che aprirai il foglio di calcolo Excel segnalerà errori (errore imprevisto), quindi quando accedi all'elenco dei moduli VBA ora vedrai i nomi dei moduli di origine ma ricevono un altro errore quando si tenta di aprire moduli / codice / ecc. Per ovviare a questo, tornare alle proprietà del progetto VBA e impostare la password su un nuovo valore. Salva e riapri il documento Excel e dovresti essere pronto!


3
Sfortunatamente, questo non ha funzionato per me con Excel per Mac 2011 v14.2.5. Ho avuto la possibilità di riparare il file, non ripristinare la password e l'effetto stava perdendo tutti gli script VBA.
Joe Carroll,

Soluzione perfetta - l'ho fatto con un file del 2003 usando HxD Hex Editor
Chris W,

4
L'ho appena provato (.xls, Excel 2007) e non ha funzionato. Il risultato è: i moduli sono visibili, il codice sembra effettivamente funzionare, ma quando si apre un modulo, viene visualizzato un errore imprevisto (40230) .
KekuSemau,

2
Stesso errore qui (Excel 2010) - ma poi mi sono reso conto di aver saltato il 'imposta una nuova password e salva / riapri' (passaggi 7-9) da Pieter.
Owen B,

+1 Questo metodo ha funzionato anche sul nostro file di accesso (.mdb) mal sviluppato! Ora possiamo migliorare questa cosa, grazie per questo!
Er Gabriel Doronila,

65

Colin Pickard ha una risposta eccellente, ma c'è un 'attenzione' con questo. Ci sono casi (non ho ancora capito la causa) in cui la lunghezza totale della voce "CMG = ........ GC = ...." nel file è diversa da un file Excel al Il prossimo. In alcuni casi, questa voce sarà 137 byte e in altri sarà 143 byte. La lunghezza di 137 byte è quella dispari e se ciò accade quando si crea il file con la password '1234', basta creare un altro file e dovrebbe passare alla lunghezza di 143 byte.

Se si tenta di incollare il numero errato di byte nel file, si perderà il progetto VBA quando si tenta di aprire il file con Excel.

MODIFICARE

Questo non è valido per i file Excel 2007/2010. Il formato di file standard .xlsx è in realtà un file .zip contenente numerose sottocartelle con formattazione, layout, contenuto, ecc., Archiviate come dati XML. Per un file Excel 2007 non protetto, puoi semplicemente modificare l'estensione .xlsx in .zip, quindi aprire il file zip e esaminare tutti i dati XML. È molto semplice.

Tuttavia, quando si protegge con password un file Excel 2007, l'intero file .zip (.xlsx) viene effettivamente crittografato utilizzando la crittografia RSA. Non è più possibile modificare l'estensione in .zip e sfogliare il contenuto del file.


Quindi è necessario utilizzare strumenti di hacking zip standard. Non è più un problema "come posso ripristinare un file Excel".
Tipo anonimo

3
@Anonimo Tipo: penso che uno strumento di cracking zip non aiuterà. A quanto ho capito Stewbob, non sono le voci di file nel file zip che sono crittografate, ma l'intero file zip stesso, che dovrebbe includere l'intestazione e la directory centrale.
Treb,

2
Solo curioso: come potrebbe essere RSA quando inserisco solo una password (simmetrica)?
kizzx2,

Che ne dici di quando il file che vuoi ottenere ha le chiavi più brevi? Continua a creare documenti vba finché non ne ottieni uno con 137?
solo il

1
Sei sicuro che l'intero file zip sia crittografato quando blocchi il progetto VBA? Posso ancora aprire il file zip e vedere la struttura del file .... E la sottocartella xl \ contiene il file vbaProject.bin che ha il familiare blocco di hashing "CMG = ... GC =".
Nigel Heffernan,

63

Per un tipo di file .xlsmo .dotmè necessario farlo in un modo leggermente diverso.

  1. Cambia l'estensione del .xlsmfile in .zip.
  2. Apri il file .zip (con WinZip o WinRar ecc.) E vai alla cartella xl.
  3. Estrai il vbaProject.binfile e aprilo in un editor esadecimale (uso HxD , è completamente gratuito e leggero).
  4. Cerca DPBe sostituisci con DPxe salva il file.
  5. Sostituisci il vecchio vbaProject.binfile con questo nuovo nel file zippato.
  6. Cambia l'estensione del file in .xlsm.
  7. Apri cartella di lavoro per saltare i messaggi di avviso.
  8. Apri Visual Basic in Excel.
  9. Vai su Strumenti> Proprietà VBAProject> Scheda Protezione.
  10. Inserisci una nuova password e salva il .xlsmfile.
  11. Chiudi e riapri e la tua nuova password funzionerà.

8
Ha funzionato in Excel 2016, Windows 10 a 64 bit. (file xlsm)
LimaNightHawk,

3
Ha funzionato in Word 2016, Windows 10 64 bit (file dotm)
NBajanca,

7
Ottima soluzione, ha funzionato per me in Excel 2013 a 64 bit. È possibile saltare la modifica delle estensioni di file .zipse è installato 7-Zip . In questo caso, puoi semplicemente fare clic con il pulsante destro del mouse sul .xlsmfile e scegliere "7-Zip -> Open Archive"
nkatsar

funziona con Word 2013, win7x64. (È molto triste, essere così facilmente ingannato da credere che il codice sia alquanto sicuro).
Berry Tsakala,

1
@ThierryMichel Combinazione di soluzioni precedenti e tentativi ed errori!
Matt,

35

Vale la pena sottolineare che se si dispone di un file Excel 2007 (xlsm), è possibile semplicemente salvarlo come file Excel 2003 (xls) e utilizzare i metodi descritti in altre risposte.


4
non è vero, ho lavorato con i file per i quali era impossibile la conversione in xls / xla da xlsm, Excel 2007 e 2010 si bloccavano ogni volta, ho provato varie istanze, da un messaggio erros - Kod wyjątku: c0000005 Przesunięcie wyjątku: 005d211d
Qbik

4
Si, puoi farlo. L'ho fatto molte volte. Se c'è qualcosa sui fogli che è necessario e ciò che non è trasferito alla versione precedente lo faccio: 1.converto .xlsm in .xls 2.crack il codice di .xls 3.converti .xlsm in .xlsx 4.Metti il ​​codice dai moduli in .xls in. xlsx e salvalo come .xlsm
ZygD

Funziona dopo aver convertito xlsm in xls come nella risposta.
Purus,

32

Con il mio turno, questo è basato sull'eccellente risposta di Kaybee99 che si basa sulla fantastica risposta di Thanc Thanh Nguyễn per consentire a questo metodo di funzionare con entrambe le versioni x86 e amd64 di Office.

Una panoramica di ciò che è cambiato, evitiamo push / ret che è limitato a indirizzi a 32 bit e lo sostituiamo con mov / jmp reg.

Testato e funzionante

Word / Excel 2016 - Versione a 32 bit .
Word / Excel 2016 - Versione a 64 bit .

come funziona

  1. Apri i file che contengono i tuoi progetti VBA bloccati.
  2. Crea un nuovo file con lo stesso tipo di quello sopra e archivia questo codice in 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
  3. Incolla questo codice in Module2 ed eseguilo

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub

3
Perfetto! Funziona con Windows Server 2016, Excel 2016 32 bit
Zin Min

Questo ha funzionato su un file .xlsm su Excel Office 365. Grazie!
Ryan James,

Funziona ancora nel 2019, build di Office 365 a 64 bit, ragazzi fantastici!
XavierAM

Grazie per il codice aggiornato, stavo affrontando arresti anomali durante l'esecuzione della versione precedente (64 bit), ma tutto bene con la tua versione
emjaySX

Fantastico ... ha funzionato perfettamente
Mahhdy il

17

Hai provato semplicemente aprendoli in OpenOffice.org?

Qualche tempo fa ho avuto un problema simile e ho scoperto che Excel e Calc non capivano la crittografia reciproca e quindi permettevo l'accesso diretto a tutto.

Questo era un po 'di tempo fa, quindi se non fosse stato solo un colpo di fortuna da parte mia, potrebbe anche essere stato corretto.


15

Nel caso in cui il blocco di CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX" nel file "password nota" sia più corto del blocco esistente nel file "password sconosciuta", riempire le stringhe esadecimali con zeri finali per raggiungere la lunghezza corretta.

per esempio

CMG="xxxxxx"\r\nDPB="xxxxxxxx"\r\nGC="xxxxxxxxxx"

nel file di password sconosciuta, dovrebbe essere impostato su

CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000" per preservare la lunghezza del file.

Ho anche avuto questo lavoro con i file .XLA (formato 97/2003) in Office 2007.


1
Funziona, ma come ho scoperto di recente (commentato sopra) puoi anche semplicemente aggiungere caratteri null dopo la citazione di chiusura finale nel blocco GC = "..." fino a quando non raggiungi la stessa lunghezza.
tobriand,

13

Per Excel 2007 in poi è necessario modificare l'estensione del file in .zip Nell'archivio è presente una sottocartella xl, in cui troverai vbaProject.bin. Seguire il passaggio sopra con vbaProject.bin quindi salvarlo nuovamente nell'archivio. Modifica la tua estensione e voilà! (intendendo seguire i passaggi precedenti)


1
Posso confermare che funziona anche con file .xlam con Excel 2010. +1!
Gimelist

12

Le password del progetto VBA su documenti Access, Excel, Powerpoint o Word ( 2007, 2010, 2013 or 2016versioni con estensioni .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM) possono essere facilmente rimosse .

Si tratta semplicemente di modificare l'estensione del nome file .ZIP, decomprimere il file e utilizzare qualsiasi editor esadecimale di base (come XVI32 ) per "rompere" la password esistente, il che "confonde" Office in modo da richiedere una nuova password la prossima volta che il file è ha aperto.

Un riepilogo dei passaggi:

  • rinominare il file in modo che abbia un .ZIP un'estensione.
  • apri il ZIPe vai alXL cartella.
  • estrarre vbaProject.bine aprirlo con un editor esadecimale
  • "Cerca e sostituisci" per "sostituire tutto" cambiando DPB a DPX.
  • Salva le modifiche, posiziona il .bin file nella zip, riportalo alla sua normale estensione e apri il file come al solito.
  • ALT + F11 per accedere all'editor VB e fare clic con il pulsante destro del mouse in Esplora progetti per scegliere VBA Project Properties .
  • Sul Protection scheda, imposta una nuova password.
  • Clic OK , Chiudi il file, riaprirlo, ALT + F11.
  • Inserisci la nuova password che hai impostato.

A questo punto puoi rimuovere completamente la password se lo desideri.

Istruzioni complete con un video dettagliato che ho fatto "molto tempo fa" quando sono su YouTube qui .

È un po 'scioccante che questa soluzione alternativa sia disponibile da anni e Microsoft non abbia risolto il problema.


La morale della storia?

Microsoft Office password progetto VBA sono di non essere invocata per la sicurezza di tutte le informazioni sensibili . Se la sicurezza è importante, utilizzare software di crittografia di terze parti.


9

Colin Pickard è per lo più corretto, ma non confondere la protezione "password per aprire" per l'intero file con la protezione password VBA, che è completamente diversa dalla prima ed è la stessa per Office 2003 e 2007 (per Office 2007, rinominare il file in .zip e cerca vbaProject.bin all'interno dello zip). E tecnicamente il modo corretto per modificare il file è utilizzare un visualizzatore di documenti composti OLE come CFX per aprire il flusso corretto. Naturalmente, se stai solo sostituendo i byte, il semplice vecchio editor binario potrebbe funzionare.

A proposito, se ti stai chiedendo il formato esatto di questi campi, ora lo hanno documentato:

http://msdn.microsoft.com/en-us/library/dd926151%28v=office.12%29.aspx


2
Il seguente link fornisce dettagli per i file in formato XSLM. gbanik.blogspot.co.uk/2010/08/… La soluzione è la stessa di quella descritta da Yuhong Bao sopra, ma rende la lettura interessante e include schermate.
JohnLBevan,

7

Se il file è un file zip valido (vengono 50 4Butilizzati i primi byte - utilizzati in formati come .xlsm), quindi decomprimere il file e cercare il file secondario xl/vbaProject.bin. Questo è un file CFB proprio come i .xlsfile. Seguire le istruzioni per il formato XLS (applicato al file secondario) e quindi comprimere il contenuto.

Per il formato XLS, puoi seguire alcuni degli altri metodi in questo post. Personalmente preferisco cercare il DPB=blocco e sostituire il testo

CMG="..."
DPB="..."
GC="..."

con spazi vuoti. Ciò risolve i problemi relativi alle dimensioni del contenitore CFB.


7

Ho provato alcune delle soluzioni sopra e nessuna di esse funziona per me (file xlsm di Excel 2007). Poi ho trovato un'altra soluzione che ha persino recuperato la password, non solo per decifrarla.

Inserisci questo codice nel modulo, eseguilo e dagli un po 'di tempo. Recupererà la tua password con la forza bruta.

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
Bello! Penso che tu abbia ottenuto un downvote perché la tua soluzione sblocca il foglio di lavoro anziché il modulo VBA. Tuttavia l'ho trovato utile, quindi grazie!
PBD10017

1
Ho questo è il mio libro di esercizi personale. Gli autori hanno citato Bob McCormick come autore originale successivamente modificato da Norman Harker e JE McGimpsey 2002.
Charles Byrne,

5

ElcomSoft realizza prodotti Advanced Office Password Breaker e Advanced Office Password Recovery che possono applicarsi a questo caso, purché il documento sia stato creato in Office 2007 o precedente.


4

Tom - Inizialmente ho fatto un errore da scolaro perché non guardavo la dimensione dei byte e invece ho copiato e incollato dal "CMG" impostato alla voce successiva. Si trattava di due dimensioni di testo diverse tra i due file, e ho perso il progetto VBA proprio come Stewbob ha avvertito.

Usando HxD, c'è un contatore che traccia la quantità di file che stai selezionando. Copia a partire da CMG fino a quando il contatore non legge 8F (esadecimale per 143) e allo stesso modo quando si incolla nel file bloccato - Ho finito con il doppio del numero di "..." alla fine della pasta, che in qualche modo sembrava strano e sembrava quasi innaturale, ma ha funzionato.

Non so se sia cruciale, ma mi sono assicurato di chiudere sia l'editor esadecimale sia di eccellere prima di riaprire il file in Excel. Ho dovuto quindi scorrere i menu per aprire l'editor VB, accedere a Proprietà VBProject e inserire la "nuova" password per sbloccare il codice.

Spero che questo possa essere d'aiuto.


4

Il mio strumento, VbaDiff , legge VBA direttamente dal file, quindi puoi usarlo per recuperare il codice VBA protetto dalla maggior parte dei documenti di Office senza ricorrere a un editor esadecimale.


Ho testato questo strumento e funziona davvero bene, tuttavia la versione gratuita recupera le prime 53 righe. Per recuperare il mio file ho dovuto seguire le istruzioni di Andy per sbloccare la password. Quindi ho aperto xlsm con VbaDiff in entrambi i riquadri e quindi ho fatto clic sul foglio con il mio codice. L'ho preso con copia-incolla e l'ho messo nel mio file Excel recuperato ma vba-vuoto.
thanos.a

2

La protezione è un semplice confronto testuale in Excel. Carica Excel nel tuo debugger preferito ( Ollydbg è il mio strumento preferito), trova il codice che fa il confronto e correggilo per restituire sempre true, questo dovrebbe consentirti di accedere alle macro.


1

Per Excel 2016 a 64 bit su un computer Windows 10, ho usato un editor esadecimale per poter cambiare la password di un xla protetto (non l'ho testato per altre estensioni). Mancia: crea un backup prima di procedere.

I passi che ho preso:

  1. Apri il vba nell'editor esadecimale (ad esempio XVI)
  2. Cerca in questo DPB
  3. Cambia DPB in qualcos'altro, come DPX
  4. Salvarlo!
  5. Riaprire il .xla, apparirà un messaggio di errore, basta continuare.
  6. Ora puoi cambiare la password di .xla aprendo le proprietà e vai alla scheda password.

Spero che questo abbia aiutato alcuni di voi!


Sono riuscito ad aprire un vecchio .xls usando questo su Windows 10 nell'ultima versione di Excel 365, mentre la risposta principale purtroppo non funziona più. Ho scaricato HxD e modificato l'ultima lettera come raccomandato, e ho saltato gli errori. Tutto bene ora, grazie!
Starnes Student

0

l'estensione del file Excel cambia in xml. E aprilo nel blocco note. testo della password trova nel file xml.

vedi come sotto la linea;

Sheets("Sheet1").Unprotect Password:="blabla"

(scusa per il mio cattivo inglese)


Puoi spiegare come la tua risposta è migliore di quelle già ottime fornite?
Noel Widmer,

la mia soluzione non ha un codice. soluzione molto compatta oltre a.
Developer33

1
Questa soluzione che hai fornito non funziona nel 2019.
Daniel L. VanDenBosch

Non funziona neanche per me in Office 365
thanos.a il

0

Se lavori, Javapotresti provare VBAMacroExtractor. Dopo aver estratto gli script VBA da .xlsmho trovato la password in testo normale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.