La seguridad de VBA es ampliamente considerada como bastante pobre. El código de VBA no está compilado, y la fuente está disponible en el archivo de Excel. La protección con contraseña es bastante fácil de eludir.
Según tengo entendido, Office 2003 y anteriores guardan el código vba como parte del formato binario de la hoja de trabajo (o documento/presentación). Cuando enciendes el IDE de VBA, simplemente busca ver si el código de VBA ha sido "protegido" o no. Esto no significa que esté encriptado, simplemente no está disponible para ver. La teoría es que esto evita que los usuarios se entrometan con su código, pero un codificador de núcleo duro podría evitar la contraseña.
Así que Excel no necesita desencriptar ningún código, solo necesita evitar que las personas lo vean.
Office 2007 does cifrar macros (no me pregunte cómo ni qué algoritmo). Esto es necesario, presumiblemente porque los archivos XLSM (o cualquier archivo de Office 2007) son solo archivos zip con una extensión diferente. Cualquiera puede entrar en esos archivos y husmear.
Para responder a su última pregunta, ¿cómo funciona la eliminación de contraseña en formatos anteriores de Office, no estoy del todo seguro. Diferentes proveedores posiblemente abordarán el problema de diferentes maneras, pero sospecho que el enfoque más común será un ataque de fuerza bruta contra las contraseñas hasta que se encuentre una coincidencia.
El objeto Excel VBProject tiene una propiedad de Protección que devolverá diferentes enumeraciones dependiendo del estado de protección de la macro (vbext_pp_locked
si la macro está protegida, por ejemplo). Si tuviera que seguir probando las contraseñas mediante programación hasta que el vbext_pp_locked
evaluado como falso, habría encontrado su contraseña.
Me pregunto si existe una opción en 2007 para almacenar solo el código de bytes para las macros dentro de un libro de trabajo, lo que le permite entregar funciones sin la fuente? – DaveParillo
Esa funcionalidad no está (AFAIK) integrada en ninguna versión de Office. Más bien, la expectativa es que si desea específicamente la automatización de un archivo de Office incluido, use las Herramientas de Visual Studio para Office (VSTO) para escribir su propia DLL y almacenarla como un complemento. –
FYI - Creé un xlsm (usando el convertidor disponible para 2003). Cambié la extensión xlsm a xip, descomprimí y miré dentro. Todo el VBA estaba dentro de un solo archivo 'vbaProject.bin'. En un editor hexadecimal, parece que se compila a partir de exactamente los mismos bloques BIFF de los que están hechos otros archivos de Excel. Todas las cadenas en las macros eran claramente visibles. Por lo tanto, no parece que el cifrado haya cambiado demasiado. – DaveParillo