読者です 読者をやめる 読者になる 読者になる

Corredor

ウェブ、プログラミングの勉強メモ。

読み取り専用パスワードがかけられた Excel ブックを総当たりで開こうとしてみる

VBScript逆引き大全500の極意

VBScript逆引き大全500の極意

以前の記事で紹介したとおり、シートの保護やブックの保護パスワードに関しては突破する方法があるが、「読み取り専用パスワード」に関してはバイナリの書き換えなどで突破することができない。

neos21.hatenablog.com

そうなると、パスワードを突破するには、パスワード文字列を総当たりで生成してバンバンぶつけていくしかない。上の記事で紹介した Excel UnPassword というツールも、総当たりでパスワードを突破しようとするツールだ。

総当たり (ブルート・フォース) とは

総当たり攻撃(そうあたりこうげき)とは、暗号解読方法のひとつで、可能な組合せを全て試すやり方。力任せ攻撃、またはカタカナでブルートフォースアタック(英:Brute-force attack)とも呼ばれる。

つーわけで、例えば1文字で「0」「1」「2」…を試したら「00」「01」「02」…、「000」「001」…と、文字長と文字の組合せをバンバン作って試していく手法。

VBScript で作りました

Excel ブックを開く処理がやりやすいのは、Excel VBA か VBScript あたり。なんとなく VBScript で作ってみたのが、「Unlock Excel Book Password」である。

読み取り専用パスワードがかけられた Excel ブックを総当たりで開こうとする VBScript である。

上記の GitHub のページから、「Clone or Download」ボタンを押してもらうと、Zip ファイルでダウンロードできる。以下の使い方説明を見ながら設定して使っていただきたい。

以下、README.md の転載。

使い方

  • Unlock.bat 経由で Unlock.vbs を起動して使ってください。
  • 設定ファイル Property.txt に開きたいブックなどの情報を記載してください。
  • パスワードが解除できると、Unlocked.txt にパスワードを書き込みます。

Property.txt の書き方

  • [プロパティ名]=[値] の形式で記述します。イコール = の前後にスペースは付けないでください。
  • fileName= : 開きたいブック名をフルパスで書きます。
    例 : fileName=P:\UnlockExcelBookPassword\Sample.xlsx
  • min= : 探索するパスワード長の最小桁を指定します。
    例 : min=4 (4桁の組み合わせから始める)
  • max= : 探索するパスワード長の最大桁を指定します。
    例 : max=6 (6桁の組み合わせまで探索する)
  • strings= : 探索に使用する文字列をスペースなしカンマ区切りで指定します。
    例 : strings=0,1,2,3,4,5,6,7,8,9
  • progressStr= : 最後に探索した文字列を指定しておくと、次回起動時にこの文字列からレジュームして探索を再開します。任意設定項目なので、不要なら progressStr= と空にしておいてください。
    例 : progressStr=00200 (00200 という文字列から探索を再開する)

strings プロパティについて

探索に使用する文字列を指定できます。「hogefuga という文字列の組み合わせでパスワードを作ったと思うんだけど…」というように、ある程度使用している文字が推測できている場合は、

strings=h,o,g,e,f,u,a

というように指定すれば、これらの文字から総当たりで組み合わせの文字列を作成します。数字やその他のアルファベットなどが対象にならないので、探索時間を短縮できます。

progressStr プロパティについて

探索処理を再開するときにレジュームさせるための項目です。

例えば対象のパスワードが 00201 だったとして、数字のみの組み合わせで3桁目から探索しようとした場合は、以下のような設定項目で始めます。

min=3
max=6
strings=0,1,2,3,4,5,6,7,8,9
progressStr=

この状態でスクリプトを起動して探索を始めたものの、0900 の組み合わせ文字列を試したところでスクリプトを中断させたとします。その時は、設定ファイルを

progressStr=0900

と書き換えてスクリプトを起動することで、次回は 0901 からの組み合わせ文字列で探索を再開できます。3文字の場合の組み合わせはスキップし、4文字の場合の組み合わせも 00000900 までの組み合わせをスキップできます。

再起動するタイミングで strings プロパティは変えないようにしてください。正常にレジュームできなくなります。

サンプルファイルについて

Sample.xlsx00201 で開けるサンプルファイルです。中身は何もありませんし、スクリプト動作に必要なファイルでもありません。

同梱の Property.txt はこの Sample.xlsx を開くテイで記述しています。fileName= 部分のフルパスを各自の環境に合わせて修正して試してみてください。

README.md ココマデ。

ここからは内部の詳細について。

総当たりスクリプトの原型

上記ページの VBScript をベースに作り始めた。上記のコードは .vbs のみで完結しており、生成する文字列は ASCII コードで 0x20 ~ 0x7F の範囲を固定で試すというもの。

ついでに、以下にこのスクリプトの VBA 版がある。

便利機能のアレコレ

前述の Excel UnPassword が持ついくつかの機能のアイデアを拝借した。

  • 総当たりに使用する文字列を指定する機能
  • レジューム機能 (途中まで探索した文字列をメモしておけばその文字列から再開できる仕組み)
  • 解読できたパスワードをファイルに出力する機能

など。

このツールのマクロコードは読んだのだけど、ブックを開く処理を Workbook.Unprotect() で実装しており、VBScript にうまく移植できなかったので、Workbooks.Open() を使用している。そのせいか速度に若干難あり。Excel UnPassword の速度に敵わない。

課題

いずれも GitHub Issues に挙げてみた。

あんまりリッチな機能を盛り込むのは大変だけど、中断時に Excel.exe プロセスが残り続けてしまうのは、VBScript を書くときの全般的な悩み。なんかよい方法はないだろうか。

そもそも…パスワードは解読できたか?

8年ほど前にいなくなった担当者が残していった、パスワード付きのブックがあったので、このようなスクリプトを作ろうと思った次第。

パスワードは恐らく7~10文字程度で、大文字・小文字・記号混じりと思われ、日夜スクリプトを動かしているのだが、12時間で未だ7文字の組合せを実行中。なかなか総当たりは時間がかかる。これは無理かな~。