Existe uma maneira de quebrar a senha em um projeto do Excel VBA?

pediram-me para actualizar algumas macros do Excel 2003, mas os projectos VBA estão protegidos por senha, e parece que há falta de documentação... ninguém sabe as senhas.

Há alguma forma de remover ou decifrar a senha num projecto VBA?

Author: ashleedawg, 2009-06-22

21 answers

Pode tentar esta abordagem directa {[[2]} que não requer edição hexadecimal. Ele vai funcionar para qualquer arquivo (*.xls,*.xlsm,*.xlam ...).

Testado e funciona em

Excel 2007
Excel 2010
Excel 2013 - 32 bit version .
Excel 2016 - 32 bit version.

À procura da versão 64 bits? Ver https://stackoverflow.com/a/31005696/4342479

Como funciona

Vou tentar a minha é melhor explicar como funciona-por favor, desculpe o meu inglês.

  1. o VBE irá invocar uma função do sistema para criar a janela de senha.
  2. Se o Utilizador introduzir a senha direita e carregar em OK, esta função devolve 1. Se o Utilizador introduzir a senha errada ou carregar em Cancelar, esta função devolve 0.
  3. Depois de a janela estar fechada, o VBE verifica o valor devolvido da função do sistema
  4. Se este valor for 1, o VBE vai "pensar" que a senha está certa, portanto o projecto VBA bloqueado será aberto.
  5. o código abaixo troca a memória da função original usada para mostrar a janela de senha com uma função definida pelo utilizador que irá sempre devolver 1 quando for chamada.

usando o código

  1. Abra os ficheiros que contêm os seus projectos VBA bloqueados
  2. Crie um novo ficheiro xlsm e guarde este código em 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. Colar este código em Module2 e executá-lo

    Sub unprotected()
        If Hook Then
            MsgBox "VBA Project is unprotected!", vbInformation, "*****"
        End If
    End Sub
    
  4. Volte para os seus projetos VBA e divirta-se.

 569
Author: Đức Thanh Nguyễn, 2017-11-01 18:34:40

Existe sim, desde que esteja a usar uma folha de cálculo do formato .xls (o valor por omissão para o Excel até 2003). Para o Excel 2007 em diante, o padrão é .xlsx, que é um formato bastante seguro, e este método não vai funcionar.

Como diz Treb, é uma comparação simples. Um método é simplesmente trocar a entrada de senha no ficheiro usando um editor hexadecimal (ver editores hexadecimal para o Windows). Exemplo passo a Passo:
  1. crie um novo ficheiro excel simples.
  2. na VBA parte, defina uma senha simples (digamos - 1234).
  3. guarda o ficheiro e sai. Então verifica o tamanho do ficheiro.
  4. abra o ficheiro que acabou de criar com um editor hex.
  5. Copiar as linhas a partir das seguintes teclas:

    CMG=....
    DPB=...
    GC=...
    
  6. Primeiro BACKUP o ficheiro excel para o qual não sabe a senha do VBA, depois abra-o com o seu editor hex, e cole as linhas acima copiadas do ficheiro falso.

  7. gravar o arquivo excel e sair.
  8. Agora, abra o arquivo excel que você precisa para ver o código VBA em. A senha do código VBA será simplesmente 1234 (como no exemplo que estou mostrando aqui).

Se você precisa trabalhar com o Excel 2007 ou 2010, existem algumas outras respostas abaixo que pode ajudar, especialmente esses: 1, 2, 3.

Edit Fev 2015: para outro método que parece muito promissor, olhe para esta nova resposta por Đức Thanh Nguyễn.

 202
Author: Colin Pickard, 2017-05-23 11:55:00

Existe outra solução (um pouco mais fácil), sem problemas de tamanho. Eu usei esta abordagem hoje (em um arquivo xls 2003, usando Excel 2007) e foi bem sucedido.

  1. Faça uma cópia de segurança do ficheiro xls
  2. Abra o ficheiro num editor hexadecimal e localize a parte DPB=...
  3. muda o texto de DPB=... para DPx=...
  4. Abra o ficheiro xls no Excel
  5. Abra o editor de VBA (ALT + F11)
  6. a magia: O Excel descobre uma chave inválida (DPx) e pergunta se deseja continuar a carregar o projecto (ignorando basicamente a protecção)
  7. você será capaz de sobrepor a senha, por isso mude - a para algo de que se lembre
  8. grava o ficheiro xls *
  9. Fecha e reabre o documento e faz a tua magia VBA!

* Nota: Certifique-se de que alterou a senha para um novo valor, caso contrário, da próxima vez que abrir a folha de cálculo, o Excel irá reportar erros( erro inesperado), depois quando aceder à lista de VBA módulos você verá agora os nomes dos módulos de código, mas receberá outro erro ao tentar abrir formulários/código/etc. Para remediar isso, volte para as propriedades do projeto VBA e defina a senha para um novo valor. Salve e reabra o documento Excel e você deve estar pronto para ir!

 156
Author: Pieter, 2017-04-03 16:01:48
Baseei-me na fantástica resposta do Đức Thanh Nguyễn para permitir que este método funcionasse com versões de 64 bits do Excel. Estou a executar o Excel 2010 64-Bit no Windows 7 64-Bit.
  1. Abra os ficheiros que contêm os seus projectos VBA bloqueados.
  2. Crie um novo ficheiro xlsm e guarde este código em 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. Colar este código em Module2 e executá-lo

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

Declaração de exoneração de responsabilidade ([11]) isto funcionou para mim e eu tenho documentei-o aqui na esperança de ajudar alguém. ainda não o testei completamente. Por favor, certifique-se de salvar todos os arquivos abertos antes de prosseguir com esta opção.

 129
Author: kaybee99, 2015-06-25 15:15:27
Colin Pickard tem uma excelente resposta, mas há um "cuidado" com isto. Existem instâncias (eu ainda não descobri a causa) onde o comprimento total do "CMG=........GC=...."a entrada no arquivo é diferente de um arquivo excel para o próximo. Em alguns casos, esta entrada será 137 bytes, e em outros será 143 bytes. O comprimento de 137 bytes é o ímpar, e se isso acontecer quando você criar seu arquivo com a senha de '1234', basta criar outro arquivo, e ele deve Saltar para o comprimento de 143 bytes.

Se tentar colar o número errado de bytes no ficheiro, irá perder o seu projecto VBA quando tentar abrir o ficheiro com o Excel.

Editar

Isto não é válido para os ficheiros do Excel 2007/2010. Padrao .xlsx file format is actually a .arquivo zip contendo várias sub-pastas com a formatação, layout, conteúdo, etc, armazenados como dados xml. Para um arquivo Excel 2007 desprotegido, você pode apenas mudar o .extensão xlsx para .zip, então. abra o arquivo zip e olhe através de todos os dados xml. É muito simples.

No entanto, quando você senha proteger um arquivo Excel 2007, o todo .postal (.o ficheiro xlsx) é realmente encriptado usando a encriptação RSA. Já não é possível alterar a extensão para .zip e navegar no conteúdo do arquivo.

 59
Author: Stewbob, 2012-02-16 19:04:15

Para um tipo de ficheiro .xlsm ou .dotm, tem de o fazer de uma forma ligeiramente diferente.

  1. muda a extensão do ficheiro .xlsm para .zip.
  2. Abre a porta .arquivo zip (com WinZip ou WinRar etc) e ir para a pasta xl.
  3. extrai o ficheiro vbaProject.bin e abre-o num Editor Hex (eu uso HxD, completamente livre e leve.)
  4. procura por DPB e substitui por DPx e guarda o ficheiro.
  5. substitua o ficheiro antigo vbaProject.bin por este novo em o ficheiro fechado.
  6. muda a extensão do ficheiro de volta para .xlsm.
  7. Um livro de trabalho aberto salta através das mensagens de aviso.
  8. Abre o Visual Basic dentro do Excel.
  9. ir para Tools > VBAProject Properties > Protection Tab.
  10. coloca uma nova senha e grava o ficheiro .xlsm.
  11. Fecha e abre e a tua nova senha vai funcionar.
 41
Author: Matt, 2018-06-15 07:47:19

Vale a pena salientar que se você tem um arquivo Excel 2007 (xlsm), então você pode simplesmente salvá-lo como um arquivo Excel 2003 (xls) e usar os métodos delineados em outras respostas.

 31
Author: Andy, 2011-03-25 01:29:54
Já tentaste abri-los? OpenOffice.org? Tive um problema semelhante há algum tempo e descobri que o Excel e o Calc não compreenderam a encriptação um do outro, permitindo assim acesso directo a quase tudo. Isto foi há algum tempo, por isso, se não foi só um acaso da minha parte, também pode ter sido remendado.
 12
Author: greg, 2010-04-12 15:50:42

Para o Excel 2007 em diante você precisa mudar a sua extensão de arquivo para .postal No arquivo existe uma subpasta xl, onde você encontrará o vbaProject.bandeja. Siga o passo acima com vbaProject.bin, em seguida, guardá-lo de volta no arquivo. Modifique a sua extensão e voilà! (significa seguir os passos acima)

 10
Author: user3761175, 2014-06-20 18:11:07

Colin Pickard está mais correcto, mas não confunda a protecção "password to open" para todo o ficheiro com a protecção VBA password, que é completamente diferente da anterior e é a mesma para o Office 2003 e 2007 (para o Office 2007, mudar o nome do ficheiro para .zip e procura o vbaProject.bin inside the zip). E que tecnicamente a maneira correta de editar o arquivo é usar um visualizador de documentos composto OLE como o CFX para abrir o fluxo correto. É claro, se você é apenas substituindo bytes, o editor binário simples e antigo pode funcionar.

BTW, se você está se perguntando sobre o formato exato destes campos, eles têm agora documentado:

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

 7
Author: Yuhong Bao, 2010-11-30 00:55:56

No caso de o seu bloco de CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX" no seu ficheiro de ' senha conhecida 'é mais curto do que o bloco existente no ficheiro de' senha desconhecida', pinte os seus textos hex com zeros a seguir para atingir o comprimento correcto.

Por exemplo

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

No ficheiro de senha desconhecido, deve ser definido como

CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000" para preservar o tamanho do ficheiro.

Também tive isto a funcionar .Ficheiros XLA (formato 97/2003)no office 2007.
 7
Author: Spangen, 2011-04-06 14:21:38

As senhas do projecto VBA no Access, Excel, Powerpoint ou Word documents (2007, 2010, 2013 or 2016 versões com extensões .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM podem ser facilmente removido.

É simplesmente uma questão de alterar a extensão de nome de arquivo para .ZIP, descompactar o arquivo e, usando qualquer basic Editor Hexadecimal (como XVI32) para "quebrar" a senha existente, que "confunde" o Office para que ele solicita para uma nova palavra-passe da próxima vez que o arquivo é aberto.

Um resumo do passos:

  • muda o nome do ficheiro para que tenha uma extensão .ZIP.
  • abra o ZIP e vá para a pasta XL.
  • extrair vbaProject.bin e abri-lo com um Editor Hex
  • "Procurar & Substituir "para" substituir tudo", mudando DPB para DPX.
  • gravar as alterações, colocar o ficheiro .bin de volta no zip, devolvê-lo à sua extensão normal e abrir o ficheiro como normal.
  • ALT+F11 para introduzir o Editor VB e carregar com o botão direito no Explorador do projecto para escolher VBA Project Properties.
  • na página Protection, defina uma nova senha.
  • Carregue em OK, feche o ficheiro, reabra-o, carregue em ALT+F11.
  • indique a nova senha que definiu.

Neste momento, pode remover completamente a senha se assim o desejar.

Instruções Completas com um vídeo passo-a-passo que eu fiz "caminho de volta quando" estão no YouTube Aqui.

É um pouco chocante que esta solução tenha estado por aí há muito tempo. anos, e a Microsoft não corrigiu o problema.

A moral da história?

Microsoft Office as senhas do projecto VBA não são de confiança. para a segurança de qualquer informação sensível . Se a segurança é importante, use software de criptografia de terceiros.

 6
Author: ashleedawg, 2018-02-10 14:57:49

Se o ficheiro for um ficheiro zip válido (os primeiros bytes são 50 4B -- usados em formatos como .xlsm), então abre o ficheiro e procura o sub-ficheiro xl/vbaProject.bin. Este é um ficheiro CFB tal como os ficheiros .xls. Siga as instruções para o formato XLS (aplicado ao subfile) e, em seguida, basta fechar o conteúdo.

Para o formato XLS, você pode seguir alguns dos outros métodos neste post. Pessoalmente prefiro procurar o bloco DPB= e substituir o texto

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

Em branco espaco. Isto evita problemas com o tamanho dos contentores CFB.

 5
Author: SheetJS, 2013-10-08 02:32:30

Tom-eu cometi um erro escolar inicialmente como eu não assisti o tamanho do byte e em vez disso eu copiei e colei do "CMG" configurado para a entrada seguinte. Este era dois tamanhos de texto diferentes entre os dois arquivos, no entanto, e eu perdi o projeto VBA assim como Stewbob advertiu.

Usando o HxD, existe um contador a seguir a quantidade de ficheiro que está a seleccionar. Copiar a partir do CMG até o contador ler 8F (hex para 143) e também ao colar no arquivo bloqueado-i acabou com duas vezes o número de"..."no final da pasta, que parecia estranha de alguma forma e parecia quase não natural, mas funcionou.

Não sei se é crucial, mas certifiquei-me de desligar o editor hex e o excel antes de reabrir o ficheiro no Excel. Eu então tive que passar pelos menus para abrir o Editor VB, em Propriedades VBProject e digitar a senha 'nova' para desbloquear o código. Espero que isto ajude.
 3
Author: Scoob, 2010-04-12 15:35:20

ElcomSoft makes Advanced Office Password Breaker and Advanced Office Password Recovery products which may apply to this case, as long as the document was created in Office 2007 or prior.

 3
Author: Charles Duffy, 2010-04-12 15:44:18

Tentei algumas das soluções acima e nenhuma delas funciona para mim (excel 2007 xlsm file). Depois encontrei outra solução que até recupera a senha, e não apenas a decifra.

Insira este código no módulo, execute-o e dê-lhe algum tempo. Recuperará a sua senha por força 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
 2
Author: Luboš Suk, 2015-11-20 11:52:39

A minha ferramenta, VbaDiff , lê o VBA directamente do ficheiro, para que o possa usar para recuperar o código VBA protegido da maioria dos documentos do escritório sem recorrer a um editor hex.

 2
Author: Chris Spicer, 2016-05-24 13:30:04

A protecção é uma simples comparação de texto no Excel. Carregue o Excel no seu depurador Favorito (Ollydbg sendo a minha ferramenta de escolha), encontre o código que faz a comparação e corrija-o para que seja sempre verdadeiro, isto deverá permitir-lhe aceder às macros.

 1
Author: Treb, 2009-06-22 10:54:40

A extensão do seu ficheiro excel muda para xml. E abre-o no bloco de notas. o texto da senha encontra-se no ficheiro xml.

Vê como abaixo da linha;

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

(desculpa pelo meu mau Inglês)

 0
Author: Developer33, 2017-06-06 11:40:29

Para o Excel 2016 64-bit em uma máquina do Windows 10, eu usei um editor hex para ser capaz de alterar a senha de um XLA protegido (não testei isso para quaisquer outras extensões). Dica: cria uma cópia de segurança antes de fazeres isto.

Os passos que dei:

  1. Abra a vba no editor Hexadecimal (por exemplo XVI)
  2. procura neste DPB
  3. mudar a DPB para outra coisa, como a DPX
  4. Poupa-me!
  5. reabra o .xla, uma mensagem de erro irá aparecer, apenas continuar.
  6. Agora você pode mudar a senha do .xla ao abrir as propriedades e ir para a página de senha.
Espero que isto tenha ajudado alguns de vocês!
 0
Author: Edwin van der V, 2018-01-29 09:09:30

Se trabalhar em {[0] } pode tentar VBAMacroExtractor. Depois de extrair os programas de VBA de .xlsm, encontrei uma senha no texto simples.

 0
Author: Grez, 2018-04-08 13:37:56