quitar proyectos proyecto protegidos por online desproteger desbloquear cómo contraseña archivo apertura excel vba excel-vba passwords

proyectos - ¿Hay alguna manera de descifrar la contraseña en un proyecto de Excel VBA?



quitar contraseña excel 2016 (21)

¿Has intentado simplemente abrirlos en OpenOffice.org?

Hace un tiempo tuve un problema similar y descubrí que Excel y Calc no entendían el cifrado de los demás y permitían el acceso directo a casi todo.

Esto fue hace un tiempo, así que si no fue solo una casualidad de mi parte, también puede haber sido parcheado.

Me han pedido que actualice algunas macros de Excel 2003, pero los proyectos de VBA están protegidos por contraseña, y parece que hay una falta de documentación ... nadie conoce las contraseñas.

¿Hay alguna forma de eliminar o descifrar la contraseña en un proyecto de VBA?


Colin Pickard es en su mayoría correcto, pero no confunda la protección de "contraseña para abrir" para todo el archivo con la protección de contraseña VBA, que es completamente diferente a la anterior y es la misma para Office 2003 y 2007 (para Office 2007, cambie el nombre el archivo a .zip y busque el vbaProject.bin dentro del zip). Y técnicamente, la forma correcta de editar el archivo es utilizar un visor de documentos compuestos OLE como CFX para abrir la secuencia correcta. Por supuesto, si solo está reemplazando bytes, el editor binario tradicional puede funcionar.

Por cierto, si se está preguntando sobre el formato exacto de estos campos, ahora lo tienen documentado:

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


Colin Pickard tiene una excelente respuesta, pero hay un ''cuidado'' con esto. Hay instancias (todavía no he descubierto la causa) en las que la longitud total de la entrada "CMG = ........ GC = ...." en el archivo es diferente de un archivo de Excel al de siguiente. En algunos casos, esta entrada será de 137 bytes, y en otros será de 143 bytes. La longitud de 137 bytes es la impar, y si esto sucede cuando crea su archivo con la contraseña ''1234'', simplemente cree otro archivo y debería saltar a la longitud de 143 bytes.

Si intenta pegar el número incorrecto de bytes en el archivo, perderá su proyecto VBA cuando intente abrir el archivo con Excel.

EDITAR

Esto no es válido para los archivos de Excel 2007/2010. El formato de archivo .xlsx estándar es en realidad un archivo .zip que contiene numerosas subcarpetas con el formato, diseño, contenido, etc., almacenado como datos xml. Para un archivo de Excel 2007 no protegido, simplemente puede cambiar la extensión .xlsx a .zip, luego abrir el archivo zip y revisar todos los datos XML. Es muy sencillo.

Sin embargo, cuando protege con contraseña un archivo de Excel 2007, todo el archivo .zip (.xlsx) está encriptado utilizando el cifrado RSA. Ya no es posible cambiar la extensión a .zip y navegar por el contenido del archivo.


En el caso de que su bloque de CMG="XXXX"/r/nDPB="XXXXX"/r/nGC="XXXXXX" en su archivo de ''contraseña conocida'' sea más corto que el bloque existente en el archivo de ''contraseña desconocida'', pad tus cadenas hexagonales con ceros al final para alcanzar la longitud correcta.

p.ej

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

en el archivo de contraseña desconocida, se debe establecer en

CMG="XXXX00"/r/nDPB="XXXXX000"/r/nGC="XXXXXX0000" para conservar la longitud del archivo.

También he tenido este trabajo con archivos .XLA (formato 97/2003) en Office 2007.


Hay otra solución (algo más fácil), sin los problemas de tamaño. Utilicé este enfoque hoy (en un archivo XLS 2003, usando Excel 2007) y tuve éxito.

  1. Copia de seguridad del archivo xls
  2. Abra el archivo en un editor HEX y localice la parte DPB=...
  3. Cambie la cadena DPB=... a DPx=...
  4. Abra el archivo xls en Excel
  5. Abra el editor de VBA ( ALT + F11 )
  6. the magic: Excel descubre una clave no válida (DPx) y le pregunta si desea continuar cargando el proyecto (básicamente ignorando la protección)
  7. Podrá sobrescribir la contraseña, así que cámbiela por algo que pueda recordar
  8. Guarde el archivo xls *
  9. ¡Cierra y vuelve a abrir el documento y trabaja tu magia VBA!

