【问题标题】:How password protection of Excel VBA code works?Excel VBA 代码的密码保护如何工作?
【发布时间】:2014-03-29 06:08:25
【问题描述】:

这个问题与my previous one有关。

您能否解释或提供解释 Excel VBA 代码密码保护在 2007 年之前的版本中的实际工作原理的链接? Excel 2007 和以前的版本在密码保护方面有什么区别?

Excel 的密码保护是否真的加密了代码?加密后Excel如何执行代码?

最后,excel密码删除软件是如何工作的?

【问题讨论】:

    标签: security vba excel password-protection


    【解决方案1】:

    VBA 安全性被广泛认为很差。 VBA 代码未编译,源代码在 excel 文件中可用。密码保护很容易绕过。

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

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

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

    要回答您的最后一个问题 - 密码删除对旧版 Office 格式有何作用,我不完全确定。不同的供应商可能会以不同的方式解决这个问题,但我怀疑最常见的方法是对密码进行暴力攻击,直到找到匹配项。

    Excel VBProject 对象有一个 Protection 属性,该属性将根据宏的保护状态返回不同的枚举(例如,vbext_pp_locked,如果宏受到保护)。如果您继续以编程方式尝试密码,直到 vbext_pp_locked 评估为 false,您就会找到您的密码。

    【讨论】:

    • 我想知道 2007 年是否有一个选项可以在工作簿中只存储宏的字节码,从而允许您在没有源的情况下交付功能?
    • 该功能并未 (AFAIK) 融入任何版本的 Office。相反,如果您特别希望捆绑 Office 文件的自动化,您将使用 Visual Studio Tools for Office (VSTO) 编写自己的 DLL 并将其存储为加载项。
    • 仅供参考 - 我创建了一个 xlsm(使用 2003 年可用的转换器)。将 xlsm 扩展名更改为 xip,解压缩并查看内部。所有的 VBA 都在一个文件“vbaProject.bin”中。在十六进制编辑器中,它似乎是由与其他 excel 文件所用的完全相同的 BIFF 块构建的。宏中的所有字符串都清晰可见。所以看起来加密没有太大变化。
    • @DaveParillo - 嗯。感谢那。我被引导相信代码是加密的。可能应该自己检查一下。
    【解决方案2】:

    Phil 是正确的 - 密码会阻止您查看模块,它们本身并没有加密。我知道在 excel 2007 中,文件本质上是 XML 和其他文件的压缩集合,但我不知道如何处理加密的细节。对于早期版本 - excel 2、3、4、5、95、97、2000、XP 和 2003,有综合OpenOffice.org's Documentation of the Microsoft Excel File Format

    Excel 文件格式被命名为 BIFF(二进制交换文件格式)。它用于存储所有类型的文档:工作表文档、工作簿文档和工作区文档。此文件格式有不同的版本,具体取决于写入文件的 Excel 版本以及文档类型。

    多张工作簿文档 (BIFF5-BIFF8) 通常使用复合文档文件格式(也称为“OLE2 存储文件格式”或“Microsoft Office 兼容存储文件格式”)进行存储。它包含用于不同类型数据的多个流。复合文档文件格式的完整文档可以在here找到。

    在大多数 BIFF 流中,工作簿保护块发生在 DEFINEDNAME 块(即命名范围)之后,尽管 BIFF8 与该模式有很大不同。记录保护块 Biff5 - Biff8 中工作簿保护块的结构:

    • WINDOWPROTECT 窗口设置:1 = 受保护
    • 保护工作簿内容:1 = 受保护
    • PASSWORD 密码的哈希值; 0 = 无密码
    • PROT4REV 共享工作簿:1 = 受保护
    • PROT4REVPASS 共享密码的哈希值; 0 = 无密码

    密码块存储一个 16 位哈希值,根据工作表或工作簿保护密码计算得出。

    【讨论】:

      【解决方案3】:

      有人制作了一个有效的 vba 代码,将所有 excel 文件的 vba 保护密码更改为“宏”,包括 .xlsm(2007+ 版本)。你可以通过浏览他的代码来了解它是如何工作的。

      这是这个家伙的博客: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"。 (此值是为“宏”密码生成的。您可以使用此 DPB 值跳过步骤 1-8)

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

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

        如果复制的值比加密文件中的短,您应该用 0(零)填充缺失的字符。如果值更长 - 这不是问题(按原样粘贴)。

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

      12. 用修改后的文件替换现有的“vbaProject.bin”文件。
      13. 将扩展名从“.zip”改回“.xlsm”
      14. 现在,打开需要查看 VBA 代码的 excel 文件。VBA 代码的密码 将只是宏(如我在这里展示的示例)。

      【讨论】:

      • 这实际上并不能回答问题。
      • 它没有直接回答,但提问的人如果想具体了解它是如何工作的,可以按照步骤和代码进行操作。
      猜你喜欢
      • 2019-05-27
      • 1970-01-01
      • 2017-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多