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


486

Me pediram para atualizar algumas macros do Excel 2003, mas os projetos VBA são protegidos por senha e parece que há uma falta de documentação ... ninguém sabe as senhas.

Existe uma maneira de remover ou quebrar a senha em um projeto VBA?


Você pode salvar como um .xls em vez de um .xla, como sugerem os exemplos no seu link? Não tenho certeza se isso faria diferença.
B Hart

4
bom conhecido: xlsb é robusto contra truques quebra de senha
Qbik

20
@ Fandango68 Esta questão foi discutida anos atrás em meta . TLDR: Muitas (a maioria?) Das perguntas sobre SO podem ser abusadas por maus atores, mas, a menos que haja evidências claras de irregularidades, assumimos boa fé. Há muitas razões legitimamente legais e éticas para quebrar uma senha do VBA. Além disso, discutir as fraquezas dos sistemas atuais contribui para melhorar a segurança no futuro e desencoraja as pessoas a confiarem cegamente em sistemas inseguros agora.
jmbpiano

Respostas:


701

Você pode tentar essa VBAabordagem direta , que não requer edição HEX. Ele funcionará para qualquer arquivo (* .xls, * .xlsm, * .xlam ...).

Testado e trabalha em:

Excel 2007
Excel 2010
Excel 2013 - versão de 32 bits
Excel 2016 - versão de 32 bits

Procurando a versão de 64 bits? Veja esta resposta

Como funciona

Vou tentar o meu melhor para explicar como funciona - desculpe meu inglês.

  1. O VBE chamará uma função do sistema para criar a caixa de diálogo de senha.
  2. Se o usuário digitar a senha correta e clicar em OK, essa função retornará 1. Se o usuário digitar a senha incorreta ou clicar em Cancelar, essa função retornará 0.
  3. Depois que a caixa de diálogo é fechada, o VBE verifica o valor retornado da função do sistema
  4. se esse valor for 1, o VBE "pensará" que a senha está correta; portanto, o projeto VBA bloqueado será aberto.
  5. O código abaixo troca a memória da função original usada para exibir o diálogo de senha com uma função definida pelo usuário que sempre retornará 1 ao ser chamada.

Usando o código

Faça backup dos seus arquivos primeiro!

  1. Abra o (s) arquivo (s) que contém seus projetos VBA bloqueados
  2. Crie um novo arquivo xlsm e armazene esse código no Módulo1

    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. Cole esse código no código acima no Módulo1 e execute-o

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


4
@ Chris, você está absolutamente certo. Como as funções da API do Windows estão definidas para a vitória 32 neste código.
Thanh Nguyễn

8
Alguma explicação seria legal de como isso está funcionando.
Dennis L

20
Agora, a única questão (depois de ver este método impressionante funciona perfeitamente), é como diabos eu posso fazer meu projeto VBA protegido mais forte para evitar que outras pessoas utilizem este corte sobre ele :)
EranG

6
Esse código funciona perfeitamente para desbloquear o código VBA, embora cada vez que eu usei isso me impeça de proteger novamente o projeto com uma senha diferente, alguém mais teve esse problema?
Matthew bond

2
Descobri que ele corrompe o projeto VBA no arquivo do Excel, então tive que exportar todos os módulos / classes, salvar o arquivo como xlsx (não macro), depois FECHAR o arquivo (estúpido Excel), reabrir e abrir importe módulos e copie o código dos arquivos de classe. Nesse ponto, eu poderia salvar o arquivo como xlsm com minha própria senha no projeto VBA.
BH

217

Sim, desde que você esteja usando uma .xlsplanilha de formato (o padrão para o Excel até 2003). Para o Excel 2007 em diante, o padrão é .xlsx, que é um formato razoavelmente seguro, e esse método não funciona.