* NOTA: Asegúrese de haber cambiado la contraseña a un nuevo valor, de lo contrario, la próxima vez que abra la hoja de cálculo, Excel informará de errores (Error Inesperado), luego, cuando acceda a la lista de módulos VBA, ahora verá los nombres de los módulos de origen, pero recibe otro error al intentar abrir formularios / código / etc. Para remediar esto, vuelva a las propiedades del proyecto VBA y establezca la contraseña en un nuevo valor. Guarde y vuelva a abrir el documento de Excel y debería estar listo para comenzar.


La protección es una simple comparación de texto en Excel. Cargue Excel en su depurador favorito ( Ollydbg es mi herramienta preferida), encuentre el código que hace la comparación y corríjalo para que siempre sea verdadero, esto le permitirá acceder a las macros.


Las contraseñas del proyecto VBA en documentos de Access, Excel, Powerpoint o Word (versiones 2007, 2010, 2013 or 2016 con extensiones .ACCDB .XLSM .XLTM .DOCM .DOTM .POTM .PPSM ) se pueden eliminar fácilmente .

Es simplemente una cuestión de cambiar la extensión del nombre de archivo a .ZIP , descomprimir el archivo y usar cualquier editor hexadecimal básico (como XVI32 ) para "romper" la contraseña existente, lo que "confunde" a Office para que solicite una nueva contraseña la próxima vez que archivo está abierto.

Un resumen de los pasos:

  • cambia el nombre del archivo para que tenga la extensión .ZIP .
  • Abre el ZIP y ve a la carpeta XL .
  • extrae vbaProject.bin y vbaProject.bin con un editor hexadecimal
  • "Buscar y reemplazar" para "reemplazar todos" cambiando de DPB a DPX .
  • Guarde los cambios, coloque el archivo .bin nuevo en el archivo zip, devuélvalo a su extensión normal y abra el archivo como de costumbre.
  • ALT + F11 para ingresar al Editor VB y hacer clic con el botón derecho en el Explorador de proyectos para elegir las VBA Project Properties .
  • En la pestaña Protection , establecer una nueva contraseña.
  • Haga clic en OK , cierre el archivo, vuelva a abrirlo, presione ALT + F11.
  • Ingrese la nueva contraseña que estableció.

En este punto, puede eliminar la contraseña completamente si lo desea.

Las instrucciones completas con un video paso a paso que hice " hace mucho tiempo" están aquí en YouTube .

Es un poco sorprendente que esta solución haya existido durante años, y Microsoft no haya solucionado el problema.

La moraleja de la historia?

No se debe confiar en las contraseñas de Microsoft Office VBA Project para la seguridad de cualquier información confidencial . Si la seguridad es importante, utilice software de cifrado de terceros.


Me he basado en la fantástica respuesta de Đức Thanh Nguyễn para permitir que este método funcione con versiones de Excel de 64 bits. Estoy ejecutando Excel 2010 de 64 bits en Windows 7 de 64 bits.

  1. Abra los archivos que contienen sus proyectos VBA bloqueados.
  2. Cree un nuevo archivo xlsm y almacene este código en 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. Pega este código en Module2 y ejecútalo.

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

DESCARGO DE RESPONSABILIDAD Esto funcionó para mí y lo he documentado aquí con la esperanza de que ayude a alguien. No lo he probado completamente . Asegúrese de guardar todos los archivos abiertos antes de continuar con esta opción.


Mi herramienta, VbaDiff , lee VBA directamente desde el archivo, por lo que puede usarlo para recuperar el código VBA protegido de la mayoría de los documentos de oficina sin tener que recurrir a un editor hexadecimal.


