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がパスワードが正しいことを知る方法がある可能性が非常に高いです。例としては、正しく復号化されたときに期待値を持つ一意の文字列があります。または合計するチェックサム。フォーマットの仕様がわかっている場合は、自分でテストを行うことができ、費用のかかる相互運用機能の呼び出しを節約できます。

このページには、多くのMicrosoftOffice形式に関する詳細情報があります。これらの仕様の一部を実装するのは大変な作業ですが、確実にスピードアップします。相互運用機能の呼び出しを削除して初めて、より効率的なループ、マルチスレッド、およびその他の戦略を確認できます。

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」フォルダがあり、その下に「worksheets」フォルダがあります。
  3. sheet1.xml(sheet2.xmlなど)のような名前のファイルが1つ以上あるはずです。これらのファイルの1つの中には、XMLタグがあります:<sheetProtectionpassword=…/>。その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 に答える