Como Treb diz, é uma comparação simples. Um método é simplesmente trocar a entrada da senha no arquivo usando um editor hexadecimal (consulte Editores hexadecimais para Windows ). Exemplo passo a passo:

  1. Crie um novo arquivo excel simples.
  2. Na parte VBA, defina uma senha simples (digamos - 1234).
  3. Salve o arquivo e saia. Em seguida, verifique o tamanho do arquivo - veja a pegadinha de Stewbob
  4. Abra o arquivo que você acabou de criar com um editor hexadecimal.
  5. Copie as linhas começando com as seguintes chaves:

    CMG=....
    DPB=...
    GC=...
  6. PRIMEIRO BACKUP do arquivo do Excel para o qual você não conhece a senha do VBA, abra-o com o seu editor hexadecimal e cole as linhas copiadas acima do arquivo fictício.

  7. Salve o arquivo do Excel e saia.
  8. Agora, abra o arquivo do Excel no qual você precisa ver o código VBA. A senha do código VBA será simplesmente 1234 (como no exemplo que estou mostrando aqui).

Se você precisar trabalhar com o Excel 2007 ou 2010, há outras respostas abaixo que podem ajudar, especialmente estas: 1 , 2 , 3 .

EDIT Fevereiro de 2015: para outro método que parece muito promissor, veja esta nova resposta de Thanc Thanh Nguyễn.


E se não houver linhas que começam com CMG = ...?
systemovich 02/09/09

1
No arquivo em branco do Excel ou no bloqueado? Verifique o tamanho do arquivo em branco. Se for o arquivo bloqueado, verifique se o backup está seguro e tente alterar apenas as outras duas linhas. Tem certeza de que é um arquivo criptografado?
Colin Pickard

6
A proteção por senha do Excel 2007 (e formato de arquivo) é radicalmente diferente do Excel 2003. Incluí algumas especificações sobre isso na minha resposta abaixo. Na minha opinião, a opção protegida por senha em um arquivo do Excel 2007 é a primeira vez no histórico do Microsoft Office que eles produziram um arquivo razoavelmente seguro.
Stewbob 10/09/10

1
Não foi possível definir a senha do vba em um novo arquivo do Excel 2016. Alguém poderia simplesmente compartilhar o HEX para substituir o 1234? Ou pode mudar de máquina para máquina?
Mescalito 28/02

1
Essa abordagem funcionou para mim em um arquivo .xlsm. Salvei-o como um .xls, fiz isso e o convertei novamente em .xlsm. Deve-se observar que você pode aumentar com segurança o comprimento do arquivo se a nova CMG...sequência for maior que a original.
Drew Chapin

173

Eu construí a resposta fantástica de Thanc Thanh Nguyễn para permitir que esse método funcione com versões de 64 bits do Excel. Estou executando o Excel 2010 de 64 bits no Windows 7 de 64 bits.

  1. Abra os arquivos que contêm seus projetos VBA bloqueados.
  2. Crie um novo arquivo xlsm e armazene esse código no Módulo1

    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. Cole esse código no Módulo2 e execute-o

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

AVISO LEGAL Isso funcionou para mim e eu o documentei aqui na esperança de ajudar alguém. Ainda não testei completamente . Salve todos os arquivos abertos antes de continuar com esta opção.


1
Não sei por que, mas quando executo isso no Excel para 365 MSP, o Excel de 64 bits falha, ele fecha os arquivos e, quando eu o reinicio, a senha ainda está lá.
eborbath 24/04

Isso não pode mais ser feito no Excel, pois as opções no menu de contexto ficam acinzentadas, portanto você não pode criar o módulo.
thanos.a 27/04

170

Existe outra solução (um pouco mais fácil), sem os problemas de tamanho. Eu usei essa abordagem hoje (em um arquivo XLS de 2003, usando o Excel 2007) e tive êxito.

  1. Faça backup do arquivo xls
  2. Abra o arquivo em um editor HEX e localize a DPB=...peça
  3. Mude a DPB=...string paraDPx=...
  4. Abra o arquivo xls no Excel
  5. Abra o editor VBA ( ALT+ F11)
  6. a mágica: o Excel descobre uma chave inválida (DPx) e pergunta se você deseja continuar carregando o projeto (basicamente ignorando a proteção)
  7. Você poderá sobrescrever a senha, portanto altere-a para algo que você possa lembrar
  8. Salve o arquivo xls *
  9. Feche e reabra o documento e trabalhe sua mágica do VBA!