Para Excel 2007 en adelante necesita cambiar su extensión de archivo a .zip En el archivo hay una subcarpeta xl, allí encontrará vbaProject.bin. Siga el paso anterior con vbaProject.bin y luego vuelva a guardarlo en el archivo. ¡Modifica de nuevo tu extensión y voilà! (es decir, siga los pasos anteriores)


Para Excel 2016 de 64 bits en una máquina con Windows 10, he usado un editor hexadecimal para poder cambiar la contraseña de una xla protegida (no he probado esto para ninguna otra extensión). Sugerencia: cree una copia de seguridad antes de hacer esto.

Los pasos que tomé:

  1. Abra la vba en el editor hexadecimal (por ejemplo, XVI)
  2. Buscar en este DPB
  3. Cambiar DPB a otra cosa, como DPX
  4. Guardalo
  5. Vuelva a abrir el .xla, aparecerá un mensaje de error, simplemente continúe.
  6. Ahora puede cambiar la contraseña de .xla abriendo las propiedades y dirigiéndose a la pestaña de contraseña.

Espero que esto haya ayudado a algunos de ustedes!


Para un tipo de archivo .xlsm o .dotm , debe hacerlo de una manera ligeramente diferente.

  1. Cambie la extensión del archivo .xlsm a .zip .
  2. Abra el archivo .zip (con WinZip o WinRar, etc.) y vaya a la carpeta xl.
  3. Extraiga el archivo vbaProject.bin y ábralo en un Editor Hex (Yo uso HxD , es completamente gratis y liviano).
  4. Busque DPB y sustitúyalo por DPx y guarde el archivo.
  5. Reemplace el antiguo archivo vbaProject.bin con este nuevo en el archivo comprimido.
  6. Cambie la extensión del archivo de nuevo a .xlsm .
  7. Abrir libro de trabajo saltar a través de los mensajes de advertencia.
  8. Abre Visual Basic dentro de Excel.
  9. Vaya a Herramientas> Propiedades de proyecto VBAP> Ficha Protección.
  10. Introduzca una nueva contraseña y guarde el archivo .xlsm .
  11. Cierra y vuelve a abrir y tu nueva contraseña funcionará.

Probé algunas de las soluciones anteriores y ninguna de ellas me funciona (archivo Excel 2007 xlsm). Luego encontré otra solución que incluso recupera la contraseña, no solo la descifra.

Inserta este código en el módulo, ejecútalo y dale algo de tiempo. Recuperará tu contraseña por fuerza 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


Sí, siempre que esté utilizando una hoja de cálculo con formato .xls (el valor predeterminado para Excel hasta 2003). Para Excel 2007 en adelante, el valor predeterminado es .xlsx , que es un formato bastante seguro, y este método no funcionará.

Como dice Treb, es una comparación simple. Un método es simplemente intercambiar la entrada de la contraseña en el archivo utilizando un editor hexadecimal (consulte los editores Hex para Windows ). Ejemplo paso a paso:

  1. Crear un nuevo archivo de Excel simple.
  2. En la parte VBA, establezca una contraseña simple (por ejemplo, 1234).
  3. Guarda el archivo y cierra. A continuación, compruebe el tamaño del archivo - ver Stechabob''s gotcha
  4. Abra el archivo que acaba de crear con un editor hexadecimal.
  5. Copia las líneas que comienzan con las siguientes teclas:

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

  6. Primero respalde el archivo de Excel para el que no conoce la contraseña de VBA, luego ábralo con su editor hexadecimal y pegue las líneas copiadas de arriba del archivo ficticio.

  7. Guarde el archivo excel y salga.
  8. Ahora, abra el archivo de Excel en el que necesita ver el código de VBA. La contraseña para el código de VBA será simplemente 1234 (como en el ejemplo que se muestra aquí).

Si necesita trabajar con Excel 2007 o 2010, a continuación hay algunas otras respuestas que pueden ser de ayuda, en particular las siguientes: 1 , 2 , 3 .

