1

我正在创建一个程序,用于帮助我的客户恢复放置在 Word 和 Excel 等办公文档中的密码。该程序运行良好,但比您可以免费下载的类似产品慢得多。我想使用我自己的程序,因为我觉得你免费下载的很多程序并不完全安全,并且缺少一些我想要的控件。

更重要的是......我需要帮助弄清楚为什么我的程序这么慢。我用一个简单的 3 个字母密码“TFX”创建了一个 Excel 文档。我下载的程序找到密码的速度几乎与单击“开始”后松开鼠标按钮的速度一样快。我的程序需要 10 分钟。这是 3 个字符的循环:

  private string ThreeCharPass(string file, Microsoft.Office.Interop.Excel.Application exApp, char[] combarr)
    {
        for (int three = 0; three < combarr.Length; three++)
        {
            for (int two = 0; two < combarr.Length; two++)
            {
                for (int one = 0; one < combarr.Length; one++)
                {
                    try
                    {
                        string pass = combarr[three].ToString() + combarr[two].ToString() + combarr[one].ToString();
                        exApp.Workbooks.Open(file, false, true, Type.Missing, pass, Type.Missing, true, Type.Missing, Type.Missing, false, false, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
                        return pass;
                    }
                    catch
                    {
                    }
                }
            }
        }
        return string.Empty;
    }

数组“combarr”是一个字符数组,包含密码中所有可能的字符。它是根据用户选择的选项在程序的早期生成的。我认为问题必须出在我循环数组以创建密码组合的方式上,因为仅在这种 3 个字符的密码方法中,它花费超过 5 分钟,而其他“专业”程序花费几秒钟。任何反馈将不胜感激!!

4

3 回答 3

6

您可以对代码进行一些小的优化,但最可能的罪魁祸首是exApp.Workbooks.Open调用。我认为该调用非常慢,但是您可以使用分析器对其进行测试。

其他工具所做的是读取实际的文档结构(DOC、DOCX 格式)并确定密码是否正确,这与 Word 试图找出密码的方式完全相同。我不知道确切的细节,但很可能有一种方法可以让 Word 知道密码是正确的。一个例子可能是一个唯一的字符串,当正确解密时,它具有预期值;或加起来的校验和。当您知道格式的规范时,您可以自己进行测试,从而节省昂贵的互操作调用。

此页面包含有关许多 Microsoft Office 格式的详细信息。实现这些规范的一部分需要做很多工作,但它肯定会加快速度。只有在删除了互操作调用后,您才能了解更高效的循环、多线程和其他策略。

请注意,Office 格式是专有的,因此并非所有信息都可用、完整、最新或可靠。

于 2012-08-14T18:43:22.443 回答
1

对于 .docx 文档,有一种更简单的方法。

  1. 将扩展名重命名为 .zip,
  2. 进入文件,在那里你找到文件夹“word”
  3. 在这里你删除“settings.xml”
  4. 现在关闭文件夹,将文件重命名为 .docx。

完成的。在http://www.nextofwindows.com/how-to-remove-password-from-protected-word-file-in-word-2007-and-2010上找到

对于 Excel 有一个非常相似的方法,但它涉及更多的工作

  1. 将扩展名重命名为 .zip,
  2. 进入文件,在那里你找到文件夹“xl”,然后在该文件夹下找到“工作表”
  3. 应该有一个或多个文件,名称如下:sheet1.xml(sheet2.xml 等)。其中一个文件内部是一个 XML 标记:< sheetProtection password=... />。删除整个 XML 标记。
  4. 现在关闭文件夹,将文件重命名为 .xlsx 或 .xlsm(如果它是启用宏的工作簿)。

在http://blog.bitcollectors.com/adam/2011/10/how-to-unprotect-a-password-protected-xlsx-file/上找到

或者,以下方法对我来说效果很好.. http://www.instructables.com/id/VBA-Code-To-Unlock-A-Locked-Excel-Sheet/

祝你好运!

于 2016-02-17T17:14:44.527 回答
0

完全错误的做法。

  1. 多线程
  2. 除非您知道特定的密码长度并且它是随机/安全的(很少有用户选择真正随机的密码),否则您可能会使用字典攻击和/或彩虹表做得更好
  3. 对于像 Excel 这样常见的东西,我首先会查找有关算法/弱点的已知信息,以确定密码长度以及 Excel 如何实际解密/解锁文件。
  4. 直接使用 API 测试您的密码可能会很慢。最好在某个位置找到一个已知值并对其进行处理。如果使用#3,您可以确定 Excel 如何解密/解锁文件,您可以在自己的代码中复制它,以与调用 Excel 方法时自身的互操作开销一样快。

话虽这么说,你真的应该这样做吗?

于 2012-08-14T18:51:55.953 回答