* NOTA: Certifique-se de alterar a senha para um novo valor; caso contrário, na próxima vez em que abrir a planilha, o Excel reportará erros (erro inesperado); em seguida, ao acessar a lista de módulos VBA, você verá os nomes dos módulos de origem, mas recebe outro erro ao tentar abrir forms / code / etc. Para remediar isso, volte às Propriedades do projeto VBA e defina a senha para um novo valor. Salve e reabra o documento do Excel e você deve estar pronto!


3
Infelizmente, isso não funcionou para mim com o Excel para Mac 2011 v14.2.5. Eu tive a opção de reparar o arquivo, não redefinir a senha, e o efeito foi perder todos os scripts do VBA.
Joe Carroll

Solução perfeita - eu fiz isso com um arquivo de 2003 usando o HxD Hex Editor
Chris W

4
Eu apenas tentei (.xls, Excel 2007) e não funcionou. O resultado é: Os módulos são visíveis, o código realmente parece funcionar, mas ao abrir um módulo, ele diz erro inesperado (40230) .
KekuSemau

2
O mesmo erro aqui (Excel 2010) - mas percebi que havia pulado o 'definir uma nova senha e salvar / reabrir' (etapas 7-9) do Pieter.
Owen B

+1 Este método também funcionou em nosso arquivo de acesso mal desenvolvido (.mdb)! Agora podemos melhorar isso, obrigado por isso!
Er Gabriel Doronila 6/06/2014

65

Colin Pickard tem uma resposta excelente, mas há um "cuidado" com isso. Há casos (ainda não descobri a causa) em que o comprimento total da entrada "CMG = ........ GC = ...." no arquivo é diferente de um arquivo do Excel para o arquivo Próximo. Em alguns casos, essa entrada terá 137 bytes e, em outros, 143 bytes. O comprimento de 137 bytes é ímpar e, se isso acontecer quando você criar seu arquivo com a senha '1234', basta criar outro arquivo e ele deverá saltar para o comprimento de 143 bytes.

Se você tentar colar o número incorreto de bytes no arquivo, você perderá o projeto do VBA ao tentar abrir o arquivo com o Excel.

EDITAR

Isso não é válido para arquivos do Excel 2007/2010. O formato de arquivo .xlsx padrão é, na verdade, um arquivo .zip que contém inúmeras subpastas com formatação, layout, conteúdo, etc., armazenados como dados xml. Para um arquivo do Excel 2007 desprotegido, basta alterar a extensão .xlsx para .zip, abrir o arquivo zip e verificar todos os dados xml. É muito simples.

No entanto, quando você protege um arquivo do Excel 2007 com senha, o arquivo .zip (.xlsx) inteiro é realmente criptografado usando a criptografia RSA. Não é mais possível alterar a extensão para .zip e navegar pelo conteúdo do arquivo.


Então você precisa usar as ferramentas padrão de hackers com zip. Já não é um problema "como faço para fazer backup de um arquivo do excel".
Tipo anônimo

3
@ Tipo Anônimo: Eu acho que uma ferramenta de quebra de zíper não ajudará. Pelo que entendi Stewbob, não são as entradas de arquivo no arquivo zip que são criptografadas, mas todo o arquivo zip em si, que deve incluir o cabeçalho e o diretório central.
Treb

2
Apenas curioso: como poderia ser o RSA quando eu apenas digito uma senha (simétrica)?
Kizzx2

Que tal quando o arquivo em que você deseja entrar possui as teclas mais curtas? Continue criando documentos vba até obter um que possua 137?
onlynone

1
Você tem certeza de que todo o arquivo zip é criptografado quando você bloqueia o projeto VBA? Ainda posso abrir o arquivo zip e ver a estrutura do arquivo .... E a subpasta xl \ contém o arquivo vbaProject.bin que possui o conhecido bloco de hash "CMG = ... GC =".
Nigel Heffernan

63

Para um tipo de arquivo .xlsmou, .dotmvocê precisa fazer isso de uma maneira um pouco diferente.

  1. Mude a extensão do .xlsmarquivo para .zip.
  2. Abra o arquivo .zip (com WinZip ou WinRar etc) e vá para a pasta xl.
  3. Extraia o vbaProject.binarquivo e abra-o em um editor hexadecimal (eu uso o HxD , totalmente gratuito e leve.)
  4. Pesquise DPBe substitua porDPx e salve o arquivo.
  5. Substitua o antigo vbaProject.bin arquivo por este novo no arquivo compactado.
  6. Mude a extensão do arquivo de volta para .xlsm .
  7. Abra a pasta de trabalho, pule as mensagens de aviso.
  8. Abra o Visual Basic dentro do Excel.
  9. Vá para Ferramentas> Propriedades do VBAProject> Guia Proteção.
  10. Coloque uma nova senha e salve o .xlsm arquivo.
  11. Feche e abra novamente e sua nova senha funcionará.