EDITAR en febrero de 2015: para otro método que parece muy prometedor, vea esta nueva respuesta de Đức Thanh Nguyễn.


Si el archivo es un archivo zip válido (los primeros bytes son 50 4B , utilizados en formatos como .xlsm ), descomprima el archivo y busque el subfile xl/vbaProject.bin . Este es un archivo CFB al igual que los archivos .xls . Siga las instrucciones para el formato XLS (aplicado al subarchivo) y luego simplemente zip el contenido.

Para el formato XLS, puede seguir algunos de los otros métodos en esta publicación. Personalmente prefiero buscar el bloque DPB= y reemplazar el texto

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

con espacios en blanco. Esto obvia problemas de tamaño de contenedor CFB.


Si trabajas en Java puedes probar VBAMacroExtractor . Después de extraer los scripts de VBA de .xlsm , encontré la contraseña en texto sin formato.


Tom: Cometí un error de colegial al principio, ya que no observaba el tamaño del byte y, en cambio, copié y pegué la configuración "CMG" en la entrada posterior. Sin embargo, estos eran dos tamaños de texto diferentes entre los dos archivos, y perdí el proyecto VBA justo cuando Stewbob advirtió.

Usando HxD, hay un contador que registra la cantidad de archivos que está seleccionando. Copie desde CMG hasta que el contador muestre 8F (hexadecimal de 143) y de la misma manera al pegar en el archivo bloqueado: terminé con el doble de "..." al final de la pegada, que parecía extraño de alguna manera y casi se sentía antinatural, pero funcionó.

No sé si es crucial, pero me aseguré de cerrar el editor hexadecimal y sobresalir antes de volver a abrir el archivo en Excel. Luego tuve que ir a través de los menús para abrir el Editor VB, a VBProject Properties e ingresé la contraseña "nueva" para desbloquear el código.

Espero que esto ayude.


Vale la pena señalar que si tiene un archivo de Excel 2007 (xlsm), simplemente puede guardarlo como un archivo de Excel 2003 (xls) y usar los métodos descritos en otras respuestas.


la extensión de su archivo de Excel cambia a xml. Y abrirlo en el bloc de notas. Búsqueda de texto de contraseña en archivo xml.

ves como debajo de la línea;

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

(Perdón por mi mal ingles)


ElcomSoft fabrica productos Advanced Office Password Breaker y Advanced Office Password Recovery que pueden aplicarse a este caso, siempre y cuando el documento se haya creado en Office 2007 o anterior.


Puede probar este enfoque directo de VBA que no requiere edición HEX. Funcionará para cualquier archivo (* .xls, * .xlsm, * .xlam ...).

Probado y trabaja en

Excel 2007
Excel 2010
Excel 2013 - versión de 32 bits .
Excel 2016 - versión de 32 bits .

Buscando la versión de 64 bits? Consulte https://.com/a/31005696/4342479

cómo funciona

Haré todo lo posible para explicar cómo funciona, por favor, disculpe mi inglés.

  1. El VBE llamará a una función del sistema para crear el cuadro de diálogo de contraseña.
  2. Si el usuario ingresa la contraseña correcta y hace clic en Aceptar, esta función devuelve 1. Si el usuario ingresa la contraseña incorrecta o hace clic en Cancelar, esta función devuelve 0.
  3. Una vez cerrado el cuadro de diálogo, el VBE verifica el valor devuelto de la función del sistema
  4. si este valor es 1, el VBE "pensará" que la contraseña es correcta, por lo tanto, el proyecto VBA bloqueado se abrirá.
  5. El siguiente código intercambia la memoria de la función original utilizada para mostrar el cuadro de diálogo de contraseña con una función definida por el usuario que siempre devolverá 1 cuando se le llame.

usando el código

  1. Abra los archivos que contienen sus proyectos VBA bloqueados
  2. Cree un nuevo archivo xlsm y almacene este código en 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. Pega este código en Module2 y ejecútalo.

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

  4. Vuelve a tus proyectos VBA y disfruta.