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
Vou tentar o meu melhor para explicar como funciona - desculpe meu inglês.
O VBE chamará uma função do sistema para criar a caixa de diálogo de senha.
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.
Depois que a caixa de diálogo é fechada, o VBE verifica o valor retornado da função do sistema
se esse valor for 1, o VBE "pensará" que a senha está correta; portanto, o projeto VBA bloqueado será aberto.
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!
Abra o (s) arquivo (s) que contém seus projetos VBA bloqueados
Crie um novo arquivo xlsm e armazene esse código no Módulo1
code credited to Siwtom (nick name), a Vietnamese developer
@ 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:
Crie um novo arquivo excel simples.
Na parte VBA, defina uma senha simples (digamos - 1234).
Salve o arquivo e saia. Em seguida, verifique o tamanho do arquivo - veja a pegadinha de Stewbob
Abra o arquivo que você acabou de criar com um editor hexadecimal.
Copie as linhas começando com as seguintes chaves:
CMG=....
DPB=...
GC=...
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.
Salve o arquivo do Excel e saia.
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.
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.
Abra os arquivos que contêm seus projetos VBA bloqueados.
Crie um novo arquivo xlsm e armazene esse código no Módulo1
Option Explicit
PrivateConst PAGE_EXECUTE_READWRITE =&H40PrivateDeclare PtrSafe Sub MoveMemory Lib"kernel32"Alias"RtlMoveMemory" _
(Destination As LongPtr, Source As LongPtr,ByVal Length As LongPtr)PrivateDeclare PtrSafe Function VirtualProtect Lib"kernel32"(lpAddress As LongPtr, _
ByVal dwSize As LongPtr,ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr)As LongPtr
PrivateDeclare PtrSafe Function GetModuleHandleA Lib"kernel32"(ByVal lpModuleName AsString)As LongPtr
PrivateDeclare PtrSafe Function GetProcAddress Lib"kernel32"(ByVal hModule As LongPtr, _
ByVal lpProcName AsString)As LongPtr
PrivateDeclare 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)AsIntegerDim HookBytes(0To5)AsByteDim OriginBytes(0To5)AsByteDim pFunc As LongPtr
Dim Flag AsBooleanPrivateFunction GetPtr(ByVal Value As LongPtr)As LongPtr
GetPtr = Value
EndFunctionPublicSub RecoverBytes()If Flag Then MoveMemory ByVal pFunc,ByVal VarPtr(OriginBytes(0)),6EndSubPublicFunction Hook()AsBooleanDim TmpBytes(0To5)AsByteDim p As LongPtr
Dim OriginProtect As LongPtr
Hook =False
pFunc = GetProcAddress(GetModuleHandleA("user32.dll"),"DialogBoxParamA")If VirtualProtect(ByVal pFunc,6, PAGE_EXECUTE_READWRITE, OriginProtect)<>0Then
MoveMemory ByVal VarPtr(TmpBytes(0)),ByVal pFunc,6If TmpBytes(0)<>&H68Then
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 =TrueEndIfEndIfEndFunctionPrivateFunction MyDialogBoxParam(ByVal hInstance As LongPtr, _
ByVal pTemplateName As LongPtr,ByVal hWndParent As LongPtr, _
ByVal lpDialogFunc As LongPtr,ByVal dwInitParam As LongPtr)AsIntegerIf pTemplateName =4070Then
MyDialogBoxParam =1Else
RecoverBytes
MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
hWndParent, lpDialogFunc, dwInitParam)
Hook
EndIfEndFunction
Cole esse código no Módulo2 e execute-o
Sub unprotected()If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation,"*****"EndIfEndSub
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.
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.
Faça backup do arquivo xls
Abra o arquivo em um editor HEX e localize a DPB=...peça
Mude a DPB=...string paraDPx=...
Abra o arquivo xls no Excel
Abra o editor VBA ( ALT+ F11)
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)
Você poderá sobrescrever a senha, portanto altere-a para algo que você possa lembrar
Salve o arquivo xls *
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!
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.
Mude a extensão do .xlsmarquivo para .zip.
Abra o arquivo .zip (com WinZip ou WinRar etc) e vá para a pasta xl.
Extraia o vbaProject.binarquivo e abra-o em um editor hexadecimal (eu uso o HxD , totalmente gratuito e leve.)
Pesquise DPBe substitua porDPx e salve o arquivo.
Substitua o antigo vbaProject.bin arquivo por este novo no arquivo compactado.
Mude a extensão do arquivo de volta para .xlsm .
Abra a pasta de trabalho, pule as mensagens de aviso.
Abra o Visual Basic dentro do Excel.
Vá para Ferramentas> Propriedades do VBAProject> Guia Proteção.
Coloque uma nova senha e salve o .xlsm arquivo.
Feche e abra novamente e sua nova senha funcionará.
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.
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
Abra os arquivos que contêm seus projetos VBA bloqueados.
Crie um novo arquivo com o mesmo tipo que o acima e armazene esse código no Módulo1
Option Explicit
PrivateConst PAGE_EXECUTE_READWRITE =&H40PrivateDeclare PtrSafe Sub MoveMemory Lib"kernel32"Alias"RtlMoveMemory" _
(Destination As LongPtr, Source As LongPtr,ByVal Length As LongPtr)PrivateDeclare PtrSafe Function VirtualProtect Lib"kernel32"(lpAddress As LongPtr, _
ByVal dwSize As LongPtr,ByVal flNewProtect As LongPtr, lpflOldProtect As LongPtr)As LongPtr
PrivateDeclare PtrSafe Function GetModuleHandleA Lib"kernel32"(ByVal lpModuleName AsString)As LongPtr
PrivateDeclare PtrSafe Function GetProcAddress Lib"kernel32"(ByVal hModule As LongPtr, _
ByVal lpProcName AsString)As LongPtr
PrivateDeclare 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)AsIntegerDim HookBytes(0To11)AsByteDim OriginBytes(0To11)AsByteDim pFunc As LongPtr
Dim Flag AsBooleanPrivateFunction GetPtr(ByVal Value As LongPtr)As LongPtr
GetPtr = Value
EndFunctionPublicSub RecoverBytes()If Flag Then MoveMemory ByVal pFunc,ByVal VarPtr(OriginBytes(0)),12EndSubPublicFunction Hook()AsBooleanDim TmpBytes(0To11)AsByteDim p As LongPtr, osi AsByteDim OriginProtect As LongPtr
Hook =False#If Win64 Then
osi =1#Else
osi =0#EndIf
pFunc = GetProcAddress(GetModuleHandleA("user32.dll"),"DialogBoxParamA")If VirtualProtect(ByVal pFunc,12, PAGE_EXECUTE_READWRITE, OriginProtect)<>0Then
MoveMemory ByVal VarPtr(TmpBytes(0)),ByVal pFunc, osi+1If TmpBytes(osi)<>&HB8Then
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 =TrueEndIfEndIfEndFunctionPrivateFunction MyDialogBoxParam(ByVal hInstance As LongPtr, _
ByVal pTemplateName As LongPtr,ByVal hWndParent As LongPtr, _
ByVal lpDialogFunc As LongPtr,ByVal dwInitParam As LongPtr)AsIntegerIf pTemplateName =4070Then
MyDialogBoxParam =1Else
RecoverBytes
MyDialogBoxParam = DialogBoxParam(hInstance, pTemplateName, _
hWndParent, lpDialogFunc, dwInitParam)
Hook
EndIfEndFunction
Cole esse código no Módulo2 e execute-o
Sub unprotected()If Hook Then
MsgBox "VBA Project is unprotected!", vbInformation,"*****"EndIfEndSub
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.
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.
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)
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.
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:
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.
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 AsInteger, j AsInteger, k AsIntegerDim l AsInteger, m AsInteger, n AsIntegerDim i1 AsInteger, i2 AsInteger, i3 AsIntegerDim i4 AsInteger, i5 AsInteger, i6 AsIntegerOnErrorResumeNextFor i =65To66:For j =65To66:For k =65To66For l =65To66:For m =65To66:For i1 =65To66For i2 =65To66:For i3 =65To66:For i4 =65To66For i5 =65To66:For i6 =65To66:For n =32To126
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 =FalseThen
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)ExitSubEndIfNext:Next:Next:Next:Next:NextNext:Next:Next:Next:Next:NextEndSub
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.
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.
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.
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:
Abra o vba no editor hexadecimal (por exemplo, XVI)
Pesquise neste DPB
Alterar DPB para outra coisa, como DPX
Salve isso!
Reabra o .xla, uma mensagem de erro será exibida, apenas continue.
Agora você pode alterar a senha do .xla, abrindo as propriedades e vá para a guia senha.
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.
Respostas:
Você pode tentar essa
VBA
abordagem direta , que não requer edição HEX. Ele funcionará para qualquer arquivo (* .xls, * .xlsm, * .xlam ...).Testado e trabalha em:
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.
Usando o código
Faça backup dos seus arquivos primeiro!
Crie um novo arquivo xlsm e armazene esse código no Módulo1
code credited to Siwtom (nick name), a Vietnamese developer
Cole esse código no código acima no Módulo1 e execute-o
Volte para seus projetos VBA e aproveite.
fonte
Sim, desde que você esteja usando uma
.xls
planilha 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:
Copie as linhas começando com as seguintes chaves:
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.
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.
fonte
CMG...
sequência for maior que a original.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.
Crie um novo arquivo xlsm e armazene esse código no Módulo1
Cole esse código no Módulo2 e execute-o
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.
fonte
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.
DPB=...
peçaDPB=...
string paraDPx=...
* 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!
fonte
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.
fonte
Para um tipo de arquivo
.xlsm
ou,.dotm
você precisa fazer isso de uma maneira um pouco diferente..xlsm
arquivo para.zip
.vbaProject.bin
arquivo e abra-o em um editor hexadecimal (eu uso o HxD , totalmente gratuito e leve.)DPB
e substitua porDPx
e salve o arquivo.vbaProject.bin
arquivo por este novo no arquivo compactado..xlsm
..xlsm
arquivo.fonte
.zip
se o 7-Zip estiver instalado. Nesse caso, você pode simplesmente clicar com o botão direito do mouse no.xlsm
arquivo e escolher "7-Zip -> Abrir arquivo"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.
fonte
1.
converter .xlsm em .xls2.
decifrar o código de .xls3.
converter .xlsm em .xlsx4.
Coloque o código dos módulos em .xls em. xlsx e salve-o como .xlsmPor 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
como funciona
Crie um novo arquivo com o mesmo tipo que o acima e armazene esse código no Módulo1
Cole esse código no Módulo2 e execute-o
fonte
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.
fonte
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.
fonte
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)
fonte
As senhas do projeto VBA em documentos do Access, Excel, Powerpoint ou Word (
2007, 2010, 2013 or 2016
versõ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:
.ZIP
extensão.ZIP
e vá para aXL
pasta.vbaProject.bin
e abra-o com um editor hexadecimalDPB
paraDPX
..bin
arquivo de volta no zip, retorne à sua extensão normal e abra o arquivo normalmente.VBA Project Properties
.Protection
guia, defina uma nova senha.OK
Fechar o arquivo, abra-o novamente e pressione ALT + F11.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.
fonte
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
fonte
Se o arquivo for um arquivo zip válido (os primeiros bytes são
50 4B
usados em formatos como.xlsm
), descompacte o arquivo e procure o subarquivoxl/vbaProject.bin
. Este é um arquivo CFB, assim como os.xls
arquivos. 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 textocom espaços em branco. Isso evita problemas de tamanho de contêiner CFB.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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:
Espero que isso tenha ajudado alguns de vocês!
fonte
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;
(desculpe pelo meu inglês ruim)
fonte
Se você trabalha,
Java
pode tentarVBAMacroExtractor
. Depois de extrair os scripts VBA,.xlsm
encontrei a senha em texto sem formatação.fonte