Excel VBA代码的密码保护是如何工作的?

8
这个问题与我之前提出的一个问题相关,链接在这里:https://stackoverflow.com/questions/259663/vba-password-protection-how-it-works-is-it-secure-are-there-any-alternatives
您能否解释一下或提供有关Excel VBA代码密码保护在2007年之前版本中实际工作原理的说明? Excel 2007和早期版本在密码保护方面有什么区别?
此外,Excel的密码保护实际上是否加密了代码?如果代码被加密,Excel如何执行代码?
最后,Excel密码移除软件是如何工作的?
3个回答

14

VBA安全性被广泛认为相当差。VBA代码未编译,并且源码可以在Excel文件中找到。密码保护很容易被绕过。

据我了解,Office 2003及更早版本会将vba代码保存为工作表(或文档/演示文稿)的二进制格式的一部分。当您启动VBA IDE时,它只是查看VBA代码是否已“受保护”。这并不意味着它被加密-只是无法查看。理论上,这可以防止用户搞乱你的代码,但一个专业的编程人员可以绕过密码。

因此,Excel不需要解密任何代码-它只需要阻止人们查看它。

Office 2007确实加密宏(不要问我如何或使用什么算法)。这是必要的,可能是因为XLSM文件(或任何Office 2007文件)只是具有不同扩展名的zip文件。任何人都可以进入这些文件并查看。

回答您最后的问题-在旧版Office格式中如何去除密码,我不是完全确定。不同的供应商可能会采用不同的方法来处理这个问题,但我怀疑最常见的方法将是对密码进行暴力攻击,直到找到匹配项为止。

Excel VBProject对象具有保护属性,该属性将返回不同的枚举,具体取决于宏的保护状态(如果宏受保护,则为vbext_pp_locked,例如)。如果您以编程方式不断尝试密码,直到vbext_pp_locked评估为false,则已找到密码。


我想知道在2007年是否有选项可以仅存储工作簿中宏的字节码,从而使您能够提供无源代码的功能? - DaveParillo
那个功能(据我所知)并没有内置在任何版本的Office中。相反,期望是如果你特别想要为一个Office文件捆绑自动化,你会使用Visual Studio Tools for Office (VSTO)编写自己的DLL并将其存储为插件。 - Phil.Wheeler
3
FYI - 我创建了一个 xlsm 文件(使用2003可用的转换器)。将 xlsm 扩展名更改为 xip,解压并查看内部。所有的 VBA 代码都在单个文件 'vbaProject.bin' 中。在十六进制编辑器中,它似乎是由其他 Excel 文件所建立的完全相同的 BIFF 块构建而成的。宏中的所有字符串都是明文可见的。因此,看起来加密方式并没有发生太大变化。 - DaveParillo
@DaveParillo - 哦,谢谢你提供的信息。我原本以为这段代码是加密的,应该自己去核实一下。 - Phil.Wheeler

3
Phil说得没错 - 密码防止你查看模块,它们本身并没有加密。我知道在Excel 2007中,文件实际上是一个压缩的XML和其他文件集合,但我不知道加密处理的详细信息。对于早期版本 - Excel 2、3、4、5、95、97、2000、XP和2003,有全面的OpenOffice.org Microsoft Excel文件格式文档
BIFF(二进制交换文件格式)命名的Excel文件格式。它用于存储所有类型的文档:工作表文档、工作簿文档和工作区文档。这个文件格式有不同的版本,取决于编写该文件的Excel版本和文档类型。
带有多个工作表的工作簿文档(BIFF5-BIFF8)通常使用复合文档文件格式(也称为“OLE2存储文件格式”或“Microsoft Office兼容存储文件格式”)进行存储。它包含了不同类型数据的几个流。可以在此处找到关于复合文档文件格式的完整文档。
在大多数BIFF流中,工作簿保护块出现在DEFINEDNAME块(即已命名范围)之后,尽管BIFF8与此模式有很大不同。在Biff5 - Biff8中的记录保护块结构如下:
- WINDOWPROTECT窗口设置:1 = 受保护 - PROTECT工作簿内容:1 = 受保护 - PASSWORD密码的哈希值;0 = 没有密码 - PROT4REV共享工作簿:1 = 受保护 - PROT4REVPASS共享密码的哈希值;0 = 没有密码
密码块存储从工作表或工作簿保护密码计算出的16位哈希值。

-1

有人编写了一个有效的VBA代码,可以将所有Excel文件(包括.xlsm(2007+版本))的VBA保护密码更改为“macro”。您可以通过浏览他的代码来了解它的工作原理。

这是那个人的博客链接:http://lbeliarl.blogspot.com/2014/03/excel-removing-password-from-vba.html 这是执行此操作的文件链接:https://docs.google.com/file/d/0B6sFi5sSqEKbLUIwUTVhY3lWZE0/edit

以下内容摘自他博客的先前帖子:

对于Excel 2007/2010(.xlsm)文件,请执行以下步骤:

  1. 创建一个新的.xlsm文件。
  2. 在VBA部分,设置一个简单的密码(例如'macro')。
  3. 保存文件并退出。
  4. 更改文件扩展名为“.zip”,用任何档案解压缩程序打开它。
  5. 找到文件:“vbaProject.bin”(在'xl'文件夹中)。
  6. 从归档中提取出来。
  7. 用十六进制编辑器打开刚刚提取的文件。
  8. 在参数DPB中查找并复制值(引号中的值),例如: DPB=“282A84CBA1CBA1345FCCB154E20721DE77F7D2378D0EAC90427A22021A46E9CE6F17188A”。 (此值是为'macro'密码生成的。您可以使用此DPB值跳过步骤1-8)

  9. 对于未知密码的文件(要解锁的文件),执行步骤4-7。

  10. 在此文件中将DBP值更改为您在第8步中复制的值。

    如果复制的值比加密文件中的值短,则应使用0填充丢失的字符。如果值较长-那没问题(直接粘贴即可)。

  11. 保存'vbaProject.bin'文件并退出十六进制编辑器。

  12. 用修改后的文件替换现有的'vbaProject.bin'文件。
  13. 将扩展名从“.zip”更改回“.xlsm”
  14. 现在,打开您需要查看VBA代码的Excel文件。 VBA代码的密码将简单地为macro(如我所示的示例)。

1
这实际上并没有回答问题。 - GregRos
它并没有直接回答这个问题,但是如果那个提问者想要具体了解它的工作原理,他可以按照步骤和代码进行操作。 - Morosho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接