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?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
À procura da versão 64 bits? Ver https://stackoverflow.com/a/31005696/4342479Excel 2007
Excel 2010
Excel 2013 - 32 bit version .
Excel 2016 - 32 bit version.
Como funciona
Vou tentar a minha é melhor explicar como funciona-por favor, desculpe o meu inglês.
- o VBE irá invocar uma função do sistema para criar a janela de senha.
- 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.
- Depois de a janela estar fechada, o VBE verifica o valor devolvido da função do sistema
- Se este valor for 1, o VBE vai "pensar" que a senha está certa, portanto o projecto VBA bloqueado será aberto.
- 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
- Abra os ficheiros que contêm os seus projectos VBA bloqueados
-
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
-
Colar este código em Module2 e executá-lo
Sub unprotected() If Hook Then MsgBox "VBA Project is unprotected!", vbInformation, "*****" End If End Sub
Volte para os seus projetos VBA e divirta-se.
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.
- crie um novo ficheiro excel simples.
- na VBA parte, defina uma senha simples (digamos - 1234).
- guarda o ficheiro e sai. Então verifica o tamanho do ficheiro.
- abra o ficheiro que acabou de criar com um editor hex.
-
Copiar as linhas a partir das seguintes teclas:
CMG=.... DPB=... GC=...
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.
- gravar o arquivo excel e sair. 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.
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.
- Faça uma cópia de segurança do ficheiro xls
- Abra o ficheiro num editor hexadecimal e localize a parte
DPB=...
- muda o texto de
DPB=...
paraDPx=...
- Abra o ficheiro xls no Excel
- Abra o editor de VBA (ALT + F11)
- a magia: O Excel descobre uma chave inválida (DPx) e pergunta se deseja continuar a carregar o projecto (ignorando basicamente a protecção)
- você será capaz de sobrepor a senha, por isso mude - a para algo de que se lembre
- grava o ficheiro xls * 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!
- Abra os ficheiros que contêm os seus projectos VBA bloqueados.
-
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
-
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.
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.
Para um tipo de ficheiro .xlsm
ou .dotm
, tem de o fazer de uma forma ligeiramente diferente.
- muda a extensão do ficheiro
.xlsm
para.zip
.
Abre a porta .arquivo zip (com WinZip ou WinRar etc) e ir para a pasta xl.
- extrai o ficheiro
vbaProject.bin
e abre-o num Editor Hex (eu uso HxD, completamente livre e leve.) - procura por
DPB
e substitui porDPx
e guarda o ficheiro. - substitua o ficheiro antigo
vbaProject.bin
por este novo em o ficheiro fechado. - muda a extensão do ficheiro de volta para
.xlsm
. - Um livro de trabalho aberto salta através das mensagens de aviso. Abre o Visual Basic dentro do Excel.
- ir para Tools > VBAProject Properties > Protection Tab.
- coloca uma nova senha e grava o ficheiro
.xlsm
.
Fecha e abre e a tua nova senha vai funcionar.
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.
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)
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
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.
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 pastaXL
. - extrair
vbaProject.bin
e abri-lo com um Editor Hex - "Procurar & Substituir "para" substituir tudo", mudando
DPB
paraDPX
. - 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.
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.
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.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.
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
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.
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.
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)
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:
- Abra a vba no editor Hexadecimal (por exemplo XVI)
- procura neste DPB
- mudar a DPB para outra coisa, como a DPX Poupa-me!
- reabra o .xla, uma mensagem de erro irá aparecer, apenas continuar.
- Agora você pode mudar a senha do .xla ao abrir as propriedades e ir para a página de senha.
Se trabalhar em {[0] } pode tentar VBAMacroExtractor
. Depois de extrair os programas de VBA de .xlsm
, encontrei uma senha no texto simples.