17

このコードは、かなりの数年前からネット上に出回っています。パスワードがわからない Excel スプレッドシートを解読するためのパスワードを提供できるようです。

http://www.theofficeexperts.com/VBASamples/Excel02.htm

これがどのように機能するかに興味がありますが、うまくいくようには見えません。私はそれがいくつかの方法で取得できる特定の値の下で暗号化されていると仮定しています(ネット上のいくつかの場所では、元のパスワードまたは機能する別のパスワードを提供すると言っています)公開鍵のようなものです- 1 つの秘密鍵ですべてが機能する 100 個の公開鍵を持つことができます。

私には、整数変数を作成し、それらに特定の数値を入力してから、その数値を関連する文字に変換しているように思えます。これらは常に同じではありませんか?もしそうなら、Excel保護のための「マスターパスワード」はありますか?

皆さんありがとう!

編集:私が投稿したサンプル コードでFor n = 32 To 126に気付きました。スペースからチルダまでのすべての文字のように見える ASCII テーブルとの相互参照。これは、構文のために私が理解していないある種の辞書攻撃ですか?

4

5 に答える 5

22
于 2012-10-12T04:36:38.237 に答える
11

編集 (2020) : Excel 2013 以降、明らかに保護スキームが変更されました。したがって、元の答えはもはや歴史的な意味しかありません。

新しい保護により、最先端の SHA-512 ハッシュを使用してパスワードを取得することがほぼ不可能になります。しかし、数秒で簡単に引き抜くことができるのであれば、なぜそれを壊す必要がありますか。

  • .xlsxまたは.xlsmファイルを解凍します
  • 編集xl/worksheets/sheet<num>.xml
  • <sheetProtection... />タグを検索して削除する
  • 保存して、もう一度圧縮して、お楽しみください

元の回答 (Excel 2010 まで)

魅力的 - コード スニペットは以前から知っていましたが、brettdj が投稿した説明は知りませんでした。他の人が説明したように、これはハッシュ衝突のブルートフォース検索です。実際には必要以上の作業を行うため、試行錯誤して作成されたようです (194560 の組み合わせが生成されますが、可能なハッシュ値は 32768 しかありません)。

Excel のハッシュ アルゴリズムの概要 ( http://chicago.sourceforge.net/devel/docs/excel/encrypt.htmlで説明):

  1. パスワードの各文字のアスキー コードを取得します。
  2. 16 ビットの符号付き数値として扱います。文字の位置に基づいてビットを左にシフトします (最初の文字は 1 ビット、2 番目の文字は 2 ビットなど)。
  3. すべての文字を一緒に XOR し、16 ビットの符号付き int >=0 を与えます。
  4. パスワードの長さとマジック ナンバーの XOR。

これを知っていれば、次のようにブルートフォース検索を考案できます。

  • 最上位ビットは常に 0 なので、テストするビットは 15 ビットあります。
  • それらをそれぞれ 5 ビットをカバーする 3 つのカウンターに分割します。そうすれば、各カウンターは印刷可能な ascii char を表すことができます。
  • これらのカウンターの ASCII 表現をパスワード文字列にパックして、相互に影響を与えないようにします。

最も簡単な方法は、11 文字のパスワードを使用し、カウンターを 1、6、および 11 の位置に配置することです。ステップ 2 のビットシフトにより、カウンター ビットが正しい方法で整列されます。つまり、最初のカウンター ("x") が 1 ビットシフトされます。 、2 番目 (「y」) 6 ビット、3 番目 (「z」) 11 ビット。ハッシュのビット単位の表現では、カウンターは次のビットに影響します。

bit: 76543210 76543210
cnt: -zzzzyyy yyxxxxxz

XOR 引数は常に一定であるため、XOR 演算は無視できます。同じ理由で、一定のオフセット (たとえば 64) を追加できます。また、他のパスワード バイト (2 ~ 5、7 ~ 10) で使用される文字は問題ではありません。

x、y、z のすべての可能な組み合わせを反復することにより、元のパスワードと同じハッシュ値を与えるパスワードが最終的に見つかります。

Public Sub demo()
    ' http://stackoverflow.com/questions/12852095/how-does-excels-worksheet-password-protection-work
    Dim x As Integer, y as Integer, z as Integer
    Dim part1 As String, part12 As String
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Worksheets(1)

    sh.Protect "$ome_Insanely_Long_and_c0mplex_password! [(which i$ imp*ssible t0 re-member)]"

    For x = 64 To 95
        ' pad with dots, so that x, y and z affect nonoverlapping bits of the hash.
        part1 = Chr(x) + "...."
        For y = 64 To 95
            part12 = part1 + Chr(y) + "...."
            For z = 64 To 95
                On Error Resume Next
                    sh.Unprotect part12 + Chr(z)
                    If Err.Number = 0 Then
                        Debug.Print "Password: '" & part12 + Chr(z) & "'"
                        Exit Sub
                    End If
                On Error GoTo 0
            Next
        Next
    Next
End Sub
于 2012-10-18T10:08:18.950 に答える
3

推測ですが、かなり狭い範囲の結果を生成し、保存されているハッシュ値と比較する何らかのハッシュ関数を実行して、パスワードが有効かどうかを Excel がテストしているように見えます。

おそらく、この関数が行っていることは、機能する値が見つかるまで、これらすべての値をテストすることです。使用された値から判断すると、ハッシュ関数は 2^11*(126-31) の異なる値を生成します。これらはすべて、このコードで生成された値によって生成できます。

私の分析では、このルーチンが機能すると想定しています。私はそれをテストしていません。

于 2012-10-12T04:20:41.820 に答える
0

このコードは、暗号化パスワード AAAAAAAAAAA(SPACE) から BBBBBBBBBBB(~) を使用してブルート フォース検索を行います。ここで、(SPACE) はスペース文字 (CHR(32)) であり、(~) はもちろん文字 126 です。パスワードが見つかったら、パスワードをメッセージ ボックスに表示します。

もちろん、これは、正確に 12 文字の長さで、大文字の A (ASCII 65) と B (ASCII 66) の後に印刷可能な ASCII 文字の 1 つが続くパスワードのみをチェックしていることを意味します。@mkingston は、2^11*(126-31) の異なる値をテストすることは正しいです。しかし、ハッシュ関数はありません。これで多くのスプレッドシートがクラックされるとは思いません。AccessData のこれらのプログラムのいずれかを使用することをお勧めします。

ActiveSheet.Protect と ActiveSheet.Unprotect の詳細については、http://msdn.microsoft.com/en-us/library/office/aa191957 (v=office.10).aspx を参照してください。

于 2012-10-12T04:26:03.113 に答える