8
Trabalhou no Excel 2016, Windows 10 de 64 bits. (xlsm files)
LimaNightHawk 11/11

3
Trabalhou no Word 2016, Windows 10 64 bits (arquivos dotm)
NBajanca 8/17

7
Ótima solução, funcionou para mim no Excel 2013 de 64 bits. Você pode pular a alteração das extensões de arquivo para .zipse o 7-Zip estiver instalado. Nesse caso, você pode simplesmente clicar com o botão direito do mouse no .xlsmarquivo e escolher "7-Zip -> Abrir arquivo"
nkatsar

funciona com o Word 2013, win7x64. (É muito triste, ser tão facilmente enganado por acreditar que o código é um pouco seguro).
Berry Tsakala

1
@ThierryMichel Combinação de soluções anteriores e tentativa e erro!
Matt

35

Vale ressaltar que, se você tiver um arquivo do Excel 2007 (xlsm), poderá simplesmente salvá-lo como um arquivo do Excel 2003 (xls) e usar os métodos descritos em outras respostas.


4
isso não é verdade, trabalhei com arquivos para os quais a conversão para xls / xla do xlsm era impossível, o Excel 2007 e 2010 travavam cada vez, tentava várias instâncias, a partir de uma mensagem de erro - Kod wyjątku: c0000005 Przesunięcie wyjątku: 005d211d
Qbik

4
SIM você pode fazer isso. Eu já fiz isso muitas vezes. Se houver algo nas folhas que é necessário e o que não é transferido para a versão mais antiga, faço isso: 1.converter .xlsm em .xls 2.decifrar o código de .xls 3.converter .xlsm em .xlsx 4.Coloque o código dos módulos em .xls em. xlsx e salve-o como .xlsm
ZygD

Funciona após a conversão de xlsm em xls, como na resposta.
Purus

32

Por minha vez, isso se baseia na excelente resposta de kaybee99, baseada na fantástica resposta de Thanc Thanh Nguyễn para permitir que esse método funcione com as versões x86 e amd64 do Office.

Uma visão geral do que foi alterado, evitamos push / ret, limitado a endereços de 32 bits, e substituí-lo por mov / jmp reg.

Testado e funciona em

Word / Excel 2016 - versão de 32 bits .
Word / Excel 2016 - versão de 64 bits .

como funciona

  1. Abra os arquivos que contêm seus projetos VBA bloqueados.
  2. Crie um novo arquivo com o mesmo tipo que o acima e armazene esse código no Módulo1

    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. Cole esse código no Módulo2 e execute-o

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

3
Perfeito! Trabalhe com o Windows Server 2016, Excel 2016 de 32 bits
Zin Min

Isso funcionou em um arquivo .xlsm no Excel Office 365. Obrigado!
Ryan James

Ainda funciona em 2019, compilações mais recentes do Office 365 64bits, caras incríveis!
XavierAM 6/11/19

Obrigado pelo código atualizado, eu estava enfrentando falhas executando a versão anterior (64 bits), mas tudo de bom com sua versão
emjaySX

Incrível ... Funcionou perfeitamente
Mahhdy 27/03

17

Você já tentou simplesmente abri-los no OpenOffice.org?

Eu tive um problema semelhante há algum tempo e descobri que o Excel e o Calc não entendiam a criptografia um do outro e, portanto, permitiam acesso direto a praticamente tudo.

Isso foi há um tempo atrás, então, se isso não foi apenas um acaso da minha parte, também pode ter sido corrigido.


15

No caso de seu bloco de CMG="XXXX"\r\nDPB="XXXXX"\r\nGC="XXXXXX" seu arquivo de 'senha conhecida' seja menor que o bloco existente no arquivo de 'senha desconhecida', preencha suas seqüências de caracteres hexadecimais com zeros à direita para atingir o comprimento correto.

por exemplo

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

no arquivo de senha desconhecida, deve ser definido como

CMG="XXXX00"\r\nDPB="XXXXX000"\r\nGC="XXXXXX0000" para preservar o comprimento do arquivo.

Também trabalhei com arquivos .XLA (formato 97/2003) no Office 2007.


1
Isso funciona, mas, como descobri recentemente (comentado acima), você também pode adicionar caracteres nulos após a citação final no bloco GC = "..." até atingir o mesmo comprimento.
tobriand

13

Para o Excel 2007 em diante, é necessário alterar a extensão do arquivo para .zip No arquivo morto, há uma subpasta xl, e você encontrará vbaProject.bin. Siga a etapa acima com vbaProject.bin e salve-o novamente no arquivo morto. Modifique de volta sua extensão e pronto! (ou seja, siga as etapas acima)


1
Posso confirmar que isso também funciona para arquivos .xlam no Excel 2010. +1!
Gimelist

12

As senhas do projeto VBA em documentos do Access, Excel, Powerpoint ou Word ( 2007, 2010, 2013 or 2016versões com extensões .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM) podem ser facilmente removidas .

É simplesmente uma questão de alterar a extensão do nome do arquivo para .ZIP, descompactar o arquivo e usar qualquer Editor Hex básico (como XVI32 ) para "quebrar" a senha existente, o que "confunde" o Office e solicita uma nova senha na próxima vez que o arquivo for aberto.

Um resumo das etapas:

  • renomeie o arquivo para que ele tenha uma .ZIPextensão.
  • abra o ZIPe vá para a XLpasta.
  • extraia vbaProject.bine abra-o com um editor hexadecimal
  • "Pesquisar e substituir" para "substituir tudo" mudando DPBpara DPX.
  • Salve as alterações, coloque o .binarquivo de volta no zip, retorne à sua extensão normal e abra o arquivo normalmente.
  • ALT + F11 para inserir o VB Editor e clique com o botão direito do mouse no Project Explorer para escolher VBA Project Properties .
  • Na Protectionguia, defina uma nova senha.
  • Clique em OKFechar o arquivo, abra-o novamente e pressione ALT + F11.
  • Digite a nova senha que você definiu.

Nesse ponto, você pode remover a senha completamente, se desejar.

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

É meio chocante que essa solução alternativa esteja disponível há anos, e a Microsoft não tenha corrigido o problema.


A moral da história?

Microsoft Office senhas projeto VBA são para não ser invocado para a segurança de qualquer informação sensível . Se a segurança for importante, use software de criptografia de terceiros.


9

Colin Pickard está mais correto, mas não confunda a proteção "senha para abrir" para o arquivo inteiro com a proteção por senha do VBA, que é completamente diferente da anterior e é a mesma para o Office 2003 e 2007 (para o Office 2007, renomeie o arquivo para .zip e procure o vbaProject.bin dentro do zip). E que tecnicamente a maneira correta de editar o arquivo é usar um visualizador de documentos compostos OLE como o CFX para abrir o fluxo correto. Obviamente, se você está apenas substituindo bytes, o editor binário antigo comum pode funcionar.

BTW, se você está se perguntando sobre o formato exato desses campos, eles o documentam agora:

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


2
O link a seguir fornece detalhes para os arquivos no formato XSLM. gbanik.blogspot.co.uk/2010/08/… A solução é igual à descrita por Yuhong Bao acima, mas facilita a leitura e inclui capturas de tela.
19412 JohnLBevan

7

Se o arquivo for um arquivo zip válido (os primeiros bytes são 50 4Busados ​​em formatos como .xlsm), descompacte o arquivo e procure o subarquivo xl/vbaProject.bin. Este é um arquivo CFB, assim como os .xlsarquivos. Siga as instruções para o formato XLS (aplicado ao subarquivo) e, em seguida, basta compactar o conteúdo.

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

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

com espaços em branco. Isso evita problemas de tamanho de contêiner CFB.


7

Eu tentei algumas das soluções acima e nenhuma delas funciona para mim (arquivo xlsm do Excel 2007). Então eu encontrei outra solução que até recupera a senha, não apenas a quebra.

Insira este código no módulo, execute-o e aguarde algum tempo. Ele recuperará sua senha com 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

1
Agradável! Eu acho que você conseguiu um voto negativo porque sua solução desbloqueia a planilha em vez do módulo VBA. No entanto, achei útil - então, obrigado!
precisa saber é o seguinte

1
Eu tenho este meu livro pessoal. Autores citados Bob McCormick como autor original mais tarde modificado por Norman Harker e JE McGimpsey 2002.
Charles Byrne

5

A ElcomSoft fabrica os produtos Advanced Office Password Breaker e Advanced Office Password Recovery que podem ser aplicados a esse caso, desde que o documento tenha sido criado no Office 2007 ou anterior.


4

Tom - cometi um erro de estudante inicialmente porque não assisti ao tamanho dos bytes e, em vez disso, copiei e colei do "CMG" configurado para a entrada subsequente. Porém, havia dois tamanhos de texto diferentes entre os dois arquivos, e eu perdi o projeto VBA exatamente como Stewbob avisou.

Usando o HxD, há um contador que controla a quantidade de arquivo que você está selecionando. Copiar a partir de CMG até o contador exibir 8F (hex para 143) e da mesma forma ao colar no arquivo bloqueado - acabei com o dobro do número de "..." no final da pasta, que parecia estranho de alguma forma e parecia quase antinatural, mas funcionou.

Não sei se é crucial, mas certifiquei-me de desligar o editor hexadecimal e o excel antes de reabrir o arquivo no Excel. Eu tive que percorrer os menus para abrir o Editor do VB, acessar as Propriedades do VBProject e inserir a 'nova' senha para desbloquear o código.

Eu espero que isso ajude.


4

Minha ferramenta, VbaDiff , lê o VBA diretamente do arquivo, para que você possa usá-lo para recuperar o código VBA protegido da maioria dos documentos do escritório sem recorrer a um editor hexadecimal.


Eu testei essa ferramenta e funciona muito bem, no entanto, a versão gratuita recupera as primeiras 53 linhas. Para recuperar meu arquivo, tive que seguir as instruções de Andy para desbloquear a senha. Em seguida, abri meu xlsm com o VbaDiff nos dois painéis e cliquei na folha com o meu código. Eu peguei com copiar e colar e coloquei no meu arquivo excel recuperado, mas com vba-empty.
thanos.a 27/04

2

A proteção é uma comparação simples de texto no Excel. Carregue o Excel no seu depurador favorito (o Ollydbg é a minha ferramenta de escolha), encontre o código que faz a comparação e o corrija para sempre retornar true, isso deve permitir o acesso às macros.


1

Para o Excel 2016 de 64 bits em uma máquina Windows 10, usei um editor hexadecimal para poder alterar a senha de um xla protegido (não testei isso para outras extensões). Gorjeta: crie um backup antes de fazer isso.

Os passos que tomei:

  1. Abra o vba no editor hexadecimal (por exemplo, XVI)
  2. Pesquise neste DPB
  3. Alterar DPB para outra coisa, como DPX
  4. Salve isso!
  5. Reabra o .xla, uma mensagem de erro será exibida, apenas continue.
  6. Agora você pode alterar a senha do .xla, abrindo as propriedades e vá para a guia senha.

Espero que isso tenha ajudado alguns de vocês!


Consegui abrir um .xls antigo usando isso no Windows 10 na versão mais recente do Excel 365, enquanto a resposta principal infelizmente não está mais funcionando. Eu baixei o HxD e mudei a última letra como recomendado, e pulei os erros. Tudo bem agora, obrigado!
Starnes Student

0

a extensão do seu arquivo excel mude para xml. E abra-o no bloco de notas. texto da senha localizado no arquivo xml.

você vê como abaixo da linha;

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

(desculpe pelo meu inglês ruim)


Você pode explicar como sua resposta é melhor do que as muito boas já fornecidas?
precisa

minha solução não tem um código. solução muito compacta que não seja.
Developer33

1
Esta solução que você forneceu não funciona em 2019.
Daniel L. Vandenbosch

Também não funciona para mim no escritório 365
thanos.a 27/04

0

Se você trabalha, Javapode tentar VBAMacroExtractor. Depois de extrair os scripts VBA, .xlsmencontrei a senha em texto sem formatação